python 可迭代对象 / 迭代器 / 生成器
1. 可迭代对象
集合, 元组, 列表, 字符串, 字典 都是可迭代对象, 但并不是迭代器
2. 迭代器
iter() 函数用来生成迭代器。
a = [1,2,3,4,5] print('对迭代器iter1进行for循环') iter1 = iter(a) # 返回一个迭代器对象 for i in iter1: print(i) iter2 = iter(a) # 返回一个迭代器对象 print('下面开始对迭代器iter2进行第一次for循环') for j in iter2: print(j) break print('下面开始对迭代器iter2进行第二次for循环') for j in iter2: print(j) print('下面开始对迭代器iter2进行第三次for循环') for j in iter2: print(j) # 打印结果: 对迭代器iter1进行for循环 1 2 3 4 5 下面开始对迭代器iter2进行第一次for循环 1 下面开始对迭代器iter2进行第二次for循环 2 3 4 5 下面开始对迭代器iter2进行第三次for循环
# 注释 : 对iter2进行第一次for循环时, 将iter2中对第一个元素迭代掉了, 所以对iter2进行第二次循环,迭代剩余元素, 迭代掉剩余元素后, 第三次迭代, 已经没有可迭代对元素了
3. 对迭代器对象 进行迭代
next() 函数返回迭代器的下一个项目,括号里面的元素必须是迭代器对象。所以 next() 函数要和生成迭代器的 iter() 函数一起使用。
a = [1,2,3,4,5] iter1 = iter(a) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) print(next(iter1)) # 打印结果: 1 2 3 4 5 Traceback (most recent call last): File "E:\Avicii\练习\2023-20-10.py", line 10, in <module> print(next(iter1)) StopIteration #注释 : next()没有下一个元素则会触发 StopIteration 异常
a = [1,2,3,4,5] iter1 = iter(a) for i in iter1: print(next(i)) # 打印结果: TypeError: 'int' object is not an iterator # 注释 : next() 使用对象是迭代器. 而不是可迭代对象
4. 生成器
生成器yield是一种返回迭代器的函数, 生成器的调用方式与普通函数相同,只不过返回的是一个迭代器。
yield --> 只能用于函数中
yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator. 调用函数时,不会执行函数, 而是返回一个迭代器
Python中yield函数是一个生成器(generator),可用于迭代;在函数中yield类似于return,不同的是,yield返回一个return的值并且记住这个返回值的位置,下次迭代就从记住的这个位置开始,并且下一次迭代时,从上一次迭代遇到的yield后面的代码开始执行。
def a(): print('aaa') p = yield '123' print('bbb') k = yield '234' r = a() print(next(r)) print(next(r)) # 打印结果: aaa 123 bbb 234
由以上代码以及运行结果不难发现,每一个next返回值,都会在执行到yield函数后暂停生成,下一次next返回值则会继续从上一个暂停的位置执行,这也是yield函数的特点与用法。
钟声敲响了日落,柏油路跃过山坡,一直通向北方的是我们想象,长大后也未曾经过~