bd@atyun.com
Python可以說是這十年來興起的編程語言,并且被證明是一種非常強大的語言。我用Python從交互式地圖到區塊鏈構建了很多應用程序。Python有很多特性,初學者很難一開始就掌握所有的特性。
即使您是一個從其他語言(如C或MATLAB)轉換過來的程序員,用更高抽象級別的Python編寫代碼絕對是另一種體驗。我希望早些時候就知道一些Python特性,并重點介紹了其中五個最重要的特性。
很多人會提到lambda、map和filter是每個初學者都應該學習的Python“技巧”。雖然我認為它們是我們應該注意的功能,但我發現它們大多數時候不是特別有用,因為它們缺乏靈活性。
Lambda是在一行中編寫一個一次性使用的函數的方法。如果函數被多次調用,性能會受到影響。另一方面,map將一個函數應用于列表中的所有元素,而filter則獲取滿足用戶定義條件的集合中的元素子集。
add_func = lambda z: z ** 2 is_odd = lambda z: z%2 == 1 multiply = lambda x,y: x*y aList = list(range(10)) print(aList) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
列表理解是一種簡潔而靈活的方法,它可以用靈活的表達式和條件從其他列表創建列表。它是由一個方括號構造的,其中的表達式或函數僅在元素滿足某種條件時才應用于列表中的每個元素。它還可以嵌套來處理嵌套列表,并且比使用map和filter靈活得多。
# Syntax of list comprehension [ expression(x) for x in aList if optional_condition(x) ] print(list(map(add_func, aList))) print([x ** 2 for x in aList]) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] print(list(filter(is_odd, aList))) print([x for x in aList if x%2 == 1]) # [1, 3, 5, 7, 9] # [1, 3, 5, 7, 9]
Python允許反向索引,其中列表[-1]==列表[len(列表)-1]。因此,我們可以通過調用aList[-2]等方法獲取列表中的最后一個元素。
我們還可以使用syntax aList[start:end:step]對列表進行切片,其中包含開始元素,但不包含結束元素。
我們還可以使用語法列表對列表進行切片,其中包含起始元素,但不包含結束元素。因此,調用aList[2:5]給出了[2,3,4]。我們還可以通過調用aList[::-1]來反轉列表,我發現這種技術非常優雅。
列表也可以解壓成單獨的元素,或者使用星號將元素和子列表混合。
a, b, c, d = aList[0:4] ?????? print(f'a = {a}, b = , c = {c}, d = {d}') ?????? # a = 0, b = 1, c = 2, d = 3 ?????? ?????? a, *b, c, d = aList ?????? print(f'a = {a}, b = , c = {c}, d = {d}') ?????? # a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9
Zip函數創建一個迭代器,用于聚合來自多個列表的元素。它允許在for循環中并行遍歷列表并并行排序??梢允褂眯翘柦鈮嚎s它。
numList = [0, 1, 2] engList = ['zero', 'one', 'two'] espList = ['cero', 'uno', 'dos'] print(list(zip(numList, engList, espList))) # [(0, 'zero', 'cero'), (1, 'one', 'uno'), (2, 'two', 'dos')] for num, eng, esp in zip(numList, engList, espList): print(f'{num} is {eng} in English and {esp} in Spanish.') # 0 is zero in English and cero in Spanish. # 1 is one in English and uno in Spanish. # 2 is two in English and dos in Spanish. Eng = list(zip(engList, espList, numList)) Eng.sort() # sort by engList a, b, c = zip(*Eng) print(a) print(b) print(c) # ('one', 'two', 'zero') # ('uno', 'dos', 'cero') # (1, 2, 0)
Enumerate一開始可能看起來有點嚇人,但在許多場景中非常方便。它是一個經常在for循環中使用的自動計數器,因此在for循環中不再需要通過counter = 0和counter += 1來創建和初始化計數器變量。在構造for循環時,Enumerate和zip是兩個最強大的工具。
upperCase = ['A', 'B', 'C', 'D', 'E', 'F'] lowerCase = ['a', 'b', 'c', 'd', 'e', 'f'] for i, (upper, lower) in enumerate(zip(upperCase, lowerCase), 1): print(f'{i}: {upper} and {lower}.') # 1: A and a. # 2: B and b. # 3: C and c. # 4: D and d. # 5: E and e. # 6: F and f.
當我們打算計算大量結果,但希望避免同時分配所有結果所需的內存時,將使用生成器。換句話說,它們動態地生成值,并且不將以前的值存儲在內存中,因此我們只能對它們進行一次迭代。
它們通常用于讀取大文件或使用關鍵字yield生成無限序列。我經常發現它在我的大多數數據科學項目中很有用。
def gen(n):??? # an infinite sequence generator that generates integers >= n ?????? ??? while True: ?????? ??????? yield n ?????? ??????? n += 1?????? ??????? ?????? G = gen(3)???? # starts at 3 ?????? print(next(G)) # 3 ?????? print(next(G)) # 4 ?????? print(next(G)) # 5 ?????? print(next(G)) # 6
如果您只能記住本文中的一件事,那么它應該是虛擬環境的使用。
Python應用程序經常使用來自具有復雜依賴關系的不同開發人員的許多不同包。不同的應用程序是使用特定的庫設置開發的,其中的結果不能使用其他庫版本復制。不存在滿足所有應用要求的單個安裝。
conda create -n venv pip python=3.7 # select python version source activate venv ... source deactivate
因此,為每個應用程序創建獨立的自包含虛擬環境非常重要,可以使用pip或conda來完成。
原文鏈接:https://towardsdatascience.com/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4
歡迎關注ATYUN官方公眾號
商務合作及內容投稿請聯系郵箱:bd@atyun.com
要發表評論,您必須先登錄。