广告
返回顶部
首页 > 资讯 > 后端开发 > Python >python iterator(迭代器)
  • 780
分享到

python iterator(迭代器)

迭代pythoniterator 2023-01-31 00:01:55 780人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

迭代:重复做一件事iterable(可迭代)对象:支持“每次仅返回自身所包含的其中一个元素”的对象iterable对象实现了__iter__方法     序列类型,如:list、str、tuple     非序列类型,如:dict、file

迭代:重复做一件事
iterable(可迭代)对象:支持“每次仅返回自身所包含的其中一个元素”的对象
iterable对象实现了__iter__方法
    序列类型,如:list、str、tuple
    非序列类型,如:dict、file
    用户自定义的一些包含了__iter__()或__getitem__方法的类      
    用dir(object)时,只要有__iter__()方法或__getitem__方法都是iterable对象。
    object.__iter__()   每运行一次,都返回一个迭代器对象的内存地址
    例:i1=list1.__iter__()       返回一个迭代器对象
           i1.next()
           i1.next()
           ....
           
迭代器(iterator)
    迭代器又称为游标(cursor),它是程序设计的软件设计模式,是一种可在容器物件(container)上实现元素遍历的接口。
    迭代器是一种特殊的数据结构,当然在python中,它也是以对象的形式存在的。简单理解方式:对于一个集体中的每一个元素,想要执行遍历,那么针对这个集体的迭代器就定义了遍历该集体中每一个元素的顺序或方法。
    迭代器本身是不可逆的。
    可以使用一个“可迭代对象”的__iter__()方法生成一个“迭代器对象”
           In [31]: print list1
           [(1, 2), (3, 4), (5, 6)]
           In [32]: iterable1=list1.__iter__()
           In [33]: iterable1.next()
           Out[33]: (1, 2)
           In [34]: iterable1.next()
           Out[34]: (3, 4)
           In [35]: iterable1.next()
           Out[35]: (5, 6)
    也可以使用iter函数生成一个迭代器对象。用法: iter(container_object)
           In [37]: iterable1=iter(list1)
           In [38]: iterable1.next()
           Out[38]: (1, 2)
           In [39]: iterable1.next()
           Out[39]: (3, 4)
           In [40]: iterable1.next()
           Out[40]: (5, 6)

Python中,迭代器是遵循迭代协议的对象;使用iter()函数可以从任何序列对象中生成一个迭代器对象
若要使用迭代器,需要在类中定义next()方法(python3中是 __next__())
要使得迭代器指向下一个元素,则使用成员函数next() (在python3中,是函数next(),而非成员函数)
当没有元素时,则触发StopIteration异常
   
    for循环可用在任何可迭代对象:
    for循环开始时,会通过迭代协议传递给iter()内置函数,从而能够从可迭代对象中获得一个迭代器,返回的对象含有需要的next方法。
   
python的列表解析:
    根据一个已存在列表再生成另一个新列表时,可以使用列表解析功能。
    列表解析是python迭代机制的一种应用,它常用于实现创建新的列表,因此要放置于[]中。
    语法:[expression for iter_var in iterable_object]
               [expression for iter_var in iterable_object if condition_expression]

    例:
    list1=[1,2,3,4]
    list2=[ i**2 for i in list1]
    list3=[ i**2 for i in list1 if i%2==0 ]
    print list2,list3
       
    for i in [ x**2 for x in range(1,11)]: print i/2
       
    import os
    os.listdir("/path")     以指定目录中的所有文件为列表元素,返回一个新列表
    string.endswith(".suffix")  判断字符串对象是否以".suffix"为后缀,返回布尔值
   
    filelist2 = [ filename for filename in os.listdir("/var/log") if filename.endswith(".log") ]
    print filelist2
   
    list1=['x','y','z']
    list2=[1,2,3]
    list3=[ (i,j) for i in list1 for j in list2 ]       嵌套使用列表解析
    print list3
       
    list4=[ (i,j) for i in list1 for j in list2 if j%2!=0 ]
    print list4
       
    list5=range(10)
    list5=[str(i)  for i in list5] 将数字类型的列表转换成字符型的列表
       
    list6=range(10)
    list6=[str(i)+'\n'  for i in list6] 将数字类型的列表转换成字符型的列表,并在每个元素后面加上一个"\n"的字符串
    f=file('/tmp/newfile','w+')
    f.writelines(list6)
    f.close()
    ipython需要使用sqlite才支持命令历史,否则不支持

Python生成器 
    如果元素过多,列表解析就特别占用资源。使用生成器,一次只生成一个元素,节省资源。  
    生成器表达式并不真正创建数字列表,而是返回一个生成器对象,此对象在每次计算出一个条目后,把这个条目"产生"(yield)出来。
    生成器表达式使用了"惰性计算"或称为"延迟求值"的机制。
    序列过长,并且每次只需要猎取一个元素时,就应当考虑使用生成器表达式而不是列表解析。生成器表达式用于python2.4以后的版本
    语法: (expression for iter_var in iterable)
        (expression for iter_var in interable if condition_expression)
        例:
        generator1=( i**2 for i in range(1,11))
        generator1.next()
    当然可以使用for遍历生成器,在遍历生成器时才生成值、每次只创建一个值,生成器尽量延迟生成值。
    每次仅从函数中取yield值一次,然后记录位置,下次从本次的位置继续取值。
       
    for x in ( i**2 for i in range(1,11)): print x/2
       
    例:剖析yield运行过程
       def func1():
           yield 1
           yield 2
           yield 3
       g1=func1()
       '''print g1.next()
       print g1.next()
       print g1.next()
       '''
       for item in g1:
           print item

       例:自定义一个xxreadlines()函数,逐行读取文件的内容
       def xxreadlines(filename):
           seek=0
           while True:
               with open(filename,"r") as f:
                   f.seek(seek)
                   data=f.readline()
                   if data:
                       seek=f.tell()
                       yield data
                   else:
                       return
       g1=xxreadlines("/tmp/test1")
       print g1.next()
       print g1.next()
       说明:with在打开文件后自动close;yield可以保留函数运行过程中的状态。
       
产生偏移和元素enumerate
    range 可在非完备遍历中用于生成索引偏移,而非偏移元素。
    如果同时需要偏移索引和偏移元素,则可以使用enumerate()函数
    此内置函数返回一个生成器对象 
    例:
        In [67]: str1="www.example.com"
        In [68]: e1=enumerate(str1)
        In [69]: e1.next()      返回值既有索引,又有元素
        Out[69]: (0, 'w')
        In [70]: e1.next()
        Out[70]: (1, 'w')
        In [71]: e1.next()
        Out[71]: (2, 'w')
        In [72]: e1.next()
        Out[72]: (3, '.')
        In [73]: e1.next()
        Out[73]: (4, 'e')

--结束END--

本文标题: python iterator(迭代器)

本文链接: https://www.lsjlt.com/news/183036.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • python iterator(迭代器)
    迭代:重复做一件事iterable(可迭代)对象:支持“每次仅返回自身所包含的其中一个元素”的对象iterable对象实现了__iter__方法     序列类型,如:list、str、tuple     非序列类型,如:dict、file...
    99+
    2023-01-31
    迭代 python iterator
  • Python 迭代器Iterator详情
    目录前言1. 什么是迭代器?2. 迭代器类型3. 迭代器分类容器迭代器遍历迭代器自定义迭代器总结前言 当我们需要对列表(list)、元组(tuple)、字典(dictionary)和...
    99+
    2022-11-11
  • Python浅析迭代器Iterator的使用
    目录前言迭代器是什么自定义迭代器前言 当我们需要对列表(list)、元组(tuple)、字典(dictionary)和集合(set)的元素进行遍历时,其实Python内部都是启动迭代...
    99+
    2022-11-11
  • C++迭代器iterator详解
    目录1.迭代器分类1) 正向迭代器2) 常量正向迭代器3) 反向迭代器4) 常量反向迭代器2.迭代器用法示例3.迭代器:++it 与 it++ 哪个好?(1)前置返回一个引用,后置返...
    99+
    2022-11-12
  • Python中Iterator迭代器的使用杂谈
    迭代器是一种支持next()操作的对象。它包含一组元素,当执行next()操作时,返回其中一个元素;当所有元素都被返回后,生成一个StopIteration异常。 >>>a=[1,2,...
    99+
    2022-06-04
    杂谈 迭代 Python
  • java迭代器iterator怎么使用
    在Java中,迭代器(Iterator)是用来遍历集合(Collection)中元素的工具。迭代器提供了一种统一的方式来访问集合中的...
    99+
    2023-10-18
    java
  • 白话解释 迭代器(ITERATOR)和
    来源:本人博客 前言 迭代器和生成器可能对于一些人来说知道是什么东东,但是并没有比较深入的了解,那么今天,就跟随我来了解一下这两者的概念,关系及优点,我将使用python中的迭代器和生成器作为演示,如果你不懂python没关系,明白了概念...
    99+
    2023-01-31
    白话 迭代 ITERATOR
  • C++迭代器iterator怎么使用
    C++迭代器(iterator)是一种用于访问容器中元素的对象,可以用来遍历容器中的元素,或者修改容器中的元素。首先,你需要在代码中...
    99+
    2023-08-15
    C++ iterator
  • python中实现迭代器(iterator)的方法示例
    概述 迭代器是访问集合元素的一种方式。迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。 延迟计算或惰性求值 (Lazy evaluation) 迭代器不要求你事先准...
    99+
    2022-06-04
    示例 迭代 方法
  • Java使用迭代器Iterator遍历集合
    目录前言Iterator 概述Iterator 的使用使用 next() 方法遍历集合使用 remove 方法删除元素迭代器 Iterator 的执行原理使用foreach循环遍历集...
    99+
    2022-12-08
    Java迭代器Iterator遍历集合 Java 遍历集合 Java迭代器Iterator
  • Java中Iterator(迭代器)的用法详解
    Java迭代器(Iterator)是 Java 集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。Java Iterator(迭代器)不是一个集合,它...
    99+
    2023-05-19
    Java Iterator迭代器使用 Java Iterator Java 迭代器
  • JavaScript中Iterator迭代器接口和循环
    目录JavaScript的迭代器(Iterator)介绍for...of循环与for...in循环JavaScript的迭代器(Iterator)介绍 迭代器是数据结构遍历的一种机制...
    99+
    2022-11-13
  • Java中Iterator迭代器的使用详解
    目录Iterator接口迭代器的实现原理增强for练习1:遍历数组练习2:遍历集合Iterator接口 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个...
    99+
    2022-11-13
    Java Iterator迭代器 Java Iterator Java 迭代器
  • php迭代器iterator的作用是什么
    这篇文章主要介绍“php迭代器iterator的作用是什么”,在日常操作中,相信很多人在php迭代器iterator的作用是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”php迭代器iterator的作用...
    99+
    2023-06-20
  • java迭代器iterator指的是什么意思
    这篇文章给大家分享的是有关java迭代器iterator指的是什么意思的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Que...
    99+
    2023-06-14
  • Java中Iterator与ListIterator迭代的区别
    迭代的时候可以修改数据吗? 答,Iterator迭代的时候可以移除数据,但是不能添加;而ListIterator迭代时可以添加数据,移除数据,倒序遍历; public ...
    99+
    2022-11-12
  • 使用Java怎么实现一个Iterator迭代器
    这期内容当中小编将会给大家带来有关使用Java怎么实现一个Iterator迭代器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。package me.socketthread;import&nbs...
    99+
    2023-05-30
    java iterator
  • Iterator迭代器如何在Java项目中使用
    Iterator迭代器如何在Java项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是迭代器  在Java中,有很多的数据容器,对于这些的操作有很多的共性。Java...
    99+
    2023-05-31
    java iterator ava
  • C ++迭代器iterator在string中使用方法介绍
    目录一、正向迭代器二、正向迭代器(只读数据)三、反向迭代器四、反向迭代器(只读)五、auto来替换这些特别长类型名一、正向迭代器 【例子】 //正向迭代器 void test1()...
    99+
    2022-11-13
    C ++迭代器iterator C ++迭代器在string使用
  • C# 中怎么利用Iterator实现迭代器模式
    本篇文章给大家分享的是有关C# 中怎么利用Iterator实现迭代器模式,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C# Iterator迭代器模式我们在平时的开发中应该经常...
    99+
    2023-06-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作