目录
生成器对象
生成器本质还是迭代器,只不过是我们自己通过写代码产生的, 也有__iter__ 和__next__方法.
生成器对象也是节省空间存储的, 特性与迭代器对象一致.
当函数体代码中含有yield关键字时,第一次调用函数并不会执行函数体代码, 而是将函数变成了生成器. 验证方法: 是否含有iter() 和 next()方法..
def index():
print('你还记得我吗?')
yield 123
yield 123, 111
print('是不是忘记我了!!!')
yield 666
没有调用之前 index函数只是一个普通函数
print(index) # <function index at 0x00000265AAC060D0>
加括号调用并接受结果: 不执行代码 而是变成了生成器对象(迭代器)
res = index()
print(res) # <generator object index at 0x000001B792F5E150>
变成生成器之后调用__next__就会开始执行函数体代码
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
print(res.__next__())
# 你还记得我吗?
# 123
# (123, 111)
# 是不是忘记我了!!!
# 666
如果函数体代码中含有多个yield关键字 执行一次__next__返回后面的值并且让代码停留在yield位置
再次执行__next__基于上次的位置继续往后执行到下一个yield关键字处
如果没有了 再执行也会报错 StopIteration
# Traceback (most recent call last):
# File "C:/me/JetBrains/pythonProject/迭代器生成器/生成器.py", line 14, in <module>
# print(res.__next__())
# StopIteration
yield 类似于普通函数中的return关键字, yield后边有多少数据便返回多少数据.
yield 关键字作用
1. 在函数体代码中出现, 可以将函数变成生成器.
2. 在执行过程中, 可以将后面的值返回去, 类似于return.
3. 可以暂停住代码的运行
4.还可以接受外界的传值(了解)
def study(name):
print(f'{name}准备学习')
while True:
course = yield
print(f'{name}正在学习{course}')
res = study('yietong')
res.__next__()
res.__next__()
res.__next__()
res.__next__()
res.send('English')
res.send('Chinese')
# yietong准备学习
# yietong正在学习None
# yietong正在学习None
# yietong正在学习None
# yietong正在学习English
# yietong正在学习Chinese
生成器表达式
res = (i for i in 'yietong')
print(res) # <generator object <genexpr> at 0x0000013764C2E150>
print(res.__next__()) # y
print(res.__next__()) # i
print(res.__next__()) # e
print(res.__next__()) # t
print(res.__next__()) # o
生成器内部的代码只有在调用__next__迭代取值的时候才会执行