16、生成器以及表达式
一、生成器与yield
生成器又可以叫自定义迭代器,若函数体包含yield关键字,再调用函数,并不会执行函数体代码,得到的返回值即生成器对象
def func():
print('我是蒙奇d路飞')
yield 1
print('一个要成为')
yield 2
print('海贼王的男人')
yield 3
# 调用阶段
func() # 不会执行
g = func() # 把函数调用赋值给另外一个函数
res = next(g) # 用next触发函数体代码执行,直到遇到yield停止,并将yield的返回值赋值给res
print(res) # 打印yield的返回值
res = next(g) # 再次调用,函数从上次暂停位置继续执行,直到再次遇到yield停止...
print(res)
res = next(g) # 周而复始
print(res)
既然生成器对象属于迭代器,那么必然可以用for循环迭代
# 调用阶段
for i in func():
print(i)
总结来说 只需要记住 当一个函数体里有 yield 的时候,再去调用函数,是不会执行里面的代码的,而是会生成一个自定义迭代器(又叫:生成器),再用next才能触发函数体代码的运行
.send()使用
def weapons(name):
print('开始抽奖')
while True:
x = yield
print('%s 开箱竟获得了一把 %s' % (name, x))
g = weapons('湖北吴彦祖') # 拿到生成器对象
g.send(None) # 等同于next(g),让生成器在x = yield处准备好,等待传值
g.send('霜之哀伤') # 里面的参数给yield,然后赋值给x,再打印,下次循环时又挂在yield处
g.send('火之高兴') # 和上面一样
g.send('一坨寂寞') # 楼上+1
# 运行结果
开始抽奖
湖北吴彦祖 开箱竟获得了一把 霜之哀伤
湖北吴彦祖 开箱竟获得了一把 火之高兴
湖北吴彦祖 开箱竟获得了一把 一坨寂寞
def drinks():
list_a = []
while True:
list_b = yield list_a
list_a.append(list_b)
print(list_a)
a = drinks() # 获得生成器对象
a.send(None) # 初始化生成器
a.send("百事可乐")
a.send("可口可乐")
a.send("崂山可乐")
a.send("非常可乐")
# 运行结果
['百事可乐']
['百事可乐', '可口可乐']
['百事可乐', '可口可乐', '崂山可乐']
['百事可乐', '可口可乐', '崂山可乐', '非常可乐']
二、表达式
表达式可以让代码更加精简,且不失可读性。
三元表达式
# 需求:判断x大于y时,返回x的值,否则返回y的值
x = 1
y = 2
if x > y:
print(x)
else:
print(y)
# 语法格式:条件成立要返回的值 if 条件 else 条件不成立返回的值
print(x if x > y else y) # 这就是三元表达式
列表生成式
# 需求:筛选出 帅逼人员的 名单
list1 = ['吴彦祖-帅逼', '彭于晏-帅逼', '周润发-帅逼', 'POCO-帅逼', '美国懂王-SB']
new_list = [] # 先定义一个空列表
for name in list1: # for循环遍历出list1的元素
if name.endswith('帅逼'): # 判断是否以帅逼结尾
new_list.append(name) # 把以帅逼结尾的元素添加进之前定义的空列表
print(new_list)
# 列表生成器
new_list = [name for name in list1 if name.endswith('帅逼')]
print(new_list)
list1 = ['wyz-sg', 'pyy-sg', 'zrf-sg', 'wh-sg', 'mgdw-sb']
# 所有小写字母变大写
list1 = [name.upper() for name in list1]
# 所有名字去掉后缀sg
list1 = [name.strip('-SG') for name in list1]
字典生成式
# 案例1
keys = ['name', 'age', 'gemder']
dic = {key: None for key in keys}
print(dic)
# 案例2
items = [('name', 'poco'), ('age', 18), ('gender', 'male')]
res = {k: v for k, v in items if k != 'gender'}
print(res)
集合生成式
keys = ['name', 'age', 'gemder']
set1 = {key for key in keys}
print(set1)
生成器表达式
res = (i for i in range(5))
print(next(res))
print(next(res))

浙公网安备 33010602011771号