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

    #列表生成式

    #列表生成式
    m = [x for x in range(10)]  #[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
    print(m)

    def add(n):
        return n*2
    
    s = [add(x) for x in range(10)]
    print(s) #[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]

    生成器:两种创建方式

    #方式一:
    s = (x for x in range(100)) #生成器取值下面两种方式等价 # m = s.__next__() print(next(s)) # 0 print(next(s)) # 1 #也可以用for循环 for i in s: #生成器就是可以可迭代对象 print(i)
    #方式二:yield
    def
    foo(): yield 1 print(foo()) #<generator object foo at 0x000001A11A30FF10> 生成器对象 for i in foo(): print(i) #打印出一个1

    可迭代对象:对象拥有iter方法的

    #斐波拉契数列

    def fib(max):
        n,before,after = 0,0,1
        while n < max:
            yield before
            before,after = after,after+before
            n = n + 1
    
    
    print(fib(8)) #<generator object fib at 0x000001DC7CF54888>
    
    m = fib(8)
    for i in m:
        print(i)
    #打印结果
    #0
    #1
    #1
    #2
    #3
    #5
    #8
    #13

     生成器都是迭代器,迭代器不一定是生成器

    迭代器满足两个条件
    1.有iter方法
    2.有next方法
    l = [1,3,2]
    m = iter(l) #<list_iterator object at 0x000002DBDC60D208>  返回一个迭代器对象
    print(next(m)) #1
    print(next(m)) #3
    for 循环内部三件事:
    1.调用可迭代对象的iter方法返回一个迭代器对象
    2.不断调用迭代器对象的next方法
    3.处理StopIteration异常

    凡是可作用于for循环的对象都是Iterable类型;

    凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

    集合数据类型如list、dict、str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。



  • 相关阅读:
    [转]java抽象类和接口和继承之间关系
    HTML accesskey 属性
    [转]OGNL使用小结
    [转] iBATIS框架理论学习篇
    Python Pyramid with MySQL
    Python Pyramid with PostgreSQL
    PostgreSQL 安装
    wpa_supplicant on linux
    postgresql 常用命令 {转载}
    Arduino 各种模块篇 [留个小任务,现在去学习python 网络编程]
  • 原文地址:https://www.cnblogs.com/qqxin/p/13022131.html
Copyright © 2011-2022 走看看