• 第八章、生成器


    第八章、生成器

    一、什么是生成器

    生成器本质是迭代器,不仅仅是迭代器,除了迭代器的作用其他作用也没多少,生成器提供了方便的自定义迭代器的途径。

    二、yield关键字

    迭代器具有__iter__h和__next__的方法

    def func():
        return 123
    f = func():
    print(f)  #123
    #我们调用了func函数,那他当然是123了
    

    然后我们看return和yield有什么区别吧

    def func():
        yield 456   # yield会使函数func()变成生成器对象,因此他就具有__iter__方法
        print(789)  # yield会停止函数,当运行下一次next才会继续运行下面的代码
        yield 12345  # 一个yield对应一个next
        print(369789)
    f = func()  #生成器
    print(f)   # <generator object func at 0x000001F0E44237D8>
    f_iter = f.__iter__()
    print(f_iter.__next__())#123
    print(f_iter.__next__())#12345
    print(f_iter.__next__())#报错
    
    #但是这样的话会报错,有多少yield关键字就有多少next,next多了会报错StopIteration
    

    然后总结一下:

    yield的三个特性

    1. yield可以把函数变成生成器(自定制的迭代器对象,具有__iter____next__方法)
    2. yield可以停止函数,下一次next再次运行yield下面的代码
    3. 有n个yield生成器就有n个元素,就可以next n次,第n+1次next会报错

    return的特性

    1. 返回值
    2. 终止函数

    三、利用yeild关键字制作生成器制作一个range方法

    1. 首先要把可迭代对象变成迭代器,即使用yield关键字使让range函数成为生成器

    2. 丢一个10 通过for 循环把range迭代出(for循环使用了next方法的原理)所有的元素0到9

       def range(*args):
           if len(args)==3:
               a=args[0]
               while args[1]>a and a>=args[0]:
                   yield a
                   a+=args[2]
           elif len(args)==2:
               if args[0]<args[1]:
                   a=args[0]
                   while a>=args[0] and a<args[1]:
                       yield a
                       a+=1
               elif args[0]>args[1]:
                   a = 0
                   while a >= 0 and a < args[0]:
                       yield a
                       a += args[1]
           elif len(args) == 1:
               a=0
               while a<args[0]:
                   yield a
                   a+=1
       
       for i in range(3,10,3):
           print(i)
    #调用一下我自己做的函数(其实是生成器)
     for i in range(10,3):
     	print(i)
    
    #结果正确,完美收场
    0
    3
    6
    9
    
  • 相关阅读:

    Android自己主动化測试之Monkeyrunner用法及实例
    递归函数的概念使用方法与实例
    正则、grep、sed、awk
    我的java学习笔记(一)
    mysql经常使用命令总结
    JSP动作--JSP有三种凝视方式
    http长连接和短连接
    StirngUtil工具类 之 邮箱注冊 域名不区分大写和小写方法
    在Eclipse上搭建Cocos2d-x的Android开发环境
  • 原文地址:https://www.cnblogs.com/demiao/p/11352448.html
Copyright © 2020-2023  润新知