百木园-与人分享,
就是让自己快乐。

1.1&1.2 解压可迭代对象赋值给多个变量

问题描述

现在有一个包含N个元素的可迭代对象,怎样把它里面的元素解压后同时赋值给N个变量?怎样同时赋值给M个变量(M<N)?

解决方案

  • 将N个元素赋值给N个变量,可以通过如下一个简单的赋值语句实现。p = [4, 5]
    x, y = p
    print(x, y)
    # 输出结果:4 5

    data = [\'Test\', 1, 3.14, (2021, 12, 1)]
    a, b, c, d = data
    print(a, b, c, d)
    # 输出结果:Test 1 3.14 (2021, 12, 1)

    a, b, c, (year, month, day) = data
    print(a, b, c, year, month, day)
    # 输出结果:Test 1 3.14 2021 12 1

  • 如何将N个元素赋值给M个变量(M<N)?
    当变量的个数少于可迭代对象元素的个数时,程序会抛出ValueError。这时,可以用Python的星号表达式来解决。data = [1, 2, 3, 4, 5]
    a, b, *c, d = data
    print(a, b, c, d)
    # 输出结果:1 2 [3, 4] 5

    需要注意的是上面解压出的c变量永远是list类型,不管c的元素有几个(包括0个)。

  • 总结

    迭代解压语法的几个应用场景:

  • 任何可迭代对象都可以实现这种解压赋值,包括列表、元组、字符串、文件对象、迭代器和生成器。
    比如:s = \'hello\'
    a, b, c, d, e = s
    print(a, b, c, d, e)
    # 输出结果:h e l l o

  • 有时候,你想解压一些元素后丢弃它们,可以使用一个普通的废弃名称,比如_或者ign(ignore)。record = (\'ACME\', 50, 123.45, (12, 18, 2012))
    name, *_, (*_, year) = record
    print(name, year)

    \"\"\"
    输出结果:
    ACME 2012
    \"\"\"

  • 迭代元素为可变长元组的序列:records = [
    (\'foo\', 1, 2),
    (\'bar\', \'hello\'),
    (\'foo\', 3, 4),
    ]

    def print_foo(x, y):
    print(\'foo\', x, y)

    def print_bar(s):
    print(\'bar\', s)

    for tag, *args in records:
    if tag == \'foo\':
    print_foo(*args)
    elif tag == \'bar\':
    print_bar(*args)

    \"\"\"
    输出结果:
    foo 1 2
    bar hello
    foo 3 4
    \"\"\"

  • 字符串的分割line = \'nobody:*:-2:-2:Unprivileged User:/var/empty:/usr/bin/false\'
    uname, *field, homedir, sh = line.split(\':\')
    print(uname, homedir, sh)

    \"\"\"
    输出结果:
    nobody /var/empty /usr/bin/false
    \"\"\"

  • 来源:https://www.cnblogs.com/L999C/p/15630509.html
    图文来源于网络,如有侵权请联系删除。

    未经允许不得转载:百木园 » 1.1&1.2 解压可迭代对象赋值给多个变量

    相关推荐

    • 暂无文章