迭代器iterator
- 可迭代协议—只要含有__iter__方法的,都是可迭代的iterable
- 迭代器协议—内部含有__next__方法和__iter__方法的就是迭代器
- 只要能被for循环的数据类型,就一定拥有__iter__方法,for循环其实就是在使用迭代器
- 只要是迭代器就一定可以迭代
- 可迭代对象.__iter__() == 迭代器
- 迭代器中的__next__()方法可以一个一个的获取值
迭代器对象可以使用常规for语句进行遍历:
list=[1,2,3,4] it = iter(list) # 创建迭代器对象 for x in it: print (x, end=" ")
执行以上程序,输出结果如下:
1 2 3 4
迭代器的好处
- 从容器类型中一个一个的取值,会把所有的值都取到
- 节省内存空间
生成器
生成器函数本质上就是我们自己写的函数
跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。
在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回yield的值。并在下一次执行 next()方法时从当前位置继续运行。
yield关键字
yield关键字和return用法相同,只要含有yield关键字的函数,都是生成器函数,yield需要写在函数内部,不可以和return同时使用,生成器函数执行后会得到一个生成器作为返回值
def generator(): print(1) yield ‘a‘ #生成器函数 : 执行之后会得到一个生成器作为返回值 ret = generator() print(ret) print(ret.__next__())
#娃哈哈%i def wahaha(): for i in range(2000000): yield ‘娃哈哈%s‘%i count = 0 for i in g: count +=1 print(i) if count > 50: break for i in g: count +=1 print(i) if count > 100: break