小白跟着大神学Python——Day11 生成器,匿名函数

时间:2021-07-06 22:40:06

生成器

生成器本质就是迭代器,生成器是自己用python代码写的迭代器。
一、如何构建一个生成器:
  1.生成器函数: 把return 改为yield
  2.生成器表达式 lst = (i for i in range(10)) ps:一个next 对应一个yield
二、yield return共同点和不同点: 不同点:return 终止函数,yield 不会终止生成器函数。 共同点:都会返回一个值,return给函数的执行者返回值,yield 是给next()返回值
三、send 不仅能对应yield取值,而且可以给上一个yield发送一个值   
#第一次取值能否用send传参?不能    除非你写的是genor.send(‘None’)可以用send作为第一个。   #最后一个yield 永远也得不到send传的值

yield from: 将一个可迭代对象变成一个迭代器返回 python3.5才出的
def func():
lst = ['太阳', '月亮', '星星', '银河']
yield from lst
genor = func()


print(next(genor))
print(next(genor))
print(next(genor))
for i in genor:
print(i)

列表推导式,生成器表达式(字典推导式等)

一、列表推导式:用一行代码构建简单,较复杂的列表。

三种模式:
1.循环模式 [变量(加工后的变量) for 变量 in iterable]
#print([i for i in range(1,101)])
#lst = ['12月%s号'%i for i in range(1,31)]
2.筛选模式 [变量(加工后的变量) for 变量 in iterable if 条件]
#print([i for i in range(1,31) if i % 3 == 0 ])
#print([i*i for i in range(1,31) if i % 3 == 0 ])
#print(['地球%s号'%i for i in range(1,100) if i % 2 == 1 ])
3.三元模式 #三元运算只能放前面
#print(['*'if i % 3 == 0 else i for i in range(1, 21)])
4.复杂 #多层嵌套
#names = [['Tom', 'Billy', 'Jefferson', 'Andrew', 'Wesley', 'Steven', 
'Joe'],['Alice', 'Jill', 'Ana', 'Wendy', 'Jennifer', 'Sherry', 'Eva']]
#print([name for l in names for name in l if name.count('e') >= 2])

总结:
优点:省代码,高逼格。
缺点:1.不能用debug模式,因为只有一行,无法调试内部的运行。

   2. 列表推导式有毒,任何列表都可以通过常规构建去构建,复杂的列表不能通过列表推导式。


二、生成器表达式

与列表推导式几乎一摸一样 ,将[]换成()
#lst = ['今天 %s 号'%i for i in range(1,26)]    #列表推导式[]
#genor = ('今天 %s 号'%i for i in range(1,26))  #生成器表达式()
#print(gentor)
#for i in gentor:
#    print(i)


三、字典推导式, 集合推导式,(元组没有推导式)

#字典:
#mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15}
#m = {v: k for k, v in mcase.items()}
#集合:
#set1 = {1, -2, -3, 4, 2}
#set2 ={i**2 for i in set1}
#print(set2)

 匿名函数lambda

针对于类似def func(x+y): return x+y ,只有返回值得这样的函数:
python提供一个函数可以使用。
func2 = lambda x,y: x + y
print(func2(3,4))
多于内置函数相结合。,如min(dic,key = lambda x:dic['values'])