python生成器推导式_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)

结果:

运行的结果和上面的不一样。由于函数中存在了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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值