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

    迭代器 iter()

    迭代器是访问集合中元素的一种方式,迭代器 object 从集合中的第一个元素开始访问,知道所有的元素被访问完成.
    所以迭代器的特点是:只能往前,不能后退
    迭代器的优点:不需要提前准备整个迭代器中的所有元素,仅仅迭代到某个元素时才计算该元素,而之前或者之后,元素可以不存在或者销毁.因为这个特点,迭代器特别适合遍历文件比较大或者无限的集合.
    总结下迭代器 iter()的特点吧:

    1. 访问者不需要关心迭代器内部的结构,仅需通过next()方法不断去取下一个内容
    2. 不能随机访问集合中的某个值 ,只能从头到尾依次访问
    3. 访问到一半时不能往回退
    4. 便于循环比较大的数据集合,节省内存

    **迭代器是用__next__()来取值的,来看个例子吧:

    li=[1,2,3,4,56,78]
    a=iter(li)
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())
    print(a.__next__())	#取值到最后一个元素787
    print(a.__next__())
    

    输出:

    1
    2
    3
    4
    56
    78
    
    #开始报错
    Traceback (most recent call last):
      File "/Users/shane/PycharmProjects/Py_study/Base/S5/iter_test.py", line 14, in <module>
        print(a.__next__())
    StopIteration
    

    生成器generator

    一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator);如果函数中包含yield语法,那这个函数就会变成生成器

    yield是个什么鬼?yield 其实和函数中的 return 一样,一样的是都会返回定义好的值,但不同的是,return 是退出函数,yield 只是暂停函数执行,等待下一次迭代器取值

    我们来看个例子:

    def func():
        print(111)
        yield 1
        print(222)
        yield 2
        print(333)
        yield 3
    
    ret=func()
    r1=ret.__next__()
    print(r1) #如果没有 print,只会返回111
    

    out:

    111
    1
    

    一个典型的生成器的取值方式:

    def func():
        print(111)
        yield 1
        print(222)
        yield 2
        print(333)
        yield 3
    
    ret=func()
    r1=ret.__next__()
    print(r1)
    r2=ret.__next__()
    print(r2)
    r3=ret.__next__()
    print(r3)
    r4=ret.__next__()	#如果没有 r4就不会报错,因为已经没值可取了
    print(r4)
    

    out:

    Traceback (most recent call last):
      File "/Users/shane/PycharmProjects/Py_study/Base/S5/geno.py", line 21, in <module>
        r4=ret.__next__()
    StopIteration
    111
    1
    222
    2
    333
    3
    
    进程已结束,退出代码1
    

    来看一个比较完整一点的生成器和迭代器吧:

    def myrange(args):
        start=0
        while True:
            if start > args:
                return
            else:
                yield start
                start+=1
    
    
    res=myrange(3)
    ret=res.__next__()
    print(ret)
    ret=res.__next__()
    print(ret)
    ret=res.__next__()
    print(ret)
    ret=res.__next__()
    print(ret)
    ret=res.__next__()
    print(ret)
    
  • 相关阅读:
    [学习]利用SqlDataAdapter Insertcommand 获取刚新增的自动编号ID值
    [转]下拉框OnChange触发文本框值变化
    .NET伪静态使用以及和纯静态的区别
    Java之替换“\n”符号 Binary
    【转载】三种东西永远不要放到数据库里 Binary
    如何为Android Spinner设置一个初始值(How to make an Android Spinner with initial text “Select One”)? Binary
    Android之SQLite列操作 Binary
    Android——调用系统相册 Binary
    Android——用XML的selector实现按钮多态 Binary
    keystore信息的查看 Binary
  • 原文地址:https://www.cnblogs.com/ccorz/p/5580487.html
Copyright © 2011-2022 走看看