1、迭代器 Iterator
【1】迭代器是访问可迭代对象的工具
【2】迭代器是指用iter(obj) 函数返回的对象(实例)。
【3】迭代器可以用next(it) 函数获取可迭代对象的数据
2、迭代器函数
【1】iter(iterable) 从可迭代对象中返回一个迭代器,iterable 必须是能提供一个迭代器的对象。即,用iter函数可以返回一个可迭代对象的迭代器
【2】next(iterator) 从迭代器iterator中获取下一个记录,如果无法获取下一条记录,则触发StopIteration异常。即,迭代器对象能用next函数获取下一个元素。
【3】迭代器只能向前取值,不会后退
In [7]: L = [2, 3, 5, 7] ...: for x in L: ...: print(x) ...: else: ...: print(‘循环结束‘) ...: print("---------------") ...: it = iter(L) # 从L中获取一个迭代器 ...: while True: ...: try: ...: x = next(it) ...: print(x) ...: except StopIteration: ...: print("循环结束") ...: break ...: 2 3 5 7 循环结束 --------------- 2 3 5 7 循环结束
In [9]: L = [2, 3, 5, 7] ...: it = iter(L) # 用L对象返回能访问L的迭代器, it绑定迭代器 ...: next(it) # 2 ...: next(it) # 3 ...: next(it) # 5 ...: next(it) # 7 ...: next(it) # StopIteration 通知(没有数据) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-9-b65817a9e736> in <module> 5 next(it) # 5 6 next(it) # 7 ----> 7 next(it) # StopIteration 通知(没有数据) StopIteration: In [10]:
生成器 Generator
1、生成器
生成器是能够动态提供数据的对象,生成器对象也是可迭代对象(实例)
【1】生成器函数
【2】生成器表达式
2、生成器函数
【1】生成器函数定义
含有yield语句的函数是生成器函数,此函数被调用将返回一个生成器对象
① 生成器函数的调用将返回一个生成器对象,生成器对象是一个可迭代对象
② 在生成器函数调用return 会触发一个StopIteration异常
【2】yiled 语句
yield 表达式
① yield 用于 def 语句定义的函数中,目的是将此函数作用生成器函数使用
② yield 用来生成数据,供迭代器的next(it) 函数使用
In [66]: def myyield(): ...: yield 2 ...: yield 3 ...: yield 5 ...: yield 7 ...: print("生成结束") ...: ...: ...: for x in myyield(): ...: print(x) ...: 2 3 5 7 生成结束
In [67]: def myyield(): ...: print("即将生成2") ...: yield 2 ...: print("即将生成3") ...: yield 3 ...: print("即将生成5") ...: yield 5 ...: print("即将生成7") ...: yield 7 ...: print("生成结束") ...: ...: gen = myyield() # gen 绑定一个生成器对象 ...: it = iter(gen) # 用生成器返回一个迭代器 ...: ...: # 从迭代器获取一个数据(此时生成器函数才开始执行) ...: print(next(it)) 即将生成2 2 In [68]: print(next(it)) 即将生成3 3 In [69]: print(next(it)) 即将生成5 5 In [70]: print(next(it)) 即将生成7 7 In [71]: print(next(it)) 生成结束 --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-71-4d0222393be1> in <module> ----> 1 print(next(it)) StopIteration: In [72]:
# 用生成器函数生成一定范围内的自然数 def myinteger(n): i = 0 # 自然数从0开始 while i < n: yield i i += 1 for x in myinteger(3): print(x)
3、生成器表达式
(表达式 for 变量 in 可迭代对象 [if 真值表达式 ])
if 语句可以省略。
用推导式的形式创建一个新的生成器。
In [21]: gen = (x ** 2 for x in range(1, 5)) ...: it = iter(gen) ...: next(it) # 1 Out[21]: 1 In [22]: next(it) Out[22]: 4 In [23]: next(it) Out[23]: 9 In [24]: next(it) Out[24]: 16 In [25]: next(it) --------------------------------------------------------------------------- StopIteration Traceback (most recent call last) <ipython-input-25-bc1ab118995a> in <module> ----> 1 next(it) StopIteration:
原文:https://www.cnblogs.com/longyuu/p/14179274.html