Python中的星號:用途及使用方法(下篇)

Python中的星号:用途及使用方法(下篇)

列表文字中的星號

Python 3.5通過PEP 448引入了大量新的與*相關的特性。其中一大新特性是使用 * 來將一個迭代器轉儲到一個新列表中的能力。

假設有一個函數,該函數接受任何序列,並返回具有序列表與該列表的反序連接在一起:

Python中的星号:用途及使用方法(下篇)

這個函數需要經歷兩次轉換成列表的過程來連接列表並返回結果。在Python 3.5中,我們可以用這種寫法替代:

Python中的星号:用途及使用方法(下篇)

該代碼刪除了一些不必要的列表調用使得它更高效、可讀性更強。

下面是另一個例子:

Python中的星号:用途及使用方法(下篇)

該函數返回一個新列表,其中給定列表(或其他序列)中的第一個項被移動到新列表的末尾。

使用*運算符是將不同類型的迭代器串在一起的好方法。*運算符適用於任何迭代,而使用+運算符只適用於類型均相同的特定序列。

這不僅限於創建列表。我們也可以利用它將迭代器轉儲到新的元組或集合中:

Python中的星号:用途及使用方法(下篇)

注意上面的最後一行需要一個列表和一個生成器,並將它們轉儲到一個新的集合中。在使用*前,沒有一種簡單的方法在一行代碼中做到這一點。以前有辦法實現這點,但不易被記住或發現:

Python中的星号:用途及使用方法(下篇)

字典中的雙星號

PEP 448還通過允許**運算符用於將鍵/值對從一個字典轉儲到新字典中來擴展其能力:

Python中的星号:用途及使用方法(下篇)

我在另一篇文章中介紹了它是如何成為當下Python中合併字典的習慣用法的。

這可以不僅限於用於合併兩個詞典。

例如,我們可以在添加一個新值的同時複製字典:

Python中的星号:用途及使用方法(下篇)

或在重寫特定值時複製或合併字典:

Python中的星号:用途及使用方法(下篇)

Python中的星號功能強大

Python的*和**運算符不只是語法糖。一些它們允許你做的事情可通過其他方式實現,替換掉*和**的方案往往更麻煩,而且資源更密集。並且一些它們提供的特性離開它們根本無法實現:例如,沒有了*,就沒有辦法接受任何數量的函數位置參數。

在閱讀了*和**的所有特性後,您可能會好奇這些古怪的運算符的名稱是什麼。不幸的是,他們的名字並不十分簡潔。我聽說過將它稱作“打包”和“拆包”運算符的。我還聽到它叫“SPLAT”(來自Ruby World),我聽過它叫“星”。

我傾向於把這些運算符稱為“明星”和“雙星”或“星星”。這並不能將它們與近親中綴運算符(乘法和求冪)區分開來,但上下文通常能清楚地表明我們是在談論前綴還是中綴運算符。

如果仍你不理解*和**,或者你力圖記住它們的一切用途,請別如此!這些運算符有很多用途,記住每個運算符的具體用法並不同大略感知這些運算符的各種使用場景一般重要。我建議將這篇文章作為一個“小抄”或在此基礎上形成自己的“小抄”用以幫助自己在Python中使用*和**。

英文原文:http://treyhunner.com/2018/10/asterisks-in-python-what-they-are-and-how-to-use-them/
譯者:盈韜


分享到:


相關文章: