1,生成器:生成器实质就是迭代器,在python中有三中方法来获取生成器
1.1>通过生成器函数来创建生成器
列如:def func():
print("111")
yield 222 ................................函数中包含了yield就是生成器(特定在return的位置)这个函数称为生成器函数
ret = func() ....................................获取到一个生成器
print(ret).............................................此时打印出来的是一个内存地址,不是去执行函数
列如:def func():
print(111)
yield 222
ret = func()
print(ret.__next__())..............................通过__next__把yield的东西接住并打印出来(只能接一个yield的值,当yield有多个返回值时组成一个tuple)
列如:def func():
print(666)
yield 555
print(111)
yield 333
ret = func()
print(ret.__next__())......................从函数执行到第一个yield
print(ret.__next__()).......................从第一个yield结束执行到第二个yiield
return和yield的区别:
1>二者都是返回值
2>rturn是返回值以后程序就直接停止运行了,而yield则是返回值以后当执行下一次时就会运行程序,而不会停止(分段执行函数,直到函数执行完yield)
1.2>生成器的执行方式:__next__()和send()
列如:def eat():
print("我吃什么啊")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "GAME OVER"
gen = eat() # 获取⽣生成器............................先获取生成器
ret1 = gen.__next__() .........................................向下执行一个yield
print(ret1) ........................................................此时打印的结果是:我吃什么啊, 馒头
ret2 = gen.send("胡辣汤") .................................先把"胡辣汤"发送给a,再执行第二个yield
print(ret2) .........................................................此时打印的结果是:a = 胡辣汤 ,大饼
ret3 = gen.send("狗粮") .....................................把"狗粮"发送给b, 在执行第三个yield
print(ret3) .......................................................此时打印的结果是:b = 狗粮 ,韭菜盒子
ret4 = gen.send("猫粮") .........................................把"猫粮"发送给c 再执行第4个yield
print(ret4)...............................................................此时打印的结果是:c = 猫粮, GAME OVER
send()和__next__()的区别:
1>二者都有生成器向下走的功能
2>send()可以给上一个yield传递值,因此在第一次执行生成器时不能使用send(),值传不上去.最后一个yield也不用传值.
1.3>生成器是可迭代的对象,所以能够进行for循环.
列如:def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func() .....................................获取迭代器,生成迭代器函数
for i in gen: .......................................对迭代器进行for循环
print(i)............................................此时打印结果是:111 222 333 444 555 666
2,列表推导式,生成器表达式及其他推导式
2.1>列表推导式:
lst = [].............................................构建一个新列表
for i in range(1,14):..........................利用for循环把1-13遍历出来
lst.append(i)...............................把遍历出来的每一个i都加到列表中
print(lst)..........................................打印列表
用列表推导公式:
lst = [i for i in range(1,14)]......................................列表推导式
print(lst)
列表推导式其实就是把构建成列表的每个步骤拍碎了直接放到列表中,去构建(是把每一步放到1行中去构建)
lst = [变量 for 变量 in 可迭代函数 if 判断条件]
print(lst)
gen = (变量 for 变量 in 可迭代对象)........................生成器表达式(可以使用for循环遍历出生成器函数里边的内容,也可以判断)
print(gen)...............................................................是这个生成器的内存地址.
2.2>生成器表达式和列表推导式的区别:
1>列表推导式比较耗内存,一次性加载完毕,生成器表达式几乎不占用内存,使用的时候才往出拿值这时才分配内存
2>所得到的值不一样,列表推导式是的到的一个列表,生成器表达式得到的是一个生成器.生成器和迭代器一样具有惰性机制,***当只有用它的时候,他才会返回一个值***
3,字典的推导式:
3.1> dic = {"a":1,"b":2}
new_dic = {dic[key]:key for key in dic}...................去构建一个新字典,还是把构建新字典的每一步都拍碎放到一行
print(new_dic)
3.2> lst1 = ["jay","jj"."joly"]
lst2 = ["周杰伦","林俊杰","蔡依林"]
dic = {lst1[i]:lst2[i] for i in lst1}..........................有映射关系,先找到他们的索引,就可以了
4,集合的推导式:集合推导式具有自动去重功能:
lst = ["马化腾","马云","马化腾","张建忠","张建忠","王思聪",]
set = {i for i in lst}
print(set)....................................此时打印结果是:("马化腾","马云","张建忠","王思聪")
print(dic)