生成器函数、生成器表达式、推导式、

1.生成器

实质就是迭代器

2.获取生成器的三种方式

 1.通过生成器函数来获取   将函数中的return换成yield就是⽣生成器

def func():
    print("111")
    yield 222
geener=func()#获取到生成器
ret=geener.__next__()#函数开始执行
print(ret)

那么我们可以看到, 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)

执行第三次的话就会报错
ret3
= gener.__next__() # 最后一个yield执⾏完毕. 再次__next__()程序报错, 也就是 说. 和return⽆无关了了. print(ret3)

 2.通过各种推导式来实现生成器  

 3.通过数据转换获取生成器

生成器的作用:

 
 
def cloth():
for el in range(0,10000):
yield "衣服"+str(el)
c=cloth()#获取生成器
print(c.__next__())#开始执行函数,一次一次执行
print(c.__next__())
print(c.__next__())
print(c.__next__())
print(c.__next__())
print(c.__next__())
 

根据生成器的惰性特点,他是一个一个向下指,需要多少就指多少,不会一次全部拿出来,节省内存 _next_指哪去哪

send和__next__()区别:
1. send和next()都是让⽣生成器向下走⼀一次
2. send可以给上⼀一个yield的位置传递值, 不能给最后⼀一个yield发送值. 在第⼀一次执⾏行行⽣生
成器代码的时候不能使⽤用send()

 生成器可以使用for循环来获取内部的元素:

def user ():
    print("111")
    yield 222
    print("333")
    yield 444
    print("555")
    yield 666
gen = user()
for el in gen:
    print(el )

生成器表达式的语法

[想要的结果,for循环,if判断]

列表推导式
求0-100以内的偶数
lst=[el for el in range(1,100)if el% 2==0] print(lst)
列表推导式
求1-100以内能被3整除的数
gen=(el for el in range(1,100) if el %3==0)
for num in gen:
    print(num )

⽣生成器表达式和列列表推导式的区别:
1. 列列表推导式比较耗内存. ⼀次性加载. ⽣成器表达式几乎不占⽤内存. 使⽤的时候才分
配和使用内存
2. 得到的值不⼀样. 列表推导式得到的是一个列表.生成器表达式获取的是一个生成器.

猜你喜欢

转载自www.cnblogs.com/wqzn/p/9470398.html
今日推荐