翻譯 | 30個 Python3 的最佳實踐,技巧和竅門
阿新 • • 發佈:2021-01-07
### **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