zoukankan      html  css  js  c++  java
  • Python:迭代器、生成器(yield)、iter函数

    # 首先理解迭代器(iterators),迭代器是⼀个让程序员可以遍历的⼀个容
    # 器(特别是列表)的对象。然⽽,⼀个迭代器在遍历并读取⼀个容器的数据元素时,并不
    # 会执⾏⼀个迭代。这里有三个部分要说明:
    # 可迭代对象(Iterable)
    # 迭代器(Iterator)
    # 迭代(Iteration)
    # 可迭代对象(Iterable):⼀个可迭代对象是Python中任意的对象,只要它定义了可以返回⼀个迭代器的__iter__
    # ⽅法,或者定义了可以⽀持下标索引的__getitem__⽅法。简单说,⼀个可迭代对象,就是任意的对象,只要它能给我们提供⼀个迭代器。
    # 只要它定义了⼀个next(Python2) 或者__next__⽅法。就是⼀个迭代器。
    # ⽣成器也是⼀种迭代器,但只能对其迭代⼀次。这是因为他们并没有把所有的值存在
    # 内存中,⽽是在运⾏时⽣成值。可使用for循环、传递给任意可进行迭代的函数和结构。
    # 大多数时候,生成器是以函数来实现的,并不返回一个值,而是yield(暂且叫作”生出“)一个值。
    1 def generator_function():
    2    """定义一个生成器函数"""
    3    for i in range(10):
    4       yield i
    5 
    6 #调用生成器,以证实是一个可迭代对象
    7 # for item in generator_function():
    8 #  print(item)
    # 许多Python 2⾥的标准库函数都会返回列表,⽽Python 3都修改成了返回⽣成器,因为⽣成
    # 器占⽤更少的内存资源。

    1 # 计算斐波那契数列的⽣成器
    2 def fibon(n):
    3    a = b = 1
    4    for i in range(n):
    5       yield a
    6       a, b = b, a + b
    7 
    8 for x in fibon(100):
    9   print(x)
    # 使用python的内置函数next()获取序列的下一个元素,到最后一个元素时,会抛出一个StopIteration的异常
    # 使用for循环获取序列的下一个元素时,for循环会自动捕捉这个异常并停止调用next()。
    1 def generator_function():
    2    for i in range(3):
    3       yield i
    4 
    5 # gen = generator_function()
    6 # print(next(gen))
    7 # print(next(gen))
    8 # print(next(gen))
    9 # print(next(gen))    # 验证,使用next()函数到所有值被yield完后会抛出一个StopIteration的异常

    # 字符串类型也支持迭代,但不是迭代器,如下所示
    my_string = "Michael"
    #next(my_string) # 不是迭代器,不能使用next()函数,抛出TypeError。
    # 但使用另一个内置函数iter()转换后,可以使用next()函数迭代
    my_iter = iter(my_string)
    print(next(my_iter)) # 经过iter()内置函数转换后,字符串对象可以迭代。

  • 相关阅读:
    allocation size overflow
    数据库隔离级别深入理解(ORACLE)
    查看Orcale数据里的表是否有变化
    意外发现抽象类的构造器
    C语言学习快速笔记
    由javascript的闭包引申到程序语言编译上的自由变量作用域的考量
    easyui的datagrid的列checkbox自定义增加disabled选项
    数据库连接不关闭造成的问题以及RowSet的使用
    Quartz的JobDetail没有触发器指向时会被删除的问题
    发现浏览器开发工具的一个小问题
  • 原文地址:https://www.cnblogs.com/Micro0623/p/9950528.html
Copyright © 2011-2022 走看看