函数 生成器 生成器表达式

一,生成器

生成器实质就是迭代器。

如何获取生成器:

1,通过生成器函数

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

3,通过数据的转换也可以获取生成器

函数:

1 def order():
2     lst = []
3     for i in range(10000):
4         lst.append('衣服'+str(i))
5     return lst
6 ll = order()

生成器函数:

1 def order():
2     for i in range(10000):
3         yield '衣服'+str(i)
4 g = order()
5 wanghua = g.__next__()
6 print(wanghua)
7 zhangyining = g.__next__()
8 print(zhangyining)

区别:第一种是一次性全部拿出来,会很占用内存。第二种使用生成器。一次性只取一个,用多少取多少。生成器是一个一个的指向下一个。不会回去,__next__()到哪,指针就指到哪儿。下一次继续获取指针指向的值。

 

send()和__next__()都可以让生成器执行到下一个yield.

 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 'GAME OVER'
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发送值。在第一次执行生成器代码的时候不能使用send()

 1 def func():
 2     yield 1
 3     yield 5
 4     yield 24
 5     yield 55
 6     yield 56
 7     yield 78
 8 func()
 9 for i in func():
10     print(i)
11 print(list(func()))

二,列表推导式,生成器表达式以及其他推导式:

1,列表推导式[结果 for循环 条件筛选]

1 lst = []
2 for i in range(100):
3     if i % 2 == 0:
4         lst.append(i)
5 print(lst)
6 
7 lst = [i for i in range(100) if i % 2 == 0]
8 print(lst)

 

2,字典推导式{k:v for循环  条件筛选}

dic = {'jj': '林俊杰', 'Jay': '周杰伦', 'Angelababy': '杨颖', 'Nikolas': '赵四'}
dic1 = {v: k for k, v in dic.items()}
print(dic1)

3,集合推导式{k  for循环  条件}

1 lst = [1,1,1,3,5,9,4,4,5,8,6,2,4,4,7,9,5,1,4,8,5,41,47,7,8,5]
2 set = {el for el in lst}
3 print(set)

 

 生成器表达式:

(结果 for循环 条件)

特点:

1,惰性机制

2,只能向前

3,节省内存(鸡蛋)

1 def func():
2     print(111)
3     yield 222
4 g = func()
5 g1 = (i for i in g)
6 g2 = (i for i in g1)
7 print(list(g))
8 print(list(g1))
9 print(list(g2))

经典题型:

 1 def add(a, b):
 2     return a + b
 3 def test():
 4     for r_i in range(10):
 5         yield r_i
 6 g = test()
 7 
 8 for n in [1, 10, 10, 10, 10, 10, 10, 10]:
 9     g = (add(n, i) for i in g)
10 
11 print(list(g))

 

posted @ 2018-08-13 17:57  Ryan_Liu_lgl  阅读(1534)  评论(0编辑  收藏  举报