生成器

  • 概念:但凡在函数内部定义了一个yield,调用函数时,函数体代码不会执行,会返回一个结果,该结果就是生成器。本质上是迭代器,一个自定义的迭代器

    # python内获取迭代器的方式
    def iter_func():
        list1 = [1, 2, 3, 8, 4]
        # 获取一个迭代器
        iter_list = list1.__iter__()
        while True:
            try:  # 捕获异常
                # 执行__next__取值
                print(iter_list.__next__())
            except StopIteration:
                break
    
    # 执行iter_func
    iter_func()
    
    
    # 自定义一个迭代器
    def func():
        print("hello world!")
        yield "dawn"
    
    
    res = func()
    # 直接调用,返回了一个生成器:<generator object func at 0x000002376172F1C8>
    print(res)  
    
    # 如何获取生成器的内容呢?
    # 生成器的本质是迭代器,迭代器对象取值通过.__next__
    # 通过__next__ 取值时,才会执行函数体代码。
    print(res.__next__())

    输出结果:

    hello world!
    dawn
  • 生成器如何实现:通过yield关键字实现。

    • yield 只能在函数内部定义

    • 每一次yield 都会往生成器传一个值

    • 可以保存函数的暂停状态

    def yield_func():
        print("自定义生成器开始……")
        print("第一个yield:")
        yield "yield--1"
        print("第二个yield:")
        yield "yield--2"
        print("第三个yield:")
        yield "yield--3"
        print("最后一个yield:")
        yield "yield--4"
        print("查看,是否还有yield")
    
    
    res = yield_func()
    print(res.__next__())

    输出:

    自定义生成器开始……
    第一个yield:
    yield--1
  • yield 和 return

    • 相同点:返回值的个数无限制
    • 不同点:return 有且只能返回一个值;yield 可返回多个值
    # yield
    def yield_func():
        list1 = [2, 3, 4, 1]
        dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
        tuple1 = (1, 'a', 2, 'b')
        set1 = {23, 34, 'e'}
    
        yield list1
        yield dict1
        yield tuple1, set1
    
    # return
    def return_func():
        list1 = [2, 3, 4, 1]
        dict1 = {"name": "dawn", "age": 18, "hobby": "read"}
        tuple1 = (1, 'a', 2, 'b')
        set1 = {23, 34, 'e'}
    
        return list1,tuple1
      #此处代码执行不到,函数代码题遇到return 以后就结束了
      return dict1  
  • 使用yield 自定义一个range

    """
    python2:range(1,5)  ---→ [1,2,3,4]
    python3:range(1,5)  ---→ range对象 ---→ 生成器 ---→ 迭代器
    
    range(start,stop,step)
    """
    def my_range(start,end,step=1):
        while start < end:
            yield start
            start += move

版权声明:本文为xiaodan1040原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/xiaodan1040/p/11857923.html