生成器和生成推导公式器函数 列表的
1,生成器:生成器实质就是迭代器,在python中有三中方法来获取生成器
- 1.1>通过生成器函数来创建生成器
def func(): print("111") yield 222 # 函数中包含了yield就是生成器(在特定的位置上)这个函数称为生成器函数 ret = func() # 获取到一个生成器 print(ret) # 此时打印出来的是一个内存地址 <generator object func at 0x000001CABE64BCA8> def func(): print(111) yield 222 ret = func() print(ret.__next__()) # 通过__next__把yield的东西接住并打印出来(只能接一个yield值,当yield有多个值组成一个tuple) def func(): print(ret.__next__()) # 当函数执行到一个yield print(ret.__next__()) # 从第一个结束执行到第二个yield
- 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, 在执行第四个yield print(ret4) # 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)
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) # {'麻花藤', '张建忠', '马云', '王思聪'}自动去重