zoukankan      html  css  js  c++  java
  • python 生成器 和 迭代器

    一、生成器

      有两种方法生成迭代器

        1、把一个列表生成式的[]改成()

    1 it = (x*x for x in range(10))
    2 print (it) #<generator object <genexpr> at 0x02CEAF60>
    3 print (next(it)) #调用生成器的内部next方法
    4 print (next(it))

        2、在函数中使用yield关键字,使函数变成一个生成器。

        最简单生成器

     1 def foo():
     2     print ('t1')
     3     yield 1      # 迭代器的返回值
     4     print ('t2')
     5     yield 2      # 迭代器返回第二个值
     6 
     7 f = foo()
     8 next(f)  #在python3中调用next方法,获取生成器返回值
     9 next(f)
    10 next(f) #超过迭代范围,返回StopIteration异常

       使用send方法向生成器传参数

     1 def bar():
     2     print ('test content1...')
     3     var = yield 1
     4     print ('test content2...')
     5     print (var)
     6     yield 2
     7 b = bar()
     8 print (b.send(None)) 
     9 print (b.send('test_var'))
    10 # 
    11 # test content1...
    12 # 1 #第一次yield回来的值
    13 # test content2...
    14 # test_var #第二次send才能船传值,且在第一个yield时接收
    15 # 2 #第二次yield回来的值。

    二、 迭代器

      Python的迭代协议要求一个 __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

    1 it = iter([1,2,3]) #使用iter()函数创建迭代器。
    2 print (next(it))
    3 print (next(it))
    4 print (next(it))
    5 print (next(it))   #迭代器的值都已经返回,再次调用就会报错StopIteration异常。

    for循环的内部在干什么?

    class Bar:
    
        def __init__(self, n):
            self.n = n
    
        def __iter__(self):
            return self
    
        def __next__(self):
            if self.n == 8:
                raise StopIteration('no n number!!!!')
            self.n += 1
            return (self.n)
    
    b = Bar(4)
    print (next(b))
    print (next(b))
    print (next(b))
    print (next(b))
    print (next(b))
    
    # for i in Bar(0):
    #     print (i)
  • 相关阅读:
    设计者模式详解--代理模式
    设计者模式详解--适配器模式
    设计者模式详解--原型模式
    设计者模式详解--建造者模式
    设计者模式详解--单例模式
    设计者模式详解--抽象工厂模式
    设计者模式详解--工厂方法模式
    angularjs 选项卡 --- 自定义属性
    AngularJS 自定义指令
    Jquery中的prop()方法 全选或全不选
  • 原文地址:https://www.cnblogs.com/qikang/p/8628972.html
Copyright © 2011-2022 走看看