zoukankan      html  css  js  c++  java
  • 【摘】人生苦短,每日python

    python和它的迭代器

    有代码如下:

    class CountDown(object):
    
        def __init__(self, step):
    
            self.step = step
    
        def __next__(self):
    
            if self.step <= 0:
                raise StopIteration
            self.step -= 1
            return self.step
    
        def __iter__(self):
    
            return self
    
    if __name__ == '__main__':
    
        for e in CountDown(4):
            print(e)
    

    当调用for时,
    先调用了CountDown的 iter(),
    每一次循环则调用了CountDown的 next()

    这个过程就像下面一样

    >>> i = iter('43210')
    >>> next(i)
    '4'
    >>> next(i)
    '3'
    >>> next(i)
    '2'
    >>> next(i)
    '1'
    >>> next(i)
    '0'
    >>> next(i)
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    StopIteration
    

    python和它的生成器

    如果要实现斐波那契数列,该如何实现呢?

    不用生成器的话,会写下面的代码

    def fibonacci(i):
    
        if i == 1 or i == 2:
            return 1
        elif i > 2:
            return fibonacci(i-1) + fibonacci(i-2)
        else:
            raise Exception('非法参数')
    
    
    if __name__ == '__main__':
    
        print(fibonacci(1))
        print(fibonacci(2))
        print(fibonacci(3))
        for i in range(10):
            print(fibonacci(4+i))
    

    使用生成器的话,会写下面的代码

    def fibonacci():
        
        a, b = 0, 1
        while True:
            yield b
            a, b = b, a + b
    
    if __name__ == '__main__':
        
        fib = fibonacci()
        print(next(fib))
        print(next(fib))
        print(next(fib))
        for _ in range(10):
            print(next(fib))
    

    其结果都是

    1
    1
    2
    3
    5
    8
    13
    21
    34
    55
    89
    144
    233
    

    基于yield语句,生成器可以暂停函数并返回一个中间结果。该函数会保存执行上下文,稍后在必要时可以恢复。
    其中fib,是generator对象,一个特殊的迭代器。

    摘自 《Python高级编程》

  • 相关阅读:
    《数据结构与算法Python语言描述》习题第二章第三题(python版)
    mysql中的视图
    mysql中列的增删改
    php隐藏WEBSHELL技巧
    php webshell常见函数
    MySQL join 用法
    BurpSuite 设置Hostname Resolution
    Linux mint 18.1 / Ubuntu 16.04 安装steam
    Linux SCIM/fcitx/ibus 输入法
    mysql 复制表结构 / 从结果中导入数据到新表
  • 原文地址:https://www.cnblogs.com/featherw/p/10305442.html
Copyright © 2011-2022 走看看