' 生成器 '' 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) #生成器iter后的结果还是其本身。 # res1=next(g) #调用生成器,才执行函数体代码,直到遇到yield后暂停。 # print('第一次的返回值:',res1) #返回一个返回值。 # # print('='*100) # res2=next(g) # print('第二次的返回值:',res2) # # print('='*100) # res3=next(g) # print('第三次的返回值:',res3) # # print('='*100) # res4=next(g) # print('第三次的返回值:',res4) # for item in g: #g=iter(g) #item=next(g) #for循环把g变成了生成器,然后item再执行next的功能,取下一个值,迭代下去。 # print(item) # i=range(1,1000) # for item in range(1,10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000): # print(item) #不管in后面有多少个值,都变成生成器,依次迭代下去,节省内存,同时电脑也不会卡 #取range范围里的值,再加步长。 # def my_range(start,stop,step=1): # while start < stop: # yield start # 暂停 # start+=step # g=my_range(1,5,2) #1 3 # print(next(g)) #next一次,执行一次,拿到一个返回值,直到把里面的值全部取完。 # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # print(next(g)) # for item in g: # print(item) #用for循环其实就是把上面的操作进行了一遍 #总结yield的功能 #1、提供一种自定义迭代器的方式 #2、yield可以暂停住函数,返回值 #yield VS return #相同点:都是用在函数内,都可以返回值,没有类型限制,没有个数限制 #不同点:return只能返回一次值,yield可以返回多次值 # 了解知识 # yield 值 # x=yield # x= yield 值 def dog(name): food_list=[] print('狗哥 %s 准备开吃' %name) while True: food=yield food_list#暂停 food=yield='一桶泔水' print('狗哥[%s]吃了<%s>' %(name,food)) food_list.append(food) alex_dog=dog('alex') res1=next(alex_dog) # 初始化,即让狗准备好 print(res1) # next(alex_dog) # 等同于alex_dog.send(None) # # next(alex_dog) res2=alex_dog.send(('一泡翔','咖啡伴侣')) print(res2) res3=alex_dog.send('一桶泔水') print(res3) #
#三元表达式 # 条件成立时的返回值 if 条件 else 条件不成立时的返回值 # def max2(x,y): # if x > y: # return x # else: # return y # x=10 # y=20 # res=x if x > y else y #中间写条件,左边写条件成立的值,右边写else成立的条件 # print(res) # 例如: # name='alex' # res='sb'if name=='alex' else 'nb' # print(res) # 列表生成式 # l=[item**2 for item in range(1,11)] #for循环出来的每一个值,写在前面,再加上所需要的条件,比如取出的值都算出它的平方 # print(l) # 例如把下面列表中的名字后面都加一个SB # 方法一:利用把值加到空列表的方法 # names=['alex','wxx','lxx'] # l=[] # for name in names: # l.append(name + 'SB') # names=l # 方法二:用列表生成式 # names=[name+'SB' for name in names] # print(names) #直接生成列表,把所需的条件加到for循环的左边。 #把下面除了egon,其他人后面都加上SB 的两种方法: # names=['alex','wxx','egon','lxx','zhangmingyan'] # l=[] # for name in names: # if name != 'egon': # l.append(name + 'SB') # names=l #方法二,用列表生成式的方法,左边写要实现的情况,右边写成立的条件 # names=[name+'SB' for name in names if name != 'egon'] # print(names) # l=[item**2 for item in range(1,5) if item > 2] # print(l) #把下面列表里的名字全都换成大写 # names=['egon','alex_sb','wupeiqi','yuanhao'] # names=[name.upper() for name in names] # print(names) # names=['egon','alex_sb','wupeiqi','yuanhao'] # #统计列表中不是以sb结尾的名字的长度。 # nums=[len(name) for name in names if not name.endswith('sb')] # print(nums) #字典生成式 # s1='hello' # l1=[1,2,3,4,5] # res=zip(s1,l1) # zip()可以吧两个可迭代对象,对应一一的配对,然后加入列表。列表里面是一个个小元祖[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)] # print(res) #打印出的是一个内存地址 # print(list(res)) #打印出[('h', 1), ('e', 2), ('l', 3), ('l', 4), ('o', 5)] # keys=['name','age','sex'] # values=['egon',18,'male'] # res=zip(keys,values) # print(list(res)) #[('name', 'egon'), ('age', 18), ('sex', 'male')] # print(list(res)) # d={} # for k,v in zip(keys,values): # zip()可以吧两个可迭代对象,对应一一的配对,然后加入列表。里面是一个个小元祖 # d[k]=v #k,v是解压缩 # print(d) # keys=['name','age','sex'] # values=['egon',18,'male'] # d={k:v for k,v in zip(keys,values)} #吧字典的key和value取出来后,再生成一个字典。 # print(d) # info={'name': 'egon', 'age': 18, 'sex': 'male'} # keys=info.keys() # print(keys) # iter_keys=keys.__iter__() # values=info.values() # print(values) #列表生成式 # d={k:v for k,v in zip(keys,values)} # print(d) # s={i for i in range(10)} # print(s,type(s)) #生成的是集合的形式{0, 1, 2, 3, 4, 5, 6, 7, 8, 9}# 生成器表达式 # g=(i for i in range(10)) # # print(g) #打印出一个生成器 # # print(next(g)) #next执行一下取一个值 # print(next(g)) # nums=[11,22,33,44,55] # print(max(nums)) # with open('a.txt',encoding='utf-8') as f: # nums=(len(line) for line in f) #外面加小括号,是刚造出来的列表,什么代码都不执行,要next才能执行代码,如果换成【】自动就在列表内,列表本来就有值的。 # print(max(nums)) # print(max(nums)) # print(max(nums)) # 题目:从文件中统计出每一行长度最长的并且打印出来。 # with open('a.txt','rt') as f: # nums=[len(line)for line in f] #最好不要用[],是因为,如果文件里的内容很大,很容易就把内存撑爆 # print(nums) # print(sum(nums)) #因为上面的方法,很容易内存撑爆,所以,我们把[]换成(),因为小()其实造出来的是一个生成器 # with open('a.txt',encoding='utf-8') as f: # nums=(len(line) for line in f) #外面加小括号,是刚造出来的列表,什么代码都不执行,要next才能执行代码,如果换成【】自动就在列表内,列表本来就有值的。 # print(max(nums)) #上面如果打印nums,其实打印出的是一个生成器。执行max()的时候是把nums变成迭代器,然后再执行next的功能。 # # print(max(nums)) # # print(max(nums)) l=['egg%s' %i for i in range(100)] print(l) g=('egg%s' %i for i in range(1000000000000)) # print(g) print(next(g)) #执行一次next,取一个值egg0 print(next(g)) #再取下一个值egg1