迭代器
例如:一个列表执行了__iter__()之后返回值就是一个迭代器
没执行就不是迭代器
l = [1,2,3]
#能循环
#list dict str set tuple f=open() range() enumerate
#dir()返回 拥有的所有方法
#能被for循环的数据类型,一定拥有__iter__方法
#iterator迭代器
l.__iter__().__next__()
next 方法可以帮助一个一个取值
可迭代协议:只要含有__iter__方法都是可迭代的
迭代器协议:内部含有__next__()和__iter__方法就是迭代器
迭代器好处:
- 从容器类型中一个一个取值,把所有值都取到
- 节省内存空间(一个一个给,并不是已经生成好的)
生成器
#生成器函数---本质是自己写的生成器函数
def generator():
print(1)
return 'a'
ret = generator()
print(ret)
#只要含有yield关键字的函数都是生成器函数,yield和return不能同时用且需要写在函数内
#生成器函数:执行之后得到一个生成器作为返回值
def generator():
print(1)
yield 'a'
ret = generator()
print(ret)
输出结果:
<generator object generator at 0x000000000DF2990>
print(ret.__next__())#使用next()方法时第一次触发了生成器执行
1
a
yield和return不同的是return完程序结束,yield不会结束函数,直到遇到StopIteration
yield和next配合可以控制生成器函数的执行
def wahaha():
for i in range(2000000):
yield '娃哈哈%s'%i
g = wahaha()
for i in g:
print(i)
#可以执行这个
#若只想要50个
count = 0
for i in g:
count +=1
print(i)
if count>50:
break
#得到前50个
g.__next__()#继续得到第51个