生成器
生成器本质就是迭代器,生成器是自己用python代码写的迭代器
将函数变成生成器
yield
用next 取值
一个next,对应一个yield
def func(): yield 111 yield 222 yield 333 ret = func() # print(ret) print(next(ret)) # 111 一个next取一个yield值,超出会报错 print(next(ret)) # 222
import time def genrator_fun1(): a = 1 print('现在定义了a变量') yield a b = 2 print('现在又定义了b变量') yield b g1 = genrator_fun1() print('g1 : ',g1) #打印g1可以发现g1就是一个生成器 print('-'*20) #我是华丽的分割线 print(next(g1)) time.sleep(5) #sleep一秒看清执行过程 print(next(g1))
生成器好处:
不会一下子在内存中生成太多数据
yield return共同点和不同点:
return 终止函数,yield不会终止生成器函数
都会返回一个值,return给函数的执行者返回值,yield是给 next() 返回值
send next
send 不仅能对应yield取值,而且可以给上一个yield发送一个值
1、不能给第一个yield传值
2、最后一个yield永远得不到send传的值
def func(): a = yield 111 print('a=', a) b = yield 222 print('b=',b) yield 333 reg = func() print(next(reg)) #第一位,打印第一个yield print(reg.send('alex')) #在第二位,传值给第一位, a=alex 并打印222 print(reg.send('echo')) #在第三位,传值给第二位,b=echo 并打印 333
yield from (了解)
将一个可迭代对象变成一个迭代器返回
# 没有from def func(): lst = ['alex', 'echo', 'nice', 'great'] yield lst genor = func() print(next(genor)) # ['alex', 'echo', 'nice', 'great'] for i in genor: print(i) # ['alex', 'echo', 'nice', 'great']
# 有from def func(): lst = ['alex', 'echo', 'nice', 'great'] yield from lst genor = func() # print(next(genor)) # alex 只打印第一个 for i in genor: print(i) # alex echo nice great 一个一个出
列表推导式:
用一行代码构建简单,较复杂的列表
优点:节省代码行数
缺点:1、不能使用debug模式
2、任何列表都可以通过常规构建去构建,复杂的列表不能通过列表推导式构建
l1 = [i for i in range(100)] print(l1)
分三种情况:
1、循环模式。 [ 变量(加工后的变量) for 变量 in iterable ]
l1 = [i for i in range(100)] # 变量 print(l1) l1 = ['python%s期' % i for i in range(1, 25)] # 加工后的变量 print(l1)
2、三元模式(循环模式的变种)
# 构建一个列表:列表里面的元素是1~20,但是能被3整除元素替换成*。 print(['*' if i % 3 ==0 else i for i in range(1,21)]) # 有else, if在for前面
# 将至少含有两个e的名字放到一个列表中 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]) # 没有else 则if放后面
3、筛选模式 [ 变量(加工后的变量) for 变量 in iterable if 条件]
# 30以内,能被3整除的数加入列表 l1 = [i for i in range(1, 31) if i % 3 == 0 ]
# 30以内能被3整除的数的 平方 l1 = [i*i for i in range(1, 31) if i % 3 == 0] print(l1)
生成器表达式
与列表推导式几乎一模一样,就是[] 换成()
gentor = ('python%s期' %i for i in range(1,26)) print(gentor) for i in gentor: print(i)
字典推导式,集合推导式 (了解)
# {1: None, 2: None, 3: None, 4: None, 5: None} print({i:None for i in range(1,6)}) # 将mcase列表键值调换 mcase = {'a': 10, 'b': 34, 'c': 20, 'd': 15} print({value:key for key,value in mcase.items()})
针对只有返回值的这样的函数:python提供了一个函数可以简化,匿名函数
匿名函数,一行函数
#两个函数都是让用户输入两个值,然后相加,输出结果 def func(x, y): return x + y func2 = lambda x,y: x + y print(func2(3,4))