python-生成器

  

# 生成器 —— 迭代器
作用
内存使用更加高效
# 生成器函数
yield与return不能共用且需要写在函数内
# 含有yield关键字的函数都是生成器函数
# 生成器函数的特点
#调用之后函数内的代码不执行,返回生成器
#每从生成器中取一个值就会执行一段代码,遇见yield就停止。
#如何从生成器中取值:
# for :如果没有break会一直取直到取完
# next :每次只取一个
# send :不能用在第一个,取下一个值的时候给上个位置传一个新的值
# 数据类型强制转换 :会一次性把所有数据都读到内存里
生成器函数与一般函数的不同
生成器函数包含一个或者多个yield
当调用生成器函数时,函数将返回一个对象,但是不会立刻向下执行
像__iter__()和__next__()方法等是自动实现的,所以我们可以通过next()方法对对象进行迭代
一旦函数被yield,函数会暂停,控制权返回调用者
局部变量和它们的状态会被保存,直到下一次调用
函数终止的时候,StopIteraion会被自动抛出
 1 def generator():
 2     print(1)
 3     n = yield 2
 4     print(n)
 5     print(3)
 6     arg = yield
 7 
 8 
 9 g = generator()
10 print('gg ' + str(g.__next__()))
11 print('gg ' + str(g.send('hahaha')))
12 
13 
14 # send 获取下一个值的效果和next基本一致
15 # 只是在获取下一个值的时候,给上一yield的位置传递一个数据
16 # 使用send的注意事项
17 #     第一次使用生成器的时候 是用next获取下一个值
18 #     最后一个yield不能接受外部的值
send与next
 1 # 获取移动平均值
 2 def averager():
 3     sum = 0
 4     count = 0
 5     avg = 0
 6     while True:
 7         sum += yield avg
 8         count += 1
 9         avg = sum / count
10 
11 
12 g = averager()
13 print(g.__next__())
14 print(g.send(12))
15 print(g.send(22))
16 
17 
18 # 预激生成器的装饰器
19 def decorator_init(fun):
20     def inner(*args, **kwargs):
21         g = fun(*args, **kwargs)
22         g.__next__()
23         return g
24 
25     return inner
26 
27 
28 @decorator_init
29 def averager():
30     sum = 0
31     count = 0
32     avg = 0
33     while True:
34         sum += yield avg
35         count += 1
36         avg = sum / count
37 
38 
39 g = averager()
40 print(g.send(10))
41 print(g.send(11))
预激生成器的装饰器
 1 # yield from
 2 def generator():
 3     a = '1234'
 4     for i in a:
 5         yield i
 6 
 7 
 8 def generator2():
 9     a = '1234'
10     yield from a  # 同 for i in a: yield i
11 
12 
13 for i in generator():
14     print(i)
15 
16 for i in generator2():
17     print(i)
yield from
    # 生成器表达式
# (条件成立想放在生成器中的值 for i in 可迭代的 if 条件)
(x for x in range(5))
  # 列表推导式
    [x for x in range(5)]
  # 字典推导式
 1 # 字典推导式
 2 # 例一:将一个字典的key和value对调
 3 dic = {'k1': 'v1', 'k2': 'v2'}
 4 dic_ = {dic[k]: k for k in dic}
 5 print(dic_)
 6 
 7 # 例二:合并大小写对应的value值,将k统一成小写
 8 mcase = {'a': 10, 'b': 34, 'A': 7, 'Z': 3}
 9 dic = {k.lower():mcase.get(k.lower(), 0) + mcase.get(k.upper(), 0) for k in mcase}
10 print(dic)
字典推导式
  # 集合推导式(无序,自带去重功能)
1 # 集合推导式
2 # 例:计算列表中每个值的平方,自带去重功能
3 squared = {i**2 for i in {1,2,1,4,-1}}
4 print(squared)
集合推导式

 

posted @ 2018-09-19 23:20  写bug的日子  阅读(149)  评论(0编辑  收藏  举报