12.29 我希望我一開始就知道的5個Python功能

Python技巧超越了lambda,map和filter

我希望我一開始就知道的5個Python功能

Photo by Kirill Sharkovski on Unsplash

Python可以說是十年來新興的編程語言,並且被證明是一種非常強大的語言。 從交互式地圖到區塊鏈,我已經使用Python構建了許多應用程序。 Python有許多功能,對於初學者來說,一開始很難掌握所有功能。

即使您是從其他語言(例如C或MATLAB)切換來的程序員,使用Python進行更高級別抽象的編碼絕對是另一種體驗。 我希望我早先了解一些Python功能,並重點介紹了五個最重要的功能。

1.列推導表達式-緊湊代碼

很多人會把lambda,map和filter稱為Python的"技巧",這是每個初學者都應該學習的。 儘管我認為它們是我們應該意識到的功能,但由於它們缺乏靈活性,因此在大多數情況下它們並不是特別有用。

Lambda是一種將功能組合在一行中以供一次性使用的方法。 如果多次調用函數,則會降低性能。 另一方面,map將函數應用於列表中的所有元素,而filter獲取集合中滿足用戶定義條件的元素子集。

<code>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]/<code>
我希望我一開始就知道的5個Python功能

Photo by Anastase Maragos on Unsplash


列推導表達式是一種簡潔而靈活的方法,可以從其他具有靈活表達式和條件的列表中創建列表。 它由方括號構造,帶有表達式或函數,僅當元素滿足特定條件時,該表達式或函數才應用於列表中的每個元素。 它也可以嵌套以處理嵌套列表,並且比使用地圖和過濾器靈活得多。

<code># Syntax of list comprehension
[ expression(x) for x in aList if optional_condition(x) ]/<code>
<code>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]/<code>

2.列表操作-循環列表

Python允許負索引,其中aList [-1] == aList [len(aList)-1]。 因此,我們可以通過調用aList [-2]來獲得列表中的倒數第二個元素。

我們還可以使用aList [start:end:step]語法對列表進行切片,其中包括開始元素,但沒有結束元素。 因此,調用aList [2:5]會得到[2,3,4]。 我們也可以簡單地通過調用aList [::-1]來反轉列表,我發現這種技術非常優雅。

我希望我一開始就知道的5個Python功能

Photo by Martin Shreder on Unsplash

列表也可以解包為單獨的元素,或者使用星號將元素和子列表混合在一起。

<code>a, b, c, d = aList[0:4]
print(f'a = {a}, b = {b}, c = {c}, d = {d}')
# a = 0, b = 1, c = 2, d = 3

a, *b, c, d = aList
print(f'a = {a}, b = {b}, c = {c}, d = {d}')
# a = 0, b = [1, 2, 3, 4, 5, 6, 7], c = 8, d = 9/<code>

3.zipping和枚舉-for循環

Zip函數創建一個迭代器,該迭代器聚合來自多個列表的元素。 它允許在for循環中並行遍歷列表並並行排序。 可以使用星號將其解壓縮。

<code>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./<code>
<code>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)/<code>
我希望我一開始就知道的5個Python功能

Photo by Erol Ahmed on Unsplash

枚舉起初可能看起來有些嚇人,但在許多情況下變得非常方便。 這是一個自動計數器,通常在for循環中使用,因此不再需要通過counter = 0和counter + = 1在for循環中創建和初始化計數器變量。枚舉和zip是兩個 構建for循環時最強大的工具。

<code>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./<code>

4.生成器-內存效率

當我們打算計算大量結果但希望避免同時分配所有結果所需的內存時,將使用生成器。 換句話說,它們會即時生成值,並且不會將先前的值存儲在內存中,因此我們只能對其進行一次迭代。

當讀取大文件或使用關鍵字yield生成無限序列時,通常使用它們。 我經常在大多數數據科學項目中發現它很有用。

<code>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/<code>

5.虛擬環境-隔離

如果您只記得本文中的一件事,那麼應該是使用虛擬環境。

我希望我一開始就知道的5個Python功能

Photo by Matthew Kwong on Unsplash

Python應用程序經常使用來自具有複雜依賴關係的各種開發人員的許多不同軟件包。 使用特定的庫設置開發了不同的應用程序,在該應用程序中,無法使用其他庫版本來複制結果。 沒有一個可以滿足所有應用程序要求的安裝環境。

<code>conda create -n venv pip python=3.7  # select python version
source activate venv
...
source deactivate/<code>

因此,為每個應用程序創建單獨的獨立虛擬環境至關重要,這可以使用pip或conda來完成。


(本文翻譯自Eden Au的文章《5 Python features I wish I had known earlier》,參考:https://towardsdatascience.com/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4)


分享到:


相關文章: