02.01 10個Python速成技巧

10個Python速成技巧

據Stack Overflow聲稱,Python是增長最快的編程語言。《福布斯》的最新文章稱,Python去年的增長幅度高達456%。Netflix使用Python,IBM使用Python另外成百上千家公司都在使用Python。別忘了Dropbox。Dropbox也是用Python開發的。據Dice的研究顯示,Python也是熱門的必備技能之一;從《編程語言人氣指數》來看,它也是世界上最受歡迎的編程語言。

與其他編程語言相比,Python的一些優點包括:

  • 與主要的平臺和操作系統兼容

  • 有許多開源框架和工具

  • 可讀且可維護的代碼

  • 強大的標準庫

  • 標準的測試驅動型開發

本文將介紹10個實用的代碼技巧,它們可幫助你完成日常任務。

連接字符串

你需要連接字符串列表時,可以通過逐個添加每個元素、使用for loop來實現此目的。但這麼做效率很低,列表很長的話更是如此。在Python中,字符串不可變,因此對於每一對連接而言,必須將左右字符串複製到新字符串中。

一種更好的方法是使用join函數,如下所示:

<code>characters = ['p', 'y', 't', 'h', 'o', 'n'] /<code><code>word = "".join(characters) /<code><code>print(word) # python /<code>

使用列表推導

列表推導用於從其他可迭代對象(iterable)創建新列表。列表推導返回列表時,它們由包含表達式的方括號組成,該表達式針對每個元素連同for loop加以執行,以便對每個元素執行迭代處理。列表推導速度更快,因為它針對Python解釋器進行了優化,以便循環期間發現可預測的模式。

比如,假設使用列表推導來查找前五個整數的平方。

<code>m = [x ** 2 for x in range(5)] /<code><code>print(m) # [0, 1, 4, 9, 16] /<code>

現在,假設使用列表推導從兩個列表中查找通用數字:

<code>list_a = [1, 2, 3, 4] /<code><code>list_b = [2, 3, 4, 5] /<code><code>common_num = [a for a in list_a for b in list_b if a == b] /<code><code>print(common_num) # [2, 3, 4] /<code>

用enumerate進行迭代

enumerate方法為可迭代對象添加一個計數器,並以枚舉對象的形式返回。

不妨解決通常名為Fizz Buzz問題的經典編碼面試問題。

編寫一個程序來打印輸出列表中的數字;如果是“3”的倍數,輸出“fizz”,而不是輸出數字;如果是“5”的倍數,輸出“buzz”;如果同時是3和5的倍數,輸出“fizzbuzz”。

<code>numbers = [30, 42, 28, 50, 15] /<code><code>for i, num in enumerate(numbers): /<code><code>if num % 3 == 0 and num % 5 == 0: /<code><code>numbers[i] = 'fizzbuzz' /<code><code>elif num % 3 == 0: /<code><code>numbers[i] = 'fizz' /<code><code>elif num % 5 == 0: /<code><code>numbers[i] = 'buzz' /<code><code>print(numbers) # ['fizzbuzz', 'fizz', 28, 'buzz', 'fizzbuzz']/<code>

處理列表時使用zip

假設你被賦予一項任務,合併長度相同的多個列表,並打印輸出結果?同樣,有一種更通用的方法獲得所需的結果,只需使用zip,如以下代碼所示:

<code>countries = ['France', 'Germany', 'Canada'] /<code><code>capitals = ['Paris', 'Berlin', 'Ottawa'] /<code><code>for country, capital in zip(countries,capitals): /<code><code>print(country, capital) # France Paris /<code><code>Germany Berlin /<code><code>Canada Ottawa/<code>

使用itertools

Python itertools模塊是用於處理迭代器(iterator)的一系列工具。迭代器有多個工具可用於生成輸入數據的可迭代對象序列。此處以itertools.combinations為例。itertools.combinations用於構建組合。這些也是輸入值的可能分組。

不妨舉一個實際例子來闡明上面這點。

假設四支球隊參加比賽。在小組賽階段,每支球隊與另外每支球隊對抗。你的任務是為彼此對抗的每支球隊排出所有可能的組合。

不妨看一下以下代碼:

<code>import itertools /<code><code>friends = ['Team 1', 'Team 2', 'Team 3', 'Team 4'] /<code><code>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')] /<code>

要注意的重要一點是,值的順序並不重要。由於('Team 1','Team 2')和('Team 2','Team 1')代表同一對,所以輸出列表中僅包含其中一個。同樣,我們可以使用itertools.permutations以及該模塊中的其他函數。

使用Python集合

Python集合是容器數據類型,即列表、組集、元組和字典。集合模塊提供了高性能的數據類型以改進你的代碼,

大大簡化任務。集合模塊提供了許多函數。我在此處將使用Counter函數。

Counter函數拿來可迭代對象(比如列表或元組)後返回Counter Dictionary。字典的鍵將是可迭代對象中的獨特元素,而每個鍵的值將是可迭代對象中的元素計數。

想創建counter對象,將可迭代對象(列表)傳遞給Counter函數,如以下代碼所示:

<code>from collections import Countercount = Counter(['a','b','c','d','b','c','d','b']) /<code><code>print(count) # Counter({'b': 3, 'c': 2, 'd': 2, 'a': 1})/<code>

將兩個列表轉換成字典

假設我們有兩個列表,一個列表包含學生的姓名,第二個列表包含學生的分數。不妨看看如何將這兩個列表轉換成一個字典。使用zip函數,可以使用以下代碼完成此操作:

<code>students = ["Peter", "Julia", "Alex"] /<code><code>marks = [84, 65, 77] /<code><code>dictionary = dict(zip(students, marks)) /<code><code>print(dictionary) # {'Peter': 84, 'Julia': 65, 'Alex': 77}/<code>

使用Python生成器

生成器函數讓你可以聲明行為類似迭代器的函數。它們讓程序員能夠以快速、簡單和簡潔的方式生成迭代器。不妨舉例解釋這個概念。

假設你需要為前100000000個完美平方數求總和,從1開始。

是不是看起來很簡單?使用列表推導很容易做到這一點,但問題是輸入量很大。不妨看看以下代碼:

<code>t1 = time.clock /<code><code>sum([i * i for i in range(1, 100000000)]) /<code><code>t2 = time.clock /<code><code>time_diff = t2 - t1 /<code><code>print(f"It took {time_diff} Secs to execute this method") # It took 13.197494000000006 Secs to execute this method/<code>

增加需要求和的完美平方數時,我們意識到:由於較長的計算時間,這個方法行不通。這時候Python生成器可助一臂之力。將方括號換成圓括號後,我們將列表推導變成了生成器表達式。現在不妨計算所花的時間:

<code>t1 = time.clock /<code><code>sum((i * i for i in range(1, 100000000))) /<code><code>t2 = time.clock /<code><code>time_diff = t2 - t1 /<code><code>print(f"It took {time_diff} Secs to execute this method") # It took 9.53867000000001 Secs to execute this method/<code>

可以看到,所花的時間已大幅縮短。如果是更龐大的輸入,這個效果會更顯著。

從函數返回多個值

Python能夠從函數調用返回多個值,這是許多其他流行的編程語言缺少的功能。在這種情況下,返回值應是逗號分隔的值列表,然後Python構造一個元組並將其返回給調用方。不妨看看以下代碼:

<code>def multiplication_division(num1, num2): /<code><code>return num1*num2, num1/num2 /<code><code>product, division = multiplication_division(15, 3) /<code><code>print("Product=", product, "Quotient =", division) # Product= 45 Quotient = 5.0/<code>

使用sorted函數

Python中對任何序列進行排序很容易,只需使用內置方法sorted,它為你完成了所有棘手的工作。sorted可對任何序列(列表和元組)進行排序,始終返回元素以排序的方式顯示的列表。不妨看看對數字列表進行升序排序。

<code>sorted([3,5,2,1,4]) # [1, 2, 3, 4, 5] /<code>

另舉一個例子,對字符串列表進行降序排序。

<code>sorted(['france', 'germany', 'canada', 'india', 'china'], reverse=True) # ['india', 'germany', 'france', 'china', 'canada']/<code>

End.

零基礎入職數據分析就業班

課程的形式主要是“直播+錄播”

報名專享:課程項目作業+1v1班主任監督學習+愛數據學院學員專屬網站+班級答疑群

課程結束後能熟練掌握SQL、Python、Excel、PPT等工具

適合人群:

1.轉行(崗位相關,專業相關、對數據分析感興趣)

2.從事數據分析工作,但是需要提升技能以及增加實戰經驗

3.應屆畢業生入職數據分析


分享到:


相關文章: