如何在Python中使用星形表达式来解包?

如何在Python中使用星形表达式来解包?

更多Python相关文章,请阅读:Python 教程

介绍

解包的基本限制之一是您必须提前知道要解包的序列的长度。

如何解决..

random_numbers = [0, 1, 5, 9, 17, 12, 7, 10, 3, 2]
random_numbers_descending = sorted(random_numbers, reverse=True)
print(f"输出 \n*** {random_numbers_descending}")
Python

输出

*** [17, 12, 10, 9, 7, 5, 3, 2, 1, 0]
Python

如果现在我想从数字中找到最大的和第二大的,我们会得到一个异常“too many values to unpack”(要解包的值过多)。

print(f"输出 \n*** 获取最大和第二大")
largest, second_largest = random_numbers_descending
Python

输出

*** 获取最大和第二大
Python
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
in
1 print(f"输出 \n*** 获取最大和第二大")
----> 2 largest, second_largest = random_numbers_descending

ValueErrortoo many values to unpack (expected 2)
Python

Python经常依赖索引和切片。例如,当我想从下面的项目列表中提取最大的和第二大的时,我们可以这样做。

largest = random_numbers_descending[0]
print(f"输出 \n*** 获取最大 - {largest}")
Python

输出

*** 获取最大 - 17
Python
second_largest = random_numbers_descending[1]
print(f"输出 \n*** 获取第二大 - {second_largest}")
Python

输出

*** 获取第二大 - 12
Python
rest_of_numbers = random_numbers_descending[2:]
print(f"输出 \n*** 获取其余数字 - {rest_of_numbers}")
Python

输出

*** 获取其余数字 - [10, 9, 7, 5, 3, 2, 1, 0]
Python

虽然这种方法是可行的,但是所有的索引和切片都会产生视觉上的噪音。实际上,把一个序列分成各种子集这种方法容易出错。

为了做得更好,Python支持通过星号表达式进行捕获解包。

这种星号语法允许解包赋值的一部分接收不匹配解包模式的所有值。

largest,second_largest, *rest_of_numbers = random_numbers_descending
print(f"输出 \n largest: {largest} \n second_largest:{second_largest} \n rest_of_numbers:{rest_of_numbers}")
Python

输出

largest: 17
second_largest:12
rest_of_numbers:[10, 9, 7, 5, 3, 2, 1, 0]
Python

上面的代码怎么样?在一行中,也更容易阅读,我们就可以获取输出。星形表达式可以出现在任何位置,因此您可以在需要提取一种片段时获得获取所有解包的好处。

largest: 17
rest_of_numbers:[12, 10, 9, 7, 5, 3, 2, 1]
smallest:0
Python
*rest_of_numbers, second_smallest, smallest = random_numbers_descending
print(f"输出 \n 其余数字:{rest_of_numbers} \n 第二小: {second_smallest} \n 最小值:{smallest}")
Python
其余数字:[17, 12, 10, 9, 7, 5, 3, 2]
第二小:1
最小值:0
Python

但是,要解包包含星号表达式的赋值,必须至少有一个必需的部分,否则您将收到SyntaxError。我们不能单独使用catch-all表达式。

*rest_of_numbers = random_numbers_descending
Python
文件“”,第1
*rest_of_numbers = random_numbers_descending
^
SyntaxErrorcatch-all赋值目标必须在列表或元组中
Python

我们还不能在单层解包模式中使用多个通配符表达式。这是另一个需要考虑的重要提示。

*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
Python
File "", line 1
*rest_of_numbers, *more_smallest, smallest = random_numbers_descending
^
SyntaxError: two starred expressions in assignment
Python

但是在解包赋值语句中可以使用多个星号表达式,只要它们是解包多层结构的不同部分的通配符即可。

player_grandslame_and_atptitles = {
'Federer': (20, 103),
'Nadal': (20,84),}

((player1, (grandslam1, *atptitles1)), (player2, (grandslam2, *atptitles2))) = player_grandslame_and_atptitles.items()

print(f'Output \nPlayer - {player1} Have acheived {grandslam1} grandslams and , {atptitles1} atp tour titles')
print(f'Player - {player2} Have acheived {grandslam2} grandslams and , {atptitles2} atp tour titles')
Python

输出

Player - Federer Have acheived 20 grandslams and , [103] atp tour titles
Player - Nadal Have acheived 20 grandslams and , [84] atp tour titles
Python

在所有情况下,星号表达式都会变成列表实例。如果从解包的序列中没有剩余的项,则通配符部分将是空列表。当您处理预先知道至少有N个元素的序列时,这是非常有用的。

random_numbers = [0, 1]
first, second, *rest = random_numbers
print(f"Output \n{first, second, rest}")
Python

输出

(0, 1, [])
Python

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册