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

    迭代器

    1. 迭代器协议:对象必须提供一个next方法,执行改方法要么返回迭代中的下一项,要么就引起一个stopiteration异常,以终止迭代(只能外后走不能往前退)
    2. 可迭代对象:实现了迭代器协议的对象,以下不是迭代器对象(字符串、列表、元组、字典、集合、文件对象)
    3. 协议的一种约定:可迭代对象实现了迭代器协议,python的内部工具(sum、min、max)使用迭代器协议访问对象

    for循环本质,将列表类通过__iter__()方法变成迭代器对象,然后调用迭代器对象的__next__()遍历
    列表迭代器和索引方式访问比较

    l = ['1','22','33as']
    print(l[0]    #索引
    
    print(l.__iter__().__next__())   #迭代器
    

    注意:
    字符串、列表、元组、字典、集合、文件对象需要使用__iter__生成迭代器对象。

    生成器

    注意:

    • 生成器产生的时候不做任何遍历操作
    • 生成器只能遍历一次。
      生成器自动实现了迭代器协议,是一种迭代器对象
    def test():
        yield 1  #相当于return,可多次调用,没调用一次返回一次,函数不结束
    

    三元表达式

    for循环三元组

    #用于生成,for循环三元组
    li = [i for i in range(10) if i>1]  #使用列表生成器,占用更多内存
    li = (i for i in range(10) if i>1) #使用迭代器方式,调用的时候生成数据
    print(li)
    

    if三元组

    #用于判断
    sex = 'man'
    res = '美女' if sex == 'woman' else '帅哥'
    print(res)
    

    使用迭代器计算

    print(sum(i for i in range(100000000000))) #使用迭代器方式进行sum计算,使用此方式内存和cpu不会太大浮动,对性能效果好很多
    print(sum(list(range(1000000000))))  #使用list,进行计算,如果数值和上面一样会提示memory error,并且执行时会占用大量内存和cpu空间
    

    迭代器yield保存状态

    def test():
        print('run round 1')
        yield  1
        print('run round 2')
        yield 2
    
    t = test()
    t.__next__()
    t.__next__()
    #同next(t)
    #运行结果 
    #run round 1
    #run round 2
    
  • 相关阅读:
    关于java中的批注@SuppressWarnings
    Enumeration接口的用法
    java中的Properties类的操作
    编译java时出现(端口冲突)Address already in use: JVM_Bind<null>:1919
    jQuery画廊插件-GalleryView
    jQuery中用attr和prop获取checkbox的属性问题
    (报错记录)Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:2.3.2:
    JDK 和 JRE 的区别(转载)
    css属性之vertical-align详解
    this——笔记
  • 原文地址:https://www.cnblogs.com/chrrydot/p/9789340.html
Copyright © 2011-2022 走看看