您好,登錄后才能下訂單哦!
本篇內容主要講解“Python隱藏的特性有哪些”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“Python隱藏的特性有哪些”吧!
是的,你沒看錯,在Python中...是一個有效的構造。...是稱為省略號的單例對象。如果你把它輸入到Python解釋器中,你可以看到它:
>>> ... Ellipsis
根據官方文檔,省略號是“一種特殊值,主要與用戶定義容器數據類型的擴展切片語法結合使用”。它有兩個主要的用例。一種是在空函數中充當占位符體。另一個是Numpy,作為一個切片項,就像文檔中描述的那樣。
函數的占位符
def my_awesome_function(): ...
這相當于:
def my_awesome_function(): Ellipsis
還有這個:
def my_awesome_function(): pass
注意,我不是說pass =…我只是說作為函數體,結果是一樣的。事實上,您可以使用任何東西作為占位符。
Numpy
下面的代碼基本上意味著創建一個矩陣數組。每個矩陣是3×3。然后獲取所有最內部矩陣的第二列(numpy數組基于0)。
import numpy as np >>> array = np.arange(27).reshape(3, 3, 3) >>> array array([[[ 0, 1, 2], [ 3, 4, 5], [ 6, 7, 8]], [[ 9, 10, 11], [12, 13, 14], [15, 16, 17]], [[18, 19, 20], [21, 22, 23], [24, 25, 26]]]) >>> array[..., 1] array([[ 1, 4, 7], [10, 13, 16], [19, 22, 25]]) >>> # This is equivalent to >>> array[:, :, 1] array([[ 1, 4, 7], [10, 13, 16], [19, 22, 25]])
可迭代解包是一種非常方便的特性,已經存在一段時間了。大多數人使用它來解包包含多個項的可迭代對象。例如,考慮以下用例。
>>> a, *b, c = range(1, 11) >>> a 1 >>> c 10 >>> b [2, 3, 4, 5, 6, 7, 8, 9]
或者是:
>>> a, b, c = range(3) >>> a 0 >>> b 1 >>> c 2
但有一個很好的用例,很多人都沒有利用它,那就是拆封單個迭代器。為什么這很有用?恕我直言,它使代碼更優雅了一些。
而不是這樣做:
>>> lst = [1] >>> a = lst[0] >>> a 1 >>> (a, ) = lst >>> a 1
你可以這樣做:
>>> lst = [1] >>> [a] = lst >>> a 1
我知道這可能看起來很傻,但至少對我來說,它看起來更優雅。
扁平化列表有幾種方法。最簡單的是使用列表理解。
>>> l = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] >>> flattened = [elem for sublist in l for elem in sublist] >>> flattened [1, 2, 3, 4, 5, 6, 7, 8, 9]
如果您更傾向于函數式編程,您可以使用減速器。
>>> from functools import reduce >>> reduce(lambda x,y: x+y,l) [1, 2, 3, 4, 5, 6, 7, 8, 9]
然而,還有另一種方法。你可以用sum函數!
>>> sum(l, []) [1, 2, 3, 4, 5, 6, 7, 8, 9]
這是因為sum函數遍歷列表中的每個元素,并將它們與作為第二個參數傳遞的默認值連接起來。因為Python中的列表可以用+操作符連接,所以你得到的結果是這樣的:
>>> sum(l, []) ==> [] + [1, 2, 3] + [4, 5, 6] + [7, 8, 9] [1, 2, 3, 4, 5, 6, 7, 8, 9]
盡管這個技巧很高明,但它絕不是可讀的。而且,它的性能也很糟糕。
else語句可以用于幾個目的。很少有人知道,但是你可以在經典的“if else”塊之外使用它。Python允許它用于循環和異常塊。
循環
Python有兩個不同的循環,for和while。兩者都可能是“壞的”。也就是說,如果滿足了某個條件,就可以跳出循環。例如:
In [7]: while a < 10: ...: if a == 3: ...: print("a == 3. exiting loop.") ...: break ...: a += 1 ...: a == 3. exiting loop.
現在,假設我們要找一個特定的條件。如果滿足該條件,則將結果保存在一個名為found的標志中。然后,如果我們沒有找到它,我們打印一條消息。
found = False a = 0 while a < 10: if a == 12: found = True a += 1 if not found: print("a was never found")
因為a永遠不會變成12,所以程序輸出a永遠不會找到。
好,但是我們在這里怎么用else呢?
else可以用來替換標志。基本上,我們實際需要的是運行循環,如果沒有找到,則打印一條消息。
a = 0 while a < 10: if a == 12: break a += 1 else: print("a was never found")
由于它適用于任何循環,所以您可以使用for而不是while。
for a in range(10): if a == 12: break a += 1 else: print("a was never found")
異常
Python中的else是如此通用,你甚至可以使用try…except。這里的思想是捕獲異常不發生的情況。
In [13]: try: ...: {}['lala'] ...: except KeyError: ...: print("Key is missing") ...: else: ...: print("Else here") ...: Key is missing
在這個例子中,我們嘗試在一個空字典中查找名為“lala”的鍵。由于“lala”不存在,代碼將引發一個KeyError異常。當我在IPython中運行這段代碼時,得到了預期的結果。
如果程序沒有引發異常呢?
In [14]: try: ...: {'lala': 'bla'}['lala'] ...: except KeyError: ...: print("Key is missing") ...: else: ...: print("Else here") ...: Else here
現在我們可以看到它的實際應用。{' lala ': ' bla '}[' lala ']塊不會引發KeyError,所以else就起作用了。
這是我最喜歡的一個,老實說,沒有那么隱蔽。與許多編程語言(如Java、C或c++)不同,Python允許鏈式比較運算符。假設你有一個變量x,它的值是10。現在,假設你想斷言x在一個范圍內,比如5..20。你可以這樣做:
In [16]: x = 10 In [17]: if x >= 5 and x <= 20: ...: print("x is within range") ...: else: ...: print("x is outside range") ...: is within range
事實證明,這可以通過將運算符鏈接起來來簡化。所以,我們可以重構代碼為:
In [18]: if 5 <= x <= 20: ...: print("is within range") ...: else: ...: print("x is outside range") ...: is within range
這段代碼實現了完全相同的結果,但它更加優雅。您可以使用任何一種比較運算符進行鏈。
>>> x = 10 >>> 20 == x > 1 False >>> 25 > x <= 15 True >>> x < 20 < x*10 < 1000 True
到此,相信大家對“Python隱藏的特性有哪些”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。