• 生成器


    一、生成器

    什么是生成器

    ​ 生成的工具

    生成器是一个“自定义”的迭代器,本质上是一个迭代器

    如何实现生成器

    ​ 但凡在函数内部定义的yield,调用函数时,函数体代码不会执行,会返回一个结果,返回的该结果就是一个生成器对象

    关键字yield

    ​ 翻译过来后的意思是(生成,产出)

    ​ yield只能在函数内部定义

    ​ 每一次yield都会在生成器中添加一个值

    ​ yield可以保存函数的暂停状态

    def func():
        print('from func')
        yield 'tank'
        
    res = func()
    # 当我们通过__next__取值的时候,才会执行函数体代码
    print(res.__next__())#生成器内置有__iter__和__next__方法,所有生成器本身即是一个迭代器
    
    from func
    tank
    

    自定义迭代器

    有了yield,我们就有了一种自定义迭代器的实现方式

    def func():
        print('开始下蛋')
        print('1---火鸡蛋1')
        yield '火鸡蛋1'
        print('2---火鸡蛋2')
        yield '火鸡蛋2'
        print('3---火鸡蛋3')
        yield '火鸡蛋3'
    
        print('取最后一个蛋,查看是否存在')
    
    
    res = func()
    print(next(res))
    print(next(res))
    print(next(res))
    print(next(res))	#StopIteration报错
    

    yield可以用于返回值,但不同于return

    • yield和return
      • 相同点:返回的值的个数是无限制的
      • 不同点:return只能返回一次,函数遇到return就结束了
        • yield可以保存函数的运行状态,用来返回多次值

    二、三元表达式

    三元表达式是Python为我们提供的一种简化代码的解决方案,语法如下

    res = 条件成立时返回的值 if 条件 else 条件不成立时返回的值

    例如:

    def max2(x,y):
        if x > y:
            return x
        else:
            return y
    
    
    res = max(1,2)
    print(res)
    2
    

    三元表达式可以一行解决

    x = 1
    y = 2
    res = x if x > y else y
    print(res)
    

    三、列表生成器

    列表生成式是Python为我们提供的一种简化代码的解决方案,用来快速生成列表

    可以一行实现生成列表

    语法:

    list = [ 值 for 可迭代对象中取出的每一个值 in 可迭代对象]

    将list1 中的值,依次取出,添加到new_list1中

    list1 = [1, 2, 3, 4, 5]
    new_list1 = []
    for i in list1:
        new_list1.append(i)
    
    print(new_list1)
    [1, 2, 3, 4, 5]
    

    列表生成式

    list1 = [line for line in range(1,6)]
    print(list1)
    [1, 2, 3, 4, 5]
    

    可以添加if判断

    优点:取值方便,可以通过索引取值

    缺点:浪费资源,占用内存空间

    应用场景:根据优缺点,列表生成式在数据量小时采用


    四、生成表达式

    创建一个生成器对象有两种方式,一种调用带yield关键字的函数,另一种就是生成器表达式,与列表生成式的语法格式相同,只需要将[]换成()

    语法:

    g = (line for line in range(1,6))

    对比列表生成式返回的是一个列表,生成器表达式返回的是一个生成器对象

    list1 = [line for line in range(1,6)]
    print(list1)
    [1, 2, 3, 4, 5]
    
    g = (line for line in range(1, 3))
    print(g)
    <generator object <genexpr> at 0x000001D4DF8BB1A8>
    

    优点:节省资源,节省内存空间

    缺点:取值不方便(每次取值都要从第一个值开始)

    应用场景:根据优缺点,生成表达式在数据量过大时采用

  • 相关阅读:
    7.29 H5学习笔记
    8.1H5学习笔记
    8.4 H5知识点总结
    8.15 CSS知识点6
    8.12 CSS知识点5
    HTTP协议简析(二)
    php实现二分查找法
    http协议简析(一)
    telnet客户端模拟浏览器发送请求
    导入txt文件到SQL SERVER 2008
  • 原文地址:https://www.cnblogs.com/YGZICO/p/11889287.html
Copyright © 2020-2023  润新知