生成器
1、什么是生成器?
在函数内但凡出现yield关键字,再调用函数就不会执行函数体代码,该转让称之为生成器,生成器的本质就是迭代器
2、为什么要 有生成器?
生成器是一种自定义迭代器的方式
3、怎么用
def func():
print('first1')
print('first2')
print('first3')
yield 1 #暂停
print('second1')
print('second2')
print('second3')
yield 2 #暂停
print('third')
yield 3 #暂停
print('fourth')
g=func()
print(g) #生成器地址
# print(g.__iter__().__iter__().__iter__() is g)
# res1=next(g) #使用next方法,返回相应值
# print('第一次的返回值:',res1)
# for item in g: #g=iter(g) #item=next(g)
# print(item)
例题:
与range 功能相同的生成器
def my_name(start,stop,sleep=1):
while True :
if start<stop:
yield start 暂停
start +=sleep
res = my_name(2,15)
print(res)
# print(next(res)) #迭代器对象挨个取值,节省内存
b =next(res)
print(b)
# for item in my_name(2,8) : #调用my_name函数
# print(item )
4、总结yield的功能
(1)提供了一种自定义迭代器的方式
(2)yield 可以暂停住函数,返回值
yield VS return
相同点:都是在函数内,都可以返回值,没有类型,个数限制
不同点:return只能返回一次值,yield可以返回多次值
5、三元表达式
条件成立时的返回值 if条件 else条件不成立时的返回值
a = 10
b = 20
res = b if b>a else b
6、列表生成式
# a = [b*2 for b in range(1,12)]
# print(a)
names=['egon','alex','wupeiqi','yuanhao']
names = [x+'hb' for x in names] #在列表的元素中加入hb
print(names)
names=['egon','alex_sb','wupeiqi','yuanhao']
# 以sb结尾的名字过滤掉,然后保存剩下的名字长度
names =[len(name) for name in names if not name.endswith('sb') ]
print(names)
names=['egon','alex_sb','wupeiqi','yuanhao']
names =[ name.upper() for name in names] #列表元素大写
print(names)
7、字典生成式
s1=('h','e','l','l','o')
l1=[1,2,3,4,5]
res=zip(s1,l1) #函数zip 使两个数据类型内的值想对应,用元组储存
print(res)
print(list(res))
keys=['name','age','sex']
values=['egon',18,'male']
# d = {}
# for k,v in zip(keys,values):
# d[k] =v
# print(d)
d = { k:v for k,v in zip(keys,values)}
print(d)
8、生成器表达式
g=(i for i in range(10))
print(g) #加小括号,生成器表达式,打印内存地址
print(next(g)) #取值
print(next(g))
with open('cct.txt','rt',encoding= 'utf-8')as f:
# nums=[ len(line) for line in f]
# print(nums) #用[len(line) for line in f]取全部的长度信息 占内存
# print(max(nums))
# nums = (len(line) for line in f)
# print(nums) #打印内存地址
# print(next(nums)) #取值
# print(max(nums))