1. 程式人生 > >翻譯 | 30個 Python3 的最佳實踐,技巧和竅門

翻譯 | 30個 Python3 的最佳實踐,技巧和竅門

### **1、使用 Python3** 如果你關注 Python 的話,應該會知道 Python 2 已經於今年(2020 年)1 月 1 日正式棄用了。這份教程的很多例子都是隻支援 Python 3 的,如果你還在用 Python 2.1,那也是時候與時俱進了。 ### **2、檢查所需的最低 Python 版本** 你可以在程式碼中先檢查一下你的 Python 版本,以免當前使用者的 Python 版本與你的指令碼不適配。實現的程式碼很簡單: ```python if not sys.version_info > (2, 7): # berate your user for running a 10 year # python version elif not sys.version_info >= (3, 5): # Kindly tell your user (s)he needs to upgrade # because you're using 3.5 features ``` ### **3. Use IPython** ![](https://cdn.jsdelivr.net/gh/Kanna-jiahe/blogimage/img/20210106215202.png) IPython 其實就是升級版的 shell,單單是自帶的自動補全功能就值得你使用它了。不過它的優勢不止這些,它那些如魔法般的內建命令列也讓是我愛使用它的原因。這些命令有: - %cd—修改當前工作路徑 - %edit—開啟編輯器,並在關閉時執行你剛剛輸入的程式碼 - %env—顯示當前環境變數 - %pip install [pkgs]—在不離開 Shell 的情況下安裝包 - %time and %timeit—為 Python 程式碼計時 如果你想了解更多的命令,可以參考這個網站: https://ipython.readthedocs.io/en/stable/interactive/magics.html。 還有一個有用的功能就是調取之前的命令輸出,這裡的輸入和輸出其實都是物件。例如,你可以用 Out[3] 來調取第三條命令的輸出。 你可以用下面這條命令安裝 IPython: ```python pip3 install ipython ``` ### **4、列表表示式** 有了列表表示式,你就不再需要用 for loop 來生成一個 list 了。其基本語法是這樣的: ```python [ expression for item in list if conditional ] ``` 這就是一個生成包含一串數字的 list 的簡單例子。 ```python mylist = [i for i in range(10)] print(mylist) # 0 1 2 3 4 5 6 7 8 9 ``` 在這條命令裡還可以使用表示式(expression),所以也可以做一些數學運算: ```python squares = [x**2 for x in range(10)] print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] ``` 你甚至可以呼叫一個外部函式: ```python def some_function(a): return (a + 5) / 2 my_formula = [some_function(i) for i in range(10)] print(my_formula) # [2.5, 3.0, 3.5, 4.0, 4.5, 5.0, 5.5, 6.0, 6.5, 7.0] ``` 最後,你也可以在生成 list 時用 if 語句進行篩選。下面這個例子中,我們只保留了能被 2 整除的值: ```python filtered = [i for i in range(20) if i%2==0] print(filtered) # [0, 2, 4, 6, 8, 10, 12, 14, 16, 18] ``` ### **5、檢查你的物件佔用了多少記憶體** 你可以使用 sys.getsizeof() 來檢視你建立的物件佔用的記憶體大小: ```python import sys mylist = range(0, 10000) print(sys.getsizeof(mylist)) # 48 ``` 哇,等一下,為什麼這麼大的 list 只有 48 位元組? 這是因為 range 函式只返回了一個類似 list 的類。由此可見,相較於直接使用 list,使用 range 能節省很多空間: ```python import sys myreallist = [x for x in range(0, 10000)] print(sys.getsizeof(myreallist)) # 87632 ``` **6、返回多個值** Python 的函式可以同時返回多個值,也並不需要使用 dictionary,list 或是類這樣的資料結構。它的工作機制是這樣的 ```python def get_uset(id): # 從資料庫中獲取使用者 # ... return name,birthdate name,birthdate = get_user(4) ``` 這種方式在返回值的數量很少時是可以的,但是如果返回值超過 3 個,那它們就該被放到一個(資料)類中了。 ### **7、使用 資料類** Python 從 3.7 開始提供資料類功能。這種功能與常規的類以及其他類似的功能(返回多個值的函式以及 dictionary)相比較,有以下優勢: - 資料型別有最低程式碼量要求 - 因為資料類已經自帶了__eq__功能,故而你可以直接進行資料類的對比 - 資料類自帶__repr__,你也可以直接在 debug 時打印出一個數據類 - 資料型別需要你輸入提示,這樣 bug 量會大大減少 下面展示了一個實用的資料類例子: ```python from dataclasses import dataclass @dataclass class Card: rank: str suit: str card = Card("Q", "hearts") print(card == card) # True print(card.rank) # 'Q' print(card) Card(rank='Q', suit='hearts') ``` 想更深入的瞭解資料類,可以參考:https://realpython.com/python-data-classes/ ### **8、在位置不變的情況下交換變數** 一個小技巧就可以減少很多行程式碼: ```python a = 1 b = 2 a, b = b, a print(a) # 2 print(b) # 1 ``` ### **9、合併 dictionary(Python 3.5+)** 從 Python 3.5 開始,dictionary 的合併變得更容易了: ```python dict1 = { 'a': 1, 'b': 2 } dict2 = { 'b': 3, 'c': 4 } merged = { **dict1, **dict2 } print (merged) # {'a': 1, 'b': 3, 'c': 4} ``` 如果有重複的 key,那麼第一個詞典的這個 key 對應的值會被覆蓋掉。 ### **10、把字串變成標題形式** 這只是 Python 中的寶藏之一: ```python mystring = "10 awesome python tricks" print(mystring.title()) '10 Awesome Python Tricks' ``` ### **11、把字串分割成 list** 你可以把一個字串分割成一個 list 的字串。下面的例子中,我們是按照空格分割字串的: ```python mystring = "The quick brown fox" mylist = mystring.split(' ') print(mylist) # ['The', 'quick', 'brown', 'fox'] ``` ### **12、將一個字串列表變成字串** 把上一個小技巧反過來,我們也可以把一個 list 變成一個字串,並在每個詞中間插入空格: ```python mylist = ['The', 'quick', 'brown', 'fox'] mystring = " ".join(mylist) print(mystring) # 'The quick brown fox' ``` 你可能在想為什麼不用 ```python mylist.join(" ") ``` 好問題! 這是因為 String.join() 可以連線任何可迭代物件,不只是列表。在 String 中用這個函式可以防止這些操作發生在我們不想他發生的地方。 ### 13、Emoji ![1_5wWvIDF3MAJdPYEUI3InuA](C:\Users\橘天\Desktop\1_5wWvIDF3MAJdPYEUI3InuA.png) 這個功能有些人喜歡,有些人則很抗拒,因人而異。嚴格來說,這個功能主要好處就是在分析社交資料時可以更加方便。 首先,你要安裝 emoji 模組: ```python pip install emoji ``` 安裝完後,你可以像下面這樣使用這個模組: ```python import emoji result = emoji.emojize('Python is :thumbs_up:') print(result) # 'Python is