【導讀】2020年,你又立了什麼新的 Flag?新一年,我們先為大家準備 30 個非常優秀的 Python 實踐技巧。希望這些訣竅能在實際工作中幫助大家,並且學到一些有用的知識。 1、使用 python 3由於官方從2020年1月1日起就停止了對python2.7的更新支持,因此本教程的大部分例子都 ...
【導讀】2020年,你又立了什麼新的 Flag?新一年,我們先為大家準備 30 個非常優秀的 Python 實踐技巧。希望這些訣竅能在實際工作中幫助大家,並且學到一些有用的知識。
1、使用 python 3
由於官方從2020年1月1日起就停止了對python2.7的更新支持,因此本教程的大部分例子都只能在python 3環境下運行。如果你仍然在使用2.7版本,請先升級到python 3。
2、檢查並使用滿足需求的最小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、使用IPython
IPython 基本上是一個增強的shell,僅僅是為了自動補全功能,IPython也是值得使用的,但其實它還有更多作用,包括內建的Magic命令,這裡列舉了一些:
-
%cd:改變當前的工作目錄
-
%edit:打開編輯器併在關閉編輯器後執行鍵入的代碼
-
%env:顯示當前的環境變數
-
%pip:install [pkgs] 在不離開互動式shell的情況下安裝功能包
-
%time 和 %timeit:類似於python中的time模塊,可以為代碼運行計時
IPython的另一個有用功能是可以使用之前任意一行代碼的輸出,代碼的輸入和輸入實際上都是對象,例如可以通過 Out[3] 來使用第三次運行代碼的輸出對象。安裝IPython的指令是:
pip3 install ipython
4.列表解析式
列表解析式可以用來替換通過loop來填充列表的醜陋方法,其基本語法是:
[ expression for item in list if conditional ]
一個非常基礎的例子,用於生成包含連續數字的列表:
mylist = [i for i in range(10)] print(mylist) # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
由於可以使用表達式,因此可以通過更複雜的數學方法來生成列表:
squares = [x**2 for x in range(10)] print(squares) # [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
甚至也可以調用外部函數:
def some_function(a): return (a + 5) / 2 my_formula = [some_function(i) for i in range(10)] print(my_formula) # [2, 3, 3, 4, 4, 5, 5, 6, 6, 7]
最後,也可以用if作為生成條件來對列表進行過濾。在下麵的例子中,只有偶數被保留:
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(object)命令可以查看任何對象的記憶體使用情況:
import sys mylist = range(0, 10000) print(sys.getsizeof(mylist)) # 48
這是因為range函數返回的是一個類對象,這個類對象表現為一個列表。因此使用range函數比使用實際的包含一萬個數字的列表要更加節省記憶體。可以通過上面第四條中提到的列表解析式創建一個同樣大小的實際列表:
import sys myreallist = [x for x in range(0, 10000)] print(sys.getsizeof(myreallist)) # 87632
實際記憶體占用87632位元組,遠高於通過range函數生成的對象。
6、返回多個值
Pyhon中的函數都可以返回多個變數,而不需要字典,列表或者類作為返回對象。方法如下:
def get_user(id): # fetch user from database # .... return name, birthdate name, birthdate = get_user(4)
對於有限數量的返回值,這是可以的。但是任何超過3個值的內容都應該放到一個(data)類中。
7、使用 data 類
從3.7版本開始,python提供了 data 類。與常規類或其他替代方法(如返回多個值或字典)相比,有以下幾個優點:
-
數據類需要至少一定數量的代碼
-
可以通過 eq 方法來比較不同的data類對象
-
可以 repr 通過很容易地列印一個數據類來進行調試
-
數據類需要類型提示,因此減少了 bug
一個data類的例子如下:
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')
8、就地變數交換
一個簡潔的技巧,可以節省幾行代碼:
a = 1 b = 2 a, b = b, a print (a) # 2 print (b) # 1
9、字典合併(Python 3.5+)
從python 3.5開始,字典的合併變得更簡單了:
dict1 = { 'a': 1, 'b': 2 } dict2 = { 'b': 3, 'c': 4 } merged = { **dict1, **dict2 } print (merged) # {'a': 1, 'b': 3, 'c': 4}
10、將字元串轉化為標題格式
在標題格式中,非介詞的首字母會大寫。可以通過.title()方法實現:
mystring = "10 awesome python tricks" print(mystring.title()) '10 Awesome Python Tricks'
11、將字元串分離並存儲到列表中
可以按任意字元來分割字元串,並存儲到列表中,例如按空格來分割字元串:
mystring = "The quick brown fox" mylist = mystring.split(' ') print(mylist) # ['The', 'quick', 'brown', 'fox']
12、將列表中的字元串合併到一起
與上一條的功能正好相反,從列表中創建字元串,併在兩個單詞間插入空格:
mylist = ['The', 'quick', 'brown', 'fox'] mystring = " ".join(mylist) print(mystring) # 'The quick brown fox'
也許你會疑惑,為什麼不使用mylist.join(" ")呢?歸根結底,String.join()函數不僅可以連接列表,還可以連接任何可迭代的列表。將它放在String中會阻止在多個位置實現相同的功能。
13、Emoji
這些表情具有很強的表達能力,能給人留下深刻印象。更重要的是,這在分析社交媒體數據時尤其有用。首先通過以下命令安裝emoji模塊:
pip3 install emoji
可以按照以下方法使用表情:
import emoji result = emoji.emojize('Python is :thumbs_up:') print(result) # 'Python is