Python-生成器进阶2

今日内容:

生成器进阶内容:

计算移动平均值(例子)

def wrapper(func): # 生成器预激装饰器
      def inner(*args,**keargs):
            g = func(*args,**keargs)
            g.__next__()
            return g
      return inner
@wrapper
def average_func():
      total = 0
      count = 0
      average = 0
      while True:
            value = yield average
            total += value
            count += 1
            average = total/count
g = average_func()
print(g.send(30))

 

send关键字:

  首先,send和next工作的起止位置是完全相同的

  send可以把一个值作为信号量传递到函数中去

  在生成器执行伊始,只能使用next

  只能用send传递参数的时候,必须在生成器中有一个未被返回的yield

列表推导式和生成器表达式:

new_l = []
for i in [1,3,5]:
      new_l.append(i*i)
print(new_l)

#下边是列表推导式
print([i*i for i in [1,3,5]])

总结:

  1.把列表解析的[]换成()得到的就是生成器表达式

  2.列表解释与生成器表达式都是一种遍历方式,只不过生成器表达式更节省内存

  3.Python不但使用迭代器协议,让for循环变得更加通用。大部分内置函数,也是使用迭代器协议访问对象的。

  例如, sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接这样计算一系列值的和

sum(x ** 2 for x in range(4))

到这里,两天的迭代器和生成器就写完了。

本章小结:

可迭代对象:

    拥有__iter__方法

    特点:惰性运算

    例如:range(),str,list,tuple,dict,set

迭代器Iterator:

    拥有__iter__方法和__next__方法

    例:

      iter(range()),iter(str),iter(list),iter(tuple),iter(dict),iter(set)等

生成器Generator:

    本质:迭代器,所以拥有__iter__方法和__next__方法

    特点:惰性运算,开发者自定义

使用生成器的优点:

1.延迟计算,一个返回一个结果,也就是说,她不会一次生成所有的结果,这对于大数据处理,将会非常有用。

#列表解析
sum([i for i in range(100000000)])#内存占用大,机器容易卡死

#生成器表达式
sum(i for i in range(100000000))#几乎不占内存

2.提高代码可读性

生成器相关的面试题:

def demo():
    for i in range(4):
        yield i

g=demo()

g1=(i for i in g)
g2=(i for i in g1)

print(list(g1))
print(list(g2))

def add(n,i):
    return n+i

def test():
    for i in range(4):
        yield i

g=test()
for n in [1,10]:
    g=(add(n,i) for i in g)

print(list(g))

面试题2

 

posted @ 2017-09-05 19:31  程先生_Python  阅读(114)  评论(0)    收藏  举报