zoukankan      html  css  js  c++  java
  • 第四十六节,生成器函数和迭代器

    生成器函数

    生成器函数就是通过特殊改装过的函数

    yield函数关键字,只要函数里写了yield关键字,这个函数就叫做生成器函数

    执行函数内部是一旦遇到yield关键字会自动退出函数

    生成器函数返回的是一个生成器对象

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def asd():
        print(1)
        yield 1
        print(2)
        yield 2
        print(3)
        yield 3
        print(4)
        yield 4
    a = asd()
    print(a)
    # 输出
    # <generator object asd at 0x0000008903305990>

    __next__()获取生成器方法

    功能:__next__()用于执行生成器函数里yield关键字之前的代码,和返回yield关键字的返回值也就是去函数里找yield关键字来执行yield之前的代码,一旦遇到yield关键字,退出函数返回yield的返回值,如果没有yield则报错,注意函数里有多个yield,只能获取到第一个,因为函数执行内部时一旦遇到yield关键字就会退出函数,再次运用__next__方法时会从上一次yield退出的地方开始执行函数内部,再次遇到yield关键词会再次退出,依次循环,  所以有几个yield关键字,就可以用几个__next__方法来获取和执行函数内部,

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def asd():
        print(11) #函数内部代码
        yield 1  #yield关键字返回值
        print(22)
        yield 2
        print(33)
        yield 3
        print(44)
        yield 4
    a = asd()
    b = a.__next__()
    print(b)
    
    b = a.__next__()
    print(b)
    # 11  函数内部代码
    # 1   yield关键字返回值
    # 22  函数内部代码
    # 2   yield关键字返回值

    用生成器函数,生成0到5的数

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    def range_1(n): #创建生成器函数
        srt = 0 #定义一个值
        while True: #循环
            if srt > n: #判断定义值大于接收值时
                return #定义值大于接收值时退出整个函数
            yield srt #yield关键字返回yield值
            srt += 1 #每一次循环让定义值加1
    a = range_1(5)
    b1 = a.__next__() #__next__方法获取第一次循环的yield返回值
    b2 = a.__next__() #__next__方法获取第二次循环的yield返回值
    b3 = a.__next__() #__next__方法获取第三次循环的yield返回值
    b4 = a.__next__() #__next__方法获取第四次循环的yield返回值
    b5 = a.__next__() #__next__方法获取第五次循环的yield返回值
    b6 = a.__next__() #__next__方法获取第六次循环的yield返回值
    print(b1,b2,b3,b4,b5,b6)
    # 输出
    # 0 1 2 3 4 5

    迭代器

    迭代器,就是能用生成器对象,从头到尾迭代执行生成器函数内部得到结果的方法

    __next__()方法迭代器

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    """生成器"""
    def range_1(n): #创建生成器函数
        srt = 0 #定义一个值
        while True: #循环
            if srt > n: #判断定义值大于接收值时
                return #定义值大于接收值时退出整个函数
            yield srt #yield关键字返回yield值
            srt += 1 #每一次循环让定义值加1
    a = range_1(5)
    
    """迭代器"""
    b1 = a.__next__() #__next__方法获取第一次循环的yield返回值
    b2 = a.__next__() #__next__方法获取第二次循环的yield返回值
    b3 = a.__next__() #__next__方法获取第三次循环的yield返回值
    b4 = a.__next__() #__next__方法获取第四次循环的yield返回值
    b5 = a.__next__() #__next__方法获取第五次循环的yield返回值
    b6 = a.__next__() #__next__方法获取第六次循环的yield返回值
    print(b1,b2,b3,b4,b5,b6)
    # 输出
    # 0 1 2 3 4 5

    for循环迭代器

    for循环底层封装的也是__next__()方法

    #!/usr/bin/env python
    # -*- coding:utf8 -*-
    """生成器"""
    def range_1(n): #创建生成器函数
        srt = 0 #定义一个值
        while True: #循环
            if srt > n: #判断定义值大于接收值时
                return #定义值大于接收值时退出整个函数
            yield srt #yield关键字返回yield值
            srt += 1 #每一次循环让定义值加1
    a = range_1(5)
    
    """迭代器"""
    for i in a: #用for迭代循环出生成器对象里的数据
        print(i) #每一次循环打印出数据
    # 输出
    # 0
    # 1
    # 2
    # 3
    # 4
    # 5
  • 相关阅读:
    2_C语言中的数据类型 (九)逻辑运算符与if语句、switch、条件运算符?、goto语句与标号
    2_C语言中的数据类型 (八)运算符
    Python_sklearn机器学习库学习笔记(七)the perceptron(感知器)
    C++ STL 学习笔记__(7)Set和multiset容器
    2_C语言中的数据类型 (七)printf与scanf
    郑捷《机器学习算法原理与编程实践》学习笔记(第五章 梯度寻优)5.1 最优化与计算复杂度
    机器学习笔记(一)机器学习与数学分析
    2_C语言中的数据类型 (七)类型限定
    郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(三)SVD
    [译]Javascript timing事件
  • 原文地址:https://www.cnblogs.com/adc8868/p/5849645.html
Copyright © 2011-2022 走看看