一、生成器与yield
# 如何得到自定义的迭代器:
# 在函数内一旦存在yield关键字,调用函数并不会执行函数体代码
# 会返回一个生成器对象,生成器
def func():
print('第一次')
yield 1
print('第二次')
yield 2
print('第三次')
g = func()
print(g) # generator
# 生成器就是迭代器
g.__iter__()
g.__next__()
# 会触发函数体代码的运行,然后遇到yield停下来,将yield后的值当作本次调用的结果返回
res1 = g.__next__()
print(res1)
# 应用案例
# 需求:造一个能够产生无穷个值的数据类型
def my_range(start, stop, step=1):
# print('start...')
while start < stop:
start += step
yield start
# print('end...')
for n in my_range(1, 7, 2):
print(n)
# yield与return对比总结说明:
'''
函数调用函数体代码执行到yield时会返回yield后的值并将函数运行状态暂停在yield的位置
而return,当函数被调用时函数体代码运行到return时返回return后的值但是函数直接被结束掉了。
因此,return只能返回一次值,而yield可以返回多次值
'''
二、yield表达式应用
# x=yield 返回值
def eat(name):
food_list = []
with open('db.txt', 'at', encoding='utf-8') as f:
print('%s饿了。。。' % name)
while True:
# x拿到的是yield接收到的值
food = yield food_list # x = '小笼包'
print('%s吃了%s' % (name, food))
food_list.append(food)
if food is not None:
f.write('%s\n' % food)
g = eat('润羽露西娅')
res = g.send(None) # 必须要给一个初始的None值否则会报错
print('露西娅的胃:', res)
res = g.send('粽子')
print('露西娅的胃:', res)
res = g.send('汉堡')
print('露西娅的胃:', res)
# g.close()
res = g.send('小笼包') # 关闭之后无法传值
print('露西娅的胃:', res)
print('露西娅吃饱了。。。')
三、三元表达式、列表生成式、生成器表达式
3.1 三元表达式
def func(x, y):
if x > y:
return x
else:
return y
res func(1,2)
print(res)
# 三元表达式: 条件成立时的返回值 if 条件 else 条件不成立时的返回值
def func(x,y):
return x if x > y else y
res = func(1,2)
print(res)
3.2 列表生成式
# 列表生成式语法:l=[表达式 for x in 可迭代对象 if 条件] [表达式 for x in 可迭代对象]
l = ['rem_dlp', 'rushia_dlp', 'megumi_dlp']
harem = []
for girl in l:
if girl.endswith('dlp')
harem.append(girl)
# 列表生成式
'''
harem = [name for name in l if name..endswith('dlp')]
harem = [name for name in l]
'''
l = ['rem_dlp', 'rushia_dlp', 'megumi_dlp']
harem = [name.replace('_dlp', '').upper() for name in l if name.endswith('dlp')]
print(harem)
# 集合生成式
# 语法:dic={元素 for k in 可迭代对象 if 条件}
keys=['name','age','gender']
set1={key for key in keys}
print(set1,type(set1))
# 字典生成式
# 语法:dic={键:值 for k in 可迭代对象 if 条件}
keys=['name','age','gender']
dic = {key:None for key in keys}
print(dic)
items=[('name', 'rem'), ('age', 16), ('gender', 'female')]
dic = {k: v for k, v in items if k != 'gender'}
print(dic)
3.3 生成器表达式
# 语法:g=(表达式 for x in 可迭代对象 if 条件)
g=(i for i in range(10) if i > 3)
'''
强调:此时g内部没有值,g是一个生成器
print(g, type(g))
'''
# print(next(g))
# print(next(g))
# print(next(g))
with open('db.txt', mode='rt', encoding='utf-8') as f:
# 方式一:
# res=0
# for line in f:
# res+=len(line)
# print(res)
# 方式二:
# res=sum([len(line) for line in f])
# print(res)
# 方式三 :效率最高
# res = sum((len(line) for line in f))
# 上述可以简写为如下形式
res = sum(len(line) for line in f)
print(res)