生成器,推导式,..

1.生成器

def func():
print("111")
yield 222
print("333")
yield 444
print(func())


 


 

 

 

1 def func():
2     print("111")
3     yield 222
4 ret=func()
5 res=ret.__next__()
6 
7 print(res)

这里ret=fun 不会执行函数,拿到的是生成器  有了生成器才可以进行下一个  

1 def cloth():
2     for i in range(0,10000):
3         yield "衣服"+str(i)
4 cl=cloth()
5 print(cl.__next__())
6 print(cl.__next__())
7 print(cl.__next__())

这里为什么要用到生成器呢 以为他的惰性 如果一次性出了全部的数字,那么多的内存会没有地方反而占用更大空间

由于和迭代器一样的属性,用一个出一个才会是最完美的方法

 

 

2.send

 1 def eat():
 2     print("我吃什么啊")
 3     a=yield "馒头"
 4     print("a",a)
 5     b=yield "大饼"
 6     print("b",b)
 7     c=yield  "韭菜盒子"
 8     print("c",c)
 9     yield  "gameover"
10 gen=eat()
11 ret1=gen.__next__()
12 print(ret1)
13 ret2=gen.send("胡辣汤")
14 print(ret2)
15 ret3=gen.send("狗粮")
16 print(ret3)
17 ret4=gen.send("猫粮")
18 print(ret4)

 

send()和__next__() 的区别:

1.send 和next()都是要生成器走向下一次

2.send可以给上一个yield 的位置传递值,不能给最后一个yield 发送值,在第一次执行生成器代码的时候不能使用seng()

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

 1 def func():
 2     print(111)
 3     yield 222
 4     print(333)
 5     yield 444
 6     print(555)
 7     yield 666
 8 gen = func()
 9 for i in gen:
10     print(i)

 

2.列表推导式

一句话 生成一个列表

语法:[  结果    for 循环   ]

1 lst=[i for  i  in  range(1,15)]
2 print(lst)

生成器表达式

1 gen=(i for i in range(15))
2 print(gen)

 

生成器表达式和列表推导式的语法基本上一样的,只是把[]换成{}

区别:

1.列表推导式比较耗内存,一次加载,生成器表达式几乎不占用内存,

2.得到的值不一样,生成器只有在访问的时候才取值,说白了,你找他要他才给你值,不找他要,是不会执行的

 

posted @ 2018-08-13 17:29  逆欢  阅读(100)  评论(0编辑  收藏  举报