可現(xiàn)學(xué)現(xiàn)用的10個Python技巧
譯文【51CTO.com快譯】據(jù)Stack Overflow聲稱,Python是增長最快的編程語言?!陡2妓埂返淖钚挛恼路Q,Python去年的增長幅度高達456%。Netflix使用Python,IBM使用Python另外成百上千家公司都在使用Python。別忘了Dropbox。Dropbox也是用Python開發(fā)的。據(jù)Dice的研究顯示,Python也是熱門的必備技能之一;從《編程語言人氣指數(shù)》來看,它也是世界上最受歡迎的編程語言。
與其他編程語言相比,Python具有的一些優(yōu)點包括:
- 與主要的平臺和操作系統(tǒng)兼容
- 有許多開源框架和工具
- 可讀且可維護的代碼
- 強大的標(biāo)準(zhǔn)庫
- 標(biāo)準(zhǔn)的測試驅(qū)動型開發(fā)
本文將介紹10個實用的代碼技巧,它們可幫助你完成日常任務(wù)。
1. 連接字符串
你需要連接字符串列表時,可以通過逐個添加每個元素、使用for loop來實現(xiàn)此目的。但這么做效率很低,列表很長的話更是如此。在Python中,字符串不可變,因此對于每一對連接而言,必須將左右字符串復(fù)制到新字符串中。
一種更好的方法是使用join()函數(shù),如下所示:
- characters = ['p', 'y', 't', 'h', 'o', 'n']
- word = "".join(characters)
- print(word) # python
2. 使用列表推導(dǎo)
列表推導(dǎo)用于從其他可迭代對象(iterable)創(chuàng)建新列表。列表推導(dǎo)返回列表時,它們由包含表達式的方括號組成,該表達式針對每個元素連同for loop加以執(zhí)行,以便對每個元素執(zhí)行迭代處理。列表推導(dǎo)速度更快,因為它針對Python解釋器進行了優(yōu)化,以便循環(huán)期間發(fā)現(xiàn)可預(yù)測的模式。
比如,假設(shè)使用列表推導(dǎo)來查找前五個整數(shù)的平方。
- m = [x ** 2 for x in range(5)]
- print(m) # [0, 1, 4, 9, 16]
現(xiàn)在,假設(shè)使用列表推導(dǎo)從兩個列表中查找通用數(shù)字:
- list_a = [1, 2, 3, 4]
- list_b = [2, 3, 4, 5]
- common_num = [a for a in list_a for b in list_b if a == b]
- print(common_num) # [2, 3, 4]
3. 用enumerate()進行迭代
enumerate()方法為可迭代對象添加一個計數(shù)器,并以枚舉對象的形式返回。
不妨解決通常名為Fizz Buzz問題的經(jīng)典編碼面試問題。
編寫一個程序來打印輸出列表中的數(shù)字;如果是“3”的倍數(shù),輸出“fizz”,而不是輸出數(shù)字;如果是“5”的倍數(shù),輸出“buzz”;如果同時是3和5的倍數(shù),輸出“fizzbuzz”。
- numbers = [30, 42, 28, 50, 15]
- for i, num in enumerate(numbers):
- if num % 3 == 0 and num % 5 == 0:
- numbers[i] = 'fizzbuzz'
- elif num % 3 == 0:
- numbers[i] = 'fizz'
- elif num % 5 == 0:
- numbers[i] = 'buzz'
- print(numbers) # ['fizzbuzz', 'fizz', 28, 'buzz', 'fizzbuzz']
4. 處理列表時使用zip
假設(shè)你被賦予一項任務(wù),合并長度相同的多個列表,并打印輸出結(jié)果?同樣,有一種更通用的方法獲得所需的結(jié)果,只需使用zip(),如以下代碼所示:
- countries = ['France', 'Germany', 'Canada']
- capitals = ['Paris', 'Berlin', 'Ottawa']
- for country, capital in zip(countries,capitals):
- print(country, capital) # France Paris
- Germany Berlin
- Canada Ottawa
5. 使用itertools
Python itertools模塊是用于處理迭代器(iterator)的一系列工具。迭代器有多個工具可用于生成輸入數(shù)據(jù)的可迭代對象序列。此處以itertools.combinations()為例。itertools.combinations()用于構(gòu)建組合。這些也是輸入值的可能分組。
不妨舉一個實際例子來闡明上面這點。
假設(shè)四支球隊參加比賽。在小組賽階段,每支球隊與另外每支球隊對抗。你的任務(wù)是為彼此對抗的每支球隊排出所有可能的組合。
不妨看一下以下代碼:
- import itertools
- friends = ['Team 1', 'Team 2', 'Team 3', 'Team 4']
- list(itertools.combinations(friends, r=2)) # [('Team 1', 'Team 2'), ('Team 1', 'Team 3'), ('Team 1', 'Team 4'), ('Team 2', 'Team 3'), ('Team 2', 'Team 4'), ('Team 3', 'Team 4')]
要注意的重要一點是,值的順序并不重要。由于('Team 1','Team 2')和('Team 2','Team 1')代表同一對,所以輸出列表中僅包含其中一個。同樣,我們可以使用itertools.permutations()以及該模塊中的其他函數(shù)。想了解更完整的內(nèi)容,參閱這篇教程(https://medium.com/@jasonrigden/a-guide-to-python-itertools-82e5a306cdf8)。
6. 使用Python集合
Python集合是容器數(shù)據(jù)類型,即列表、組集、元組和字典。集合模塊提供了高性能的數(shù)據(jù)類型以改進你的代碼,大大簡化任務(wù)。集合模塊提供了許多函數(shù)。我在此處將使用Counter()函數(shù)。
Counter()函數(shù)拿來可迭代對象(比如列表或元組)后返回Counter Dictionary。字典的鍵將是可迭代對象中的獨特元素,而每個鍵的值將是可迭代對象中的元素計數(shù)。
想創(chuàng)建counter對象,將可迭代對象(列表)傳遞給Counter()函數(shù),如以下代碼所示:
- from collections import Countercount = Counter(['a','b','c','d','b','c','d','b'])
- print(count) # Counter({'b': 3, 'c': 2, 'd': 2, 'a': 1})
想了解更完整的內(nèi)容,參閱我的Python集合教程(https://towardsdatascience.com/a-hands-on-guide-to-python-collections-aa350cb399e3)。
7. 將兩個列表轉(zhuǎn)換成字典
假設(shè)我們有兩個列表,一個列表包含學(xué)生的姓名,第二個列表包含學(xué)生的分數(shù)。不妨看看如何將這兩個列表轉(zhuǎn)換成一個字典。使用zip函數(shù),可以使用以下代碼完成此操作:
- students = ["Peter", "Julia", "Alex"]
- marks = [84, 65, 77]
- dictionary = dict(zip(students, marks))
- print(dictionary) # {'Peter': 84, 'Julia': 65, 'Alex': 77}
8. 使用Python生成器
生成器函數(shù)讓你可以聲明行為類似迭代器的函數(shù)。它們讓程序員能夠以快速、簡單和簡潔的方式生成迭代器。不妨舉例解釋這個概念。
假設(shè)你需要為前100000000個完美平方數(shù)求總和,從1開始。
是不是看起來很簡單?使用列表推導(dǎo)很容易做到這一點,但問題是輸入量很大。不妨看看以下代碼:
- t1 = time.clock()
- sum([i * i for i in range(1, 100000000)])
- t2 = time.clock()
- time_diff = t2 - t1
- print(f"It took {time_diff} Secs to execute this method") # It took 13.197494000000006 Secs to execute this method
增加需要求和的完美平方數(shù)時,我們意識到:由于較長的計算時間,這個方法行不通。這時候Python生成器可助一臂之力。將方括號換成圓括號后,我們將列表推導(dǎo)變成了生成器表達式?,F(xiàn)在不妨計算所花的時間:
- t1 = time.clock()
- sum((i * i for i in range(1, 100000000)))
- t2 = time.clock()
- time_diff = t2 - t1
- print(f"It took {time_diff} Secs to execute this method") # It took 9.53867000000001 Secs to execute this method
可以看到,所花的時間已大幅縮短。如果是更龐大的輸入,這個效果會更顯著。
9. 從函數(shù)返回多個值
Python能夠從函數(shù)調(diào)用返回多個值,這是許多其他流行的編程語言缺少的功能。在這種情況下,返回值應(yīng)是逗號分隔的值列表,然后Python構(gòu)造一個元組并將其返回給調(diào)用方。 不妨看看以下代碼:
- def multiplication_division(num1, num2):
- return num1*num2, num1/num2
- product, division = multiplication_division(15, 3)
- print("Product=", product, "Quotient =", division) # Product= 45 Quotient = 5.0
10. 使用sorted()函數(shù)
Python中對任何序列進行排序很容易,只需使用內(nèi)置方法sorted(),它為你完成了所有棘手的工作。sorted()可對任何序列(列表和元組)進行排序,始終返回元素以排序的方式顯示的列表。不妨看看對數(shù)字列表進行升序排序。
- sorted([3,5,2,1,4]) # [1, 2, 3, 4, 5]
另舉一個例子,對字符串列表進行降序排序。
- sorted(['france', 'germany', 'canada', 'india', 'china'], reverse=True) # ['india', 'germany', 'france', 'china', 'canada']
原文標(biāo)題:10 Python Tips and Tricks You Should Learn Today,作者:Abhinav Sagar
【51CTO譯稿,合作站點轉(zhuǎn)載請注明原文譯者和出處為51CTO.com】