zoukankan      html  css  js  c++  java
  • python——函数之生成器

    1 生成器函数的含义

        生成器是一个返回可以迭代对象的函数,它是一个特殊的迭代器,但迭代器的抽象层级更高且比较复杂需要实现很多方法。相较迭代器而言,生成器简单使用。

    2 生成器的创建方式

      2.1 生成器表达式

        把列表推导式的[] 修改为(),

    (i for i in range(1, 10000) if i % 2 == 0)

      代码执行界面如下:

        

      2.2 生成器函数

        (1)在一个一般函数中使用yield关键字,可以实现一个最简单的生成器,此时这个函数变成一个生成器函数。简单来说,生成器函数就是函数

        中包含 yield语句的函数。

            yield语法:yield [返回值]     ([] 表示可选参数)

            yield的作用:yield可以去阻断当前的函数执行。当使用next()(或.__next__())函数,会让函数继续执行,yield后面的值作为next()函数

          返回值,当执行到下一个 yeild时,又会被暂停挂起。

            yield与return的区别:yield会保存当前函数的执行状态,在返回后,函数又回到之前保存的状态继续执行;而return返回后,函数

          状态终止。
        (2)代码实例

     1 def mylist():
     2     for i in range(3):
     3         print("列表的第%s个元素:" % i, end="")
     4         yield i
     5 
     6 
     7 ml = mylist()              # 创建一个生成器
     8 print(next(ml))
     9 print(next(ml))
    10 print(next(ml))
    11 print(next(ml))            # 当生成器遍历完后,再遍历就会报错

         代码执行顺序示意图:

          

    3 生成器的遍历

      3.1 next()或.__next__()遍历,代码如下 

      

     1 # 方式1
     2 ml = (i for i in range(1, 10) if i % 2 == 0)
     3 print("next()方式遍历结果:", end="")
     4 print(ml.__next__(), end=" ,")
     5 print(ml.__next__(), end=" ,")
     6 print(ml.__next__(), end=" ,")
     7 print(ml.__next__())
     8 
     9 # 方式2
    10 ml2 = (i for i in range(1, 10) if i % 2 == 0)
    11 print(".__next__()方式遍历结果:", end="")
    12 print(next(ml2), end=" ,")                  # next()相当于 生成器.__next__()
    13 print(next(ml2), end=" ,")
    14 print(next(ml2), end=" ,")
    15 print(next(ml2))

      上面代码执行结果如下:
      

      3.2 for in方式遍历,代码如下,

    1 ml = (i for i in range(1, 10) if i % 2 == 0)
    2 print("for in 遍历结果为;", end=" ")
    3 for i in ml:
    4     print(i, end=", ")

       上面代码执行结果为:

        


    4 关闭生成器
      命令:生成器名称.close()  ,例如 ml.close()。

      注意:生成器只会遍历一次,当关闭生成器或者遍历一遍后,后续如果再调用,会抛出StopIteration异常提示。下次如果想继续重新遍历,必须先重新创建生成器。

  • 相关阅读:
    2018-2019-2 网络对抗技术 20165318 Exp4 恶意代码分析
    2018-2019-2 网络对抗技术 20165318 Exp3 免杀原理与实践
    2018-2019-2 网络对抗技术 20165318 Exp2 后门原理与实践
    2018-2019-2 网络对抗技术 20165318 Exp1 PC平台逆向破解
    2018-2019-2 《网络对抗技术》Exp0 Kali安装 Week1 20165318
    2018-2019-2 20165312《网络对抗技术》Exp9 Web安全基础
    a simple example for form
    2018-2019-2 20165312《网络攻防技术》Exp7 网络欺诈防范
    2018-2019-2 20165312《网络攻防技术》Exp6 信息搜集与漏洞扫描
    2018-2019-2 20165312《网络攻防技术》Exp5 MSF基础应用
  • 原文地址:https://www.cnblogs.com/cuizhu/p/9463434.html
Copyright © 2011-2022 走看看