zoukankan      html  css  js  c++  java
  • [Python]NEXT方法

    python中,含有yield关键字的对象就是一个生成器;

    每次调用next方法时会执行到yield后面的语句,然后返回yield后面代码块的执行结果

    其实也可以调用send方法,下面给个例子方便理解

    next方法:

    def foo():
        bar_a = yield 1         # bar_a是语句块(yield 1)的返回值,默认为None
        bar_b = yield bar_a
        yield "最后一个值,再迭代就要报StopIteration了"
    
    f = foo()                   # 创建生成器,此时没有执行foo()里的任何语句
    print(f)	#1
    print(next(f))	#2              # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
    print(next(f))	#3              # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。
                                	# 然后执行到语句块(yield bar_a),bar_b也还没有被创建
    print(next(f)	#4

     1处打印出来的内容为:

    (4Project) PS D:PythonVirtualEnvPythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
    <generator object foo at 0x00000127A19FAD60>

     2处打印出来的内容为:

    (4Project) PS D:PythonVirtualEnvPythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
    <generator object foo at 0x000001B4120EAD60>
    1

    3处打印出来的内容为:

    (4Project) PS D:PythonVirtualEnvPythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
    <generator object foo at 0x000002999698AD60>
    1
    None

    4处打印出来的内容为:

    (4Project) PS D:PythonVirtualEnvPythonVirtualEnv_391> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp.py
    <generator object foo at 0x000001E2E9FBAD60>
    1
    None
    最后一个值,再迭代就要报StopIteration了

    为了更好的理解程序,采用了新的方法:

    def foo():
        print("现在执行到了bar_a = yield 1之前")
        bar_a = yield 1         # bar_a是语句块(yield 1)的返回值,默认为None
        print("现在执行到了bar_a = yield 1之后")
        
        print("经过bar_a = yield 1之后,bar_a的数值为:{}".format(bar_a))
        print("现在执行到了bar_b = yield bar_a之前")
        bar_b = yield bar_a
        print("现在执行到了bar_b = yield bar_a之后")
        yield "最后一个值,再迭代就要报StopIteration了"
    
    f = foo()                   # 创建生成器,此时没有执行foo()里的任何语句
    print(f)	#1
    print("*************************************")
    print(next(f))	#2              # 从foo()里进入,一直执行到(yield 1)处,此时变量bar_a还没有创建
    print("*************************************")
    print(next(f))	#3              # 先将语句块(yield 1)的返回值赋值个bar_a,此时bar_a的值是None。Z
    #                             	# 然后执行到语句块(yield bar_a),bar_b也还没有被创建
    print("*************************************")
    print(next(f))	#4

    最后的输出结果为:

    (4Project) PS D:PythonVirtualEnvPythonVirtualEnv_391Scripts> & d:/PythonVirtualEnv/PythonVirtualEnv_391/4Project/Scripts/python.exe d:/PythonVirtualEnv/PythonVirtualEnv_391/tmp_2.py
    <generator object foo at 0x0000028A864B0BA0>
    *************************************
    现在执行到了bar_a = yield 1之前
    1
    *************************************
    现在执行到了bar_a = yield 1之后
    经过bar_a = yield 1之后,bar_a的数值为:None
    现在执行到了bar_b = yield bar_a之前
    None
    *************************************
    现在执行到了bar_b = yield bar_a之后
    最后一个值,再迭代就要报StopIteration了

    通过上面,大致可以理解, yield 和 return 的区别

  • 相关阅读:
    Linux 修改时区(debain)
    C#生成验证码
    httpPost 请求
    C# Array.FindAll
    C#删除字符串中所有的空字符
    C# 获取汉字区位码
    Qinq Vlan mapping 和DHCP 服务器
    Sql 分页存储过程
    request 之getParameterMap 方法
    如果我是面试官
  • 原文地址:https://www.cnblogs.com/LeeCookies/p/15477442.html
Copyright © 2011-2022 走看看