python 迭代器和生成器详解

详解python三大器——迭代器生成器、装饰器 迭代器迭代器前我们要先清楚迭代的概念:通常来讲从一个对象中依次取出数据,这个过程叫做遍历,这个手段称为迭代(重复执行某一段代码块,并将每一次迭代得到的结果作为下一次迭代的初始值)。 可迭代对象(iterable):是指该对象可以被用于for…in…循环,例如:集合,列表,元祖,字典,字符串,迭代器等。 在python中如果一个对象实现了 iter 方法,我们就称之为可迭代对象,可以查看set\list\tuple…等源码内部均实现了__iter__方法 如果一个对象未实现__iter__方法,但. 阅读详情

一、迭代器

说迭代器之前有两个相关的名词需要介绍:
可迭代对象:只要定义了__iter__()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器。
迭代器:实现了__next__()或者next()(python2)方法的称为迭代器,迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁,因此只占用固定的内存。
迭代:当我们使用一个循环来遍历某个东西时,这个过程本身就叫迭代。迭代器迭代的元素只能往前不能后退。

1、为何用迭代器

下面用生成斐波那契数列为例子,说明为何用迭代器

复制代码

#代码1
def fab(max): 
    n, a, b = 0, 0, 1 
    while n < max: 
        print b 
        a, b = b, a + b 
        n = n + 1
#直接在函数fab(max)中用print打印会导致函数的可复用性变差,因为fab返回None。其他函数无法获得fab函数返回的数列。

复制代码

复制代码

#代码2
def fab(max): 
    L = []
    n, a, b = 0, 0, 1 
    while n < max: 
        L.append(b) 
        a, b = b, a + b 
        n = n + 1
    return L

#代码2满足了可复用性的需求,但是占用了内存空间。

复制代码

复制代码

#代码3,定义并使用迭代器
 class Fab(object): 
    def __init__(self, max): 
        self.max = max 
        self.n, self.a, self.b = 0, 0, 1 

    def __iter__(self): 
        return self 

    def next(self): 
        if self.n < self.max: 
            r = self.b 
            self.a, self.b = self.b, self.a + self.b 
            self.n = self.n + 1 
            return r 
        raise StopIteration()
        
for key in Fabs(5):
    print key        
    
#Fabs 类通过 next() 不断返回数列的下一个数,内存占用始终为常数  

复制代码

 2、如何使用迭代器

使用内建的工厂函数iter(iterable)可以获取迭代器对象(对象包含__iter__方法即可迭代,__iter__方法返回一个迭代器):

>>> lst = range(5)
>>> it = iter(lst)
>>> it
<listiterator object at 0x0000000001E43390>

使用next()方法访问下一个元素

复制代码

>>> it.next()
0
>>> it.next()
1
>>> it.next()
2

复制代码

python处理迭代器越界是抛出StopIteration异常

复制代码

>>> it.next()
3
>>> it.next
<method-wrapper 'next' of listiterator object at 0x01A63110>
>>> it.next()
4
>>> it.next()

Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration


 

复制代码

了解了StopIteration,可以使用迭代器进行遍历了:

复制代码

lst = range(5)
it = iter(lst)
try:
    while True:
        val = it.next()
        print val
except StopIteration:
    pass

复制代码

 3、for语法糖

幸运的是python提供的for语句语法糖为迭代提供了方便的使用方法。在for循环中,Python将自动调用工厂函数iter()获得迭代器,自动调用next()获取元素,还完成了检查StopIteration异常的工作。

复制代码

>>> lst = range(5)
>>> for i in lst:
...     print i
...
0
1
2
3
4

复制代码

 

 

二、生成器

带有 yield 的函数在 Python 中被称之为 generator(生成器),几个例子说明下(还是用生成斐波那契数列说明),可以看出代码3远没有代码1简洁,生成器(yield)既可以保持代码1的简洁性,又可以保持代码3的效果。

复制代码

#代码4
def fab(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n+ 1
#执行
for n in fab(5):
    print n
    
1
1
2
3
5

复制代码

  生成器也是一种迭代器,简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator,调用 fab(5) 不会执行 fab 函数,而是返回一个 iterable 对象!在 for 循环执行时,每次循环都会执行 fab 函数内部的代码,执行到 yield b 时,fab 函数就返回一个迭代值,下次迭代时,代码从 yield b 的下一条语句继续执行,而函数的本地变量看起来和上次中断执行前是完全一样的,于是函数继续执行,直到再次遇到 yield。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次,每次中断都会通过 yield 返回当前的迭代值。

也可以手动调用 fab(5) 的 next() 方法(因为 fab(5) 是一个 generator 对象,该对象具有 next() 方法),这样我们就可以更清楚地看到 fab 的执行流程:

复制代码

>>> f = fab(3)
>>> f.next()
1
>>> f.next()
1
>>> f.next()
2
>>> f.next()
 
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration

复制代码

return作用

在一个生成器中,如果没有return,则默认执行到函数完毕;如果遇到return,如果在执行过程中 return,则直接抛出 StopIteration 终止迭代。例如

复制代码

def read_file(fpath): 
    BLOCK_SIZE = 1024 
    with open(fpath, 'rb') as f: 
        while True: 
            block = f.read(BLOCK_SIZE) 
            if block: 
                yield block 
            else: 
                return

复制代码

 

 如果直接对文件对象调用 read() 方法,会导致不可预测的内存占用。好的方法是利用固定长度的缓冲区来不断读取文件内容。通过 yield,我们不再需要编写读文件的迭代类,就可以轻松实现文件读取。

Python迭代器生成器详解 虽然在处理大型数据集时,使用迭代器可以提高程序运行效率,但在编写简单程序时,使用生成器也是非常实用的。无论是使用迭代器还是生成器,都可以让我们更加方便地遍历容器中的元素,提高程序的可读性可维护性。迭代器可以使我们在处理大型数据集时更加高效,而生成器则可以让我们使用更少的代码来创建可迭代的对象。生成器是一种可以创建可迭代对象的函数,它可以通过 yield 语句暂停函数执行并返回一个值,直到需要该值时再恢复执行。迭代器是一种可以遍历容器对象(如列表、元组、字典等)的工具,它可以实现按需计算并返回每个元素。 阅读详情

相关推荐

python迭代器生成器

帮助大家深入了解迭代器生成器

qq_52758588的博客 1万+

Python迭代器生成器详解(包括yield详解

文章目录一、迭代器1. 可迭代对象(Iterable)2. 迭代器对象(Iterator)3. for循环原理4. 迭代器的优缺点二、生成器1. yield 原理2. yield return 区别3. yield表达式应用4. 生成器的用处三、三元表达式、列表生成式、生成器表达式1. 三元表达式2. 三元表达式3. 生成器表达式结语 一、迭代器 迭代器即用来迭代取值的工具。迭代器是一个可以记住遍历的位置的对象。 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会..

诚邀网络通信领域商务合作 4865

Python迭代器生成器详解与案例

Python迭代器生成器1. 迭代器迭代器的概念及其特点可迭代的对象iterable迭代器iterator案例2. 生成器生成器的概念及其特点案例 1. 迭代器 迭代器类似于列表生成式[ i for i in range(10) ], 不过把 [ ] 换成 (),从而变成迭代器 迭代器的概念及其特点 迭代器python最强大的功能之一,是访问集合元素的一种方式 迭代器是一个可以记住遍历位...

UK - UofL HW - SDE 714

python迭代器(Iterator)与生成器(Generator)

_iter__()方法返回一个迭代器对象,一般是self,这个返回的对象必须实现了__next__()方法,因为for循环使用这个迭代器时,会首先调用一次__iter__(),然后每次循环时调用这个__iter__()返回的对象的__next__()方法,将__next__()返回值赋给循环变量。另外,关于一个迭代器对象可以迭代几次的问题。4. 生成器生成器是一种特殊的迭代器,可以通过生成器表达式或生成器函数实现,每次循环会保存生成器当前的状态,下次循环时当前生成器中的状态推导下一个元素。

Terry_R_Hh的博客 2520

Python学习——for循环,生成器迭代器详解

学习Python生成器时候,头一次见到函数可以这么写,后来了解到貌似用yield关键字后,函数不再是函数了,运行方式也很有趣,因此有必要详细记录一下。貌似用yield做生成器后可以实现伪多线程。 ...

zhaoyun_zzz的专栏 9981

python生成器迭代器详解

文章目录前言一、迭代器--从一个简单例子入手1.1 实现__iter__成为迭代对象1.2 通过实现__next__方法成为迭代器二、生成器 -- 更加简单的迭代器2.1来个简单例子2.2 生成器函数yeild2.3 生成器推导式参考文献 前言 python迭代器生成器比较抽象,尽量做到通俗易懂。 一、迭代器–从一个简单例子入手 首先,创建一个基础类Dogs,并实例化一个对象,该类希望输出我家有多少条狗。此处我相信大家都能理解。 # 首先创建一个类,实例化一个普通的对象。 class Dogs(obje

wulele2的博客 4231

详解 Python 生成器迭代器 及其区别

不论是初学python还是进阶,这都是绕不开的知识点,生成器迭代器的概念相较于其他基础概念显得晦涩难懂,知识点囊括很多方面,查阅越多的资料,头就越大,现在这加以理解归纳总结。

Yy_Rose的博客 8429

Python 生成器迭代器详解

迭代器python中列表(list)、元组(tuple)、字典(dict)、集合(set)这些数据容器都有一个共同的特性,它们都支持使用for循环遍历容器中存储的元素,都是可迭代的也成为迭代器。 迭代时访问集合元素的一种非常强大的方式。迭代器可以记住遍历位置,不会对例如列表这样的数据容器一次性全部生成,而是等到用的时候才会去生成。我们也可以创建一个可迭代的对象:只要此对象含有__iter__方法,那么它就是一个可迭代的对象 如果要自定义实现一个迭代器,则类中必须实现以下两个方法: __next(sel

weixin_47906106的博客 2873

python 生成器迭代器详解

列表生成器   首先举个例子 现在有个需求,看列表 [0,1,2,3,4,5,6,7,8,9],要求你把列表里面的每个值加1,你怎么实现呢? 方法一(简单): info = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] b = [] # for index,i in enumerate(info): # print(i+1) # b.append(i+1)...

D_R_L_T的博客 650

Python教程——Python迭代器生成器详解

所在遍历大批量数据的时候,非常有用,因为如果将大批量的数据直接加载到内存中在遍历,肯定会消耗很多内存,而利用生成器就可以做到需要哪些遍历哪些。当然,以上的例子并不一定需要采用生成器才能处理,我们直接在第4行进行处理也是可以的,生成器更多的只是提供一种思路,当你用常规方法不能解决问题的时候,可以试试用生成器Python中的迭代器是一种对象,它可以迭代(遍历)一个可迭代对象(比如列表、元组或字符串)的元素。函数就是要给生成器函数,当调用生成器函数时,它返回一个生成器对象,而不是立即执行函数体内的代码,

Gefangenes的博客 1283

Python教程(26)——Python迭代器生成器详解

所在遍历大批量数据的时候,非常有用,因为如果将大批量的数据直接加载到内存中在遍历,肯定会消耗很多内存,而利用生成器就可以做到需要哪些遍历哪些。当然,以上的例子并不一定需要采用生成器才能处理,我们直接在第4行进行处理也是可以的,生成器更多的只是提供一种思路,当你用常规方法不能解决问题的时候,可以试试用生成器Python中的迭代器是一种对象,它可以迭代(遍历)一个可迭代对象(比如列表、元组或字符串)的元素。函数就是要给生成器函数,当调用生成器函数时,它返回一个生成器对象,而不是立即执行函数体内的代码,

一点 1461

Python3 迭代器生成器详解:从入门到实践

场景推荐工具理由处理大数据文件生成器内存占用低,逐行处理实现复杂遍历逻辑自定义迭代器可精细控制状态边界条件需要与外部交互生成器(send支持双向数据传递快速实现简单序列生成器表达式代码简洁,可读性强迭代器生成器Python中“用空间换时间”的经典实践。它们通过延迟计算,让程序能以优雅的方式处理海量数据。无论是读取大文件、实现自定义数据流,还是构建复杂的数据处理管道,掌握这两个工具都能让你的代码更高效、更Pythonic。

这家伙很懒,什么都没有留下 986

python迭代器生成器的作用_python 迭代器生成器详解

一、迭代器迭代器之前有两个相关的名词需要介绍:可迭代对象:只要定义了__iter__()方法,我们就说该对象是可迭代对象,并且可迭代对象能提供迭代器迭代器:实现了__next__()或者next()(python2)方法的称为迭代器迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁,因此只占用固定的内存。迭代:当我们使用一个循环来遍历某个东西时,这个过程本身...

weixin_39905624的博客 440

Python生成器迭代器详解

迭代器是一种实现了迭代器协议的对象,用于遍历集合中的数据;而生成器则是一种特殊的迭代器,它使用yield关键字在函数内部定义了一个控制流,使得函数可以记住上一次返回时在函数体中的位置。迭代器是一个实现了迭代器协议的对象,即该对象需要有一个__next__()方法,以及一个__iter__()方法(尽管__iter__()方法通常只是返回对象本身,但仍然是迭代器协议的一部分)。生成器是一种特殊的迭代器,它使用yield关键字在函数内部定义了一个控制流,使得函数可以记住上一次返回时在函数体中的位置。

LesterWalkley的博客 452

Python 中的迭代器生成器详解

Python 中的迭代器生成器详解

燕鹏 841

Python 迭代器生成器详解

Python 中,迭代器(Iterator)生成器(Generator)是处理序列数据的关键工具,它们支持高效、惰性计算(按需生成值),尤其适合处理大数据或无限序列。以下是详细解析: 内置迭代器 列表、字符串、字典等可迭代对象通过 转换为迭代器: 3. 使用场景 遍历大型数据集(如文件逐行读取,无需全部加载到内存): 自定义复杂迭代逻辑(如分页数据加载)。 二、生成器(Generator) 1. 核心概念 生成器迭代器生成器自动实现迭代器协议( )。 惰性生成值:使用 关键字暂

青蛙博客 587

详解Python迭代器生成器,装饰器

文章目录迭代器生成器装饰器 迭代器 简介:迭代器python里面可以记住遍历位置的对象,迭代器只能往前不能往后,使用iter()创建一个迭代器,使用next()返回一个迭代器里面的元素。 应用场景:数列的数据规模巨大,或者数列有规律,但是通过列表推导式推导不出来 #!/usr/local/bin/python3 import sys it = iter([1,32,43,2]) ...

Zijian Su的博客 3300

python中的迭代器生成器详解

在学习迭代器生成器的时候,感觉很难理解它们的原理,特别是迭代器与for循环的结合,与C的for循环有很大不同,思维转不过来。在网上查了很大资料,对此有了一定的了解,下面部分是网上的资料,部分是我的个人理解。 一、迭代器 1、迭代器规则       迭代的意思是重复做一些事情很多次,到现在为止只是在for循环中对序列字典进行迭代,但实际上也能对其他的对象进行迭代:实现__iter_

Yonah潇的专栏 1459
上一篇: python time模块和datetime模块详解
下一篇: python装饰器总结
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值