- 可迭代对象
对象内部含有__iter__ 方法,(dir())可迭代对象满足可迭代协议 - 迭代器
对象内部含有__iter__和__next__方法 - 生成器
自己用python代码写的迭代器,本质是迭代器,
方法:1 ,iter(可迭代对象), 2, 用yield写函数,此时该函数不是通常意义的函数,而是个生成器。 - yield
用在特殊的函数体内,这个函数体仅仅是用来创建一个genetator生成器函数
例1
def f():
print('ok')
yield 6
print('ok2')
yield
gen = f() # 通常执行函数时开辟了一个临时空间,直接执行函数内的代码块,而加了yield后就生产了一个generator对象,并非通常意义的函数了。
print(gen) # 该生成器地址 # <generator object f at 0x0000015B8052F6D8>
'''生成器取值方法'''
print(next(gen)) # ok 6 # 调用者可接收yield返回值
print(gen.__next__()) # ok2 None
next(gen) # StopIteration
- send
next方法只能在迭代器内查看其中的内容,如果想和迭代器交互,如传一个值给他,就要用到send,如
def f():
print('ok')
s = yield 6
print(s)
print('ok2')
yield
gen = f() # 同样调用生成器取值
print(next(gen))
gen.send(5) # 把5 send给了上一个yield,再走下面的代码,也相当于走了两遍。也就是既走next,又给上一个yield传值。
运行结果
ok
6
5
ok2
- yield from和 yield区别 :yield from 是3.5后的新功能。
yield from 调用了另外的函数
def func():
yield from 'kdjff'
print(list(func()))
def func():
for i in 'kdfj':
yield i
print(list(func()))
运行结果
['k', 'd', 'j', 'f', 'f']
['k', 'd', 'f', 'j']