def func():
yield 1
yield 2
# 可返回多次值
defined_iter = func()
# 返回一个生成器 生成器就是自定义的迭代器
print(defined_iter)
# <generator object func at 0x104fc3dd0>
# 返回第一个值
res01 = defined_iter.__next__()
print(res01)
# 返回第二个值 --> 没有值时则报错
res02 = defined_iter.__next__()
print(res02)
def func_01(name):
food_list = []
while True:
# yield可以接收一个值,与后面的返回值无关
# 此处不是将返回值传递给x,而是将接收到的值传递给了x
x = yield food_list # 光标会停留在此处
print('%s正在吃%s' % (name, x))
food_list.append(x)
# 得到一个生成器
my_iter = func_01('狗狗')
# 初始化
my_iter.send(None)
# 将值传递给光标停放处前方的yield
# 刚得到的生成器只能传入None
# 相当于next(my_iter)
my_iter.send('苹果')
my_iter.send('香蕉')
my_iter.send('桃子')
# 打印yield的返回值
print(my_iter.send('栗子'))
my_iter.close() # 关闭
# 生成器生成式 不可生成元组
# 外侧加小括号为生成器
gene_exa = (i for i in range(8) if i > 3)
# 此时gene_exa内部并没有值
print(gene_exa, type(gene_exa))
print(next(gene_exa), next(gene_exa))
# next一次,循环一次,获得一个值,防止占用内存过大
# 列表生成式:
li = ['apple', 'banana', 'hello', 'world']
# 外侧加中括号为列表
li_01 = [i for i in li if i.find('l') > -1]
print(li_01)
# ['apple', 'hello', 'world']
# 集合生成式
li = ['name', 'age', 'height']
# 外侧加大括号为集合
set_exa_01 = {i for i in li}
print(set_exa_01)
# {'height', 'name', 'age'}
# 字典生成式
dic = {'name': '李白', 'age': 18, 'hobby': 'eating'}
dic_01 = {key: None for key in dic}
print(dic_01)
# {'name': None, 'age': None, 'hobby': None}
items = [('name', '李白'), ('age', 18), ('hobby', 'eating')]
dic_02 = {k: v for k, v in items if k != 'age'}
print(dic_02)
# {'name': '李白', 'hobby': 'eating'}
# 应用
with open('test.txt', mode='rt', encoding='utf-8') as file:
# gene = (len(line) for line in file)
res = sum(len(line) for line in file)
# 省去生成器表达式的括号
# 相当于将一个生成器gene传递给sum,sum会遍历并求和
print(res)