• 序列解包和生成器表达式


    序列解包

    可以使用序列解包功能对多个变量同时赋值

    (1)

    x, y, z = 1, 2, 3
    print(x, y, z)
    
    • 1
    • 2

    在这里插入图片描述
    必须一一对应

    x, y, z = 1, 2 会抛出异常

    (2)

    括号可加可不加

    v_tuple = (False, 3.5, 'abc')
    (x, y, z) = v_tuple  # 等价于x, y, z = v_tuple
    print(x, y, z)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    可以对range对象进行解包

    x, y, z = range(3)
    print(x, y, z)
    
    • 1
    • 2

    在这里插入图片描述

    使用迭代器对象进行解包

    x, y, z = iter([1, 2, 3])
    print(x, y, z)
    
    • 1
    • 2

    在这里插入图片描述

    使用map对象进行解包

    x, y, z = map(str, range(3))
    print(x, y, z)
    print((x, y, z))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    交换两个变量的值

    a, b = 1, 2
    a, b = b, a
    print(a, b)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    对列表解包

    x, y, z = sorted([1, 3, 2])
    print(x, y, z)
    
    • 1
    • 2

    在这里插入图片描述

    对字符串解包

    a, b, c = 'ABC'
    print(a, b, c)
    print((a, b, c))
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    切片也支持序列解包

    x = [1, 2, 3, 4]
    x[:3] = map(str, range(3))
    print(x)
    
    • 1
    • 2
    • 3

    在这里插入图片描述

    序列解包对于列表和字典同样有效

    s = {
        'a': 1,
        'b': 2,
        'c': 3
    }
    a, b, c = s.items()
    print(a)
    d, e, f = s  # 默认是键
    print(d)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    在这里插入图片描述

    python3.5之后的版本支持下面用法的序列解包

    print(*[1, 2, 3], 4, *(5, 6))
    print(*range(4), 4)
    print({*range(4), 4, *(5, 6, 7)})
    print({'x': 1, **{'y': 2}})  # 字典解包要用**
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    生成器表达式

    • 生成器表达式的结果是一个生成器(generator)对象
    • 可将其转为列表或元组,也可使用生成器对象__next__()方法或内置函数next()进行遍历,或者将其作为迭代器对象来使用
    • 生成器对象具有惰性求值的特点,只在需要时生成新元素,空间占用非常少,尤其适合大数据处理的场合.类似的还有range对象,zip对象,map对象,enumerate对象,filter对象等
    • 不管用哪种方法访问生成器对象,都无法再次访问已访问过的元素
    g = ((i + 2) ** 2 for i in range(10))  # 创建生成器对象
    print(g)
    print(tuple(g))  # 将生成器对象转换为元组
    print(list(g))  # 生成器对象已遍历结束,没有元素了
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述

    使用生成器对象 __ next __ ()方法或内置函数next()进行遍历

    g = ((i + 2) ** 2 for i in range(10))  # 创建生成器对象
    print(g.__next__())  # 使用生成器对象的__next__()方法获取元素
    print(g.__next__())  # 获取下一个元素
    print(next(g))  # 使用函数next()获取生成器对象中的元素
    print(list(g))
    
    • 1
    • 2
    • 3
    • 4
    • 5

    在这里插入图片描述

    使用for循环直接迭代生成器对象中的元素

    g = ((i + 2) ** 2 for i in range(10))
    for item in g:  # 使用循环直接遍历生成器对象中的元素
        print(item, end=' ')
    
    • 1
    • 2
    • 3

    在这里插入图片描述

  • 相关阅读:
    C++模板类用作参数传递
    用ffmpeg修改MP4文件头信息,使其支持流式加载及播放
    消息中间件篇之Kafka-数据清理机制
    M1 pro 芯片Macbook Pro配置anaconda&& GPU版Pytorch
    vue中的一个重要插件——vuex
    72.Linux系统下printf函数的输出问题
    KUKA机器人与Insight 配合
    strcat · strstr | 使用场景与模拟实现
    数据库问题汇总
    PHP基础学习
  • 原文地址:https://blog.csdn.net/2302_77179144/article/details/133961782