python生成器和推导式

一.生成器
什么是生成器.生成器实质就是迭代器.
在python中有三种方式来获取生成器:
1.通过生成器函数
2.通过各种推导式来实现生成器
3.通过数据的装换也可以获取生成器
def func():
print("111")
return 222
ret = func()
print(ret)
结果:111
222

将函数中的return换成yield就是生成器
def func()
print(“111”)
yield 222
ret = func()
pritn(ret)

结果:<generator object func at 0x000000000219A390>
运行的结果和上面的不一样。由于函数中存在了yield。这个函数就是一个生成器函数
当我们在执行这个函数的时候,就不再是函数的执行的,而是获取这个生成器。

# def func():
# print("111")
# yield 222
# gener = func() #这个时候函数不会执行,而是获取生成器.
# ret = gener.__next__() #这个时候函数才会执行.yield和retunr的作用一样都是返回函数
# print(ret)
# 结果:
# 111
# 222

#yield和return的区别:yield是分段执行一个函数.return直接停止执行函数
# def func():
# print("111")
# yield 222
# print("333")
# yield 444
# gener = func()
# ret = gener.__next__()
# print(ret)
# ret2 = gener.__next__()
# print(ret2)
# 结果:
# 111
# 222
# 333
# 444

当程序运行完最后一个yield,后面继续进行--next--()程序会报错

生成器的应用:
# def cloth():
# lst = []
# for i in range(0,10000):
# lst.append("衣服"+str(i))
# return lst
# cl = cloth()
# print(cl) #一次把衣服全部提取出来 ,特别占内存

# def cloth():
# for i in range(0,1000):
# yield "衣服"+str(i)
# cl = cloth()
# print(cl.__next__()) #衣服0
# print(cl.__next__()) #衣服1
#区别:第一种是直接一次性全部拿出来.会很占用内存,第二种使用生成器,一次就一个
#用多少生成多少.生成器是一个一个的指向下一个.不会回去,__next__到哪,指针就指到哪里。


def eat():
print("吃什么")
a = yield "馒头"
print("a=",a)
b = yield "大饼"
print("b=",b)
c = yield "韭菜盒子"
print("c=",c)
yield "game"
gen = eat() #获取生成器
ret1 = gen.__next__()
print(ret1)
ret2 = gen.send("胡辣汤")
print(ret2)
ret3 =gen.send("狗粮")
#打印结果:
# 吃什么
# 馒头
# a= 胡辣汤
# 大饼
# b= 狗粮
#send()和__next__()区别:
#1.send和next()都是让生长器向下走一次
#2.send可以给上一个yield的位置传递值,不能给最后一个yield发送值
# 在第一次执行生成器时候不能使用send()

#生成器可以使用for循环来获取内部的元素:
def func():
print(111)
yield 222
print(333)
yield 444
print(555)
yield 666
gen = func()
for i in gen:
print(i)
#结果:
# 222
# 333
# 444
# 555
# 666

#二.列表推导式,生成器表达式
# lst = []
# for i in range(1,15):
# lst.append(i)
# print(lst) # [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
#替换成列表推导式:
lst = [i for i in range(1,15)]
print(lst) #[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14]
#列表推导式是通过一行来构建列表

字典的推倒式:

# lis1 = ["tabai","wusir"]
# lis2 = ["henbai","hense"]
# dic = {lis1[i]:lis2[i] for i in range(len(lis1))}
# print(dic) # {'tabai': 'henbai', 'wusir': 'hense'}

集合推导式:
lst = ["马化腾", "马化腾", "王建忠", "张建忠", "张建忠", "张雪峰", "张雪峰"]

s = {i for i in lst} # 集合推倒式
print(s)

猜你喜欢

转载自www.cnblogs.com/caodneg7/p/9332662.html