zoukankan      html  css  js  c++  java
  • python—迭代器,生成器与for循环机制

    一:什么是迭代器协议

          1.迭代器协议是指:对象必须提供一个next方法,执行该方法要么返回迭代器中的下一项,要么就引起一个stoplteration异常,以终止协议(只能往后走不能往前)

          2.可迭代对象:实现了迭代器协议的对象(如何实现:对象内部定义一个_iter_()方法)

          3.协议是一种约定,可迭代对象实现了迭代器协议,python的内部工具(如for循环,sum,min函数等)使用迭代器协议访问对象。

    二:for循环机制

         1.for循环机制的本质:循环所有对象,全部都是使用迭代器协议。

    三:什么是生成器

         1.生成器,可以理解为一种数据类型,这种数据类型自动实现了迭代器协议(其他的数据类型需要调用自己内置的_iter_方法),所以生成器就是可迭代对象。

         2.生成器分类:在python中有两种表现形式(python有两种不同的方式提供生成器)

           【1】生成器函数:常规函数定义,但是,使用yield语句而不是return语句返回结果,yield语句一次返回一个结果,在每个结果中间,挂起函数的状态,以便于下次从它离开的地方继续执行。

     1 def test():
     2     yield 1
     3     yield 2
     4     yield 3
     5 res=test()
     6 print(res)
     7 print(res.__next__())
     8 print(res.__next__())
     9 #结果:<generator object test at 0x0000023E254BD8E0>
    10 #     1
    11 #     2

           【2】生成器表达式:类似于列表推导,但是生成器返回按需产生结果的一个对象,而不是一次构建一个结果列表。

     1 laomuji=('鸡蛋%d' %i for i in range(10))
     2 print(laomuji)
     3 print(laomuji.__next__())
     4 print(laomuji.__next__())
     5 print(laomuji.__next__())
     6 print(next(laomuji))
     7 print(next(laomuji))
     8 #结果:<generator object <genexpr> at 0x0000015F1262D8E0>
     9 #      鸡蛋0
    10 #      鸡蛋1
    11 #      鸡蛋2
    12 #      鸡蛋3
    13 #      鸡蛋4

         3.列表解析

     1 egg_list=[]
     2 for i in range(10):
     3     egg_list.append('鸡蛋%d' %i)
     4 print(egg_list)
     5 #结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
     6 
     7 列表解析:
     8 l=['鸡蛋%d' %i for i in range(10)]
     9 print(l)
    10 #结果:['鸡蛋0', '鸡蛋1', '鸡蛋2', '鸡蛋3', '鸡蛋4', '鸡蛋5', '鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    11 #列表解析将即将生成的列表结果放前面,for循环放在后面
    12 
    13 三元表达式:(三个操作,for循环前面是一个,for循环是一个,if条件这是一个)
    14 l1=['鸡蛋%d' %i for i in range(10) if i>5 ]
    15 print(l1)
    16 #结果:['鸡蛋6', '鸡蛋7', '鸡蛋8', '鸡蛋9']
    17 #没有四元表达式

    总结:

       1.把列表解析的[]换成()得到的就是生成器表达式

       2.列表解析与生成器表达式都是一种便利的变成方式,只不过生成器表达式更加节省内存

       3.Python不但使用迭代器协议让for循环更加通用。大部分内置函数也是使用迭代器协议访问对象的。例如,sum函数是Python的内置函数,该函数使用迭代器协议访问对象,而生成器实现了迭代器协议,所以,我们可以直接计算一系列值得和:

    1 sum(x**2 for x in range(4))

     而不用多此一举的先构造一个列表:

    1 sum([x**2 for x in range(4)])
  • 相关阅读:
    oracle的根容器下新建pdb容器及本地用户
    oracle监听配置与防火墙问题
    oracle问题:ORA-09817及解决办法
    Oracle:Ora-01652无法通过128(在temp表空间中)扩展temp段的过程-解决步骤
    oracle:ORA-14765建索引阻塞创建分区及处理步骤
    oracle-组合索引字段位置与查询效率之间的关系
    hbase的split策略和预分区
    启动hbase后hmaster自动关闭
    hive一级分区、二级分区、动态分区
    hive beeline连接和交互shell连接
  • 原文地址:https://www.cnblogs.com/zhouyuan666/p/9538877.html
Copyright © 2011-2022 走看看