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))
posted @ 2021-03-30 20:45  黑影Poco  阅读(65)  评论(0)    收藏  举报