所有參與投票的 CSDN 用戶都參加抽獎活動
群內公布獎項,還有更多福利贈送
作者 | Erik-Jan van Baaren
譯者 | 凱隱
編輯 | Jane
出品 | AI科技大本營(ID:rgznai100)
【導讀】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 versionelif not sys.version_info >= (3, 5): # Kindly tell your user (s)he needs to upgrade # because you're using 3.5 features3、使用IPython
IPython 基本上是一個增強的shell,僅僅是為了自動補全功能,IPython也是值得使用的,但其實它還有更多作用,包括內建的Magic命令,這裡列舉了一些:
%cd:改變當前的工作目錄%edit:打開編輯器並在關閉編輯器後執行鍵入的代碼%env:顯示當前的環境變量%pip:install [pkgs] 在不離開交互式shell的情況下安裝功能包%time 和 %timeit:類似於python中的time模塊,可以為代碼運行計時完整的命令列表參見:
https://ipython.readthedocs.io/en/stable/interactive/magics.html
IPython的另一個有用功能是可以使用之前任意一行代碼的輸出,代碼的輸入和輸入實際上都是對象,例如可以通過 Out[3] 來使用第三次運行代碼的輸出對象。
安裝IPython的指令是:
pip3 install ipython4.列表解析式
列表解析式可以用來替換通過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) / 2my_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 sysmylist = range(0, 10000)print(sys.getsizeof(mylist))# 48這是因為range函數返回的是一個類對象,這個類對象表現為一個列表。因此使用range函數比使用實際的包含一萬個數字的列表要更加節省內存。
可以通過上面第四條中提到的列表解析式創建一個同樣大小的實際列表:
import sysmyreallist = [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, birthdatename, birthdate = get_user(4)對於有限數量的返回值,這是可以的。但是任何超過3個值的內容都應該放到一個(data)類中。
7、使用 data 類
從3.7版本開始,python提供了 data 類。與常規類或其他替代方法(如返回多個值或字典)相比,有以下幾個優點:
數據類需要至少一定數量的代碼可以通過 __eq__ 方法來比較不同的data類對象可以 __repr__ 通過很容易地列印一個數據類來進行調試數據類需要類型提示,因此減少了 bug一個data類的例子如下:
from dataclasses import dataclass@dataclassclass Card: rank: str suit: strcard = Card("Q", "hearts")print(card == card)# Trueprint(card.rank)# 'Q'print(card)Card(rank='Q', suit='hearts')詳細教程參見:
https://realpython.com/python-data-classes/
8、就地變量交換
一個簡潔的技巧,可以節省幾行代碼:
a = 1b = 2a, b = b, aprint (a)# 2print (b)# 19、字典合併(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 emojiresult = emoji.emojize('Python is :thumbs_up:')print(result)# 'Python is '# You can also reverse this:result = emoji.demojize('Python is ')print(result)# 'Python is :thumbs_up:'更多複雜的例子以及文檔,參見:
https://pypi.org/project/emoji/
14、列表切片操作
列表切片的基本語法是:
a[start:stop:step]start,stop和step都是可選的(可填可不填),默認值是:
start:0stop:列表的末尾step:1一些例子如下:
# We can easily create a new list from # the first two elements of a list:first_two = [1, 2, 3, 4, 5][0:2]print(first_two)# [1, 2]# And if we use a step value of 2, # we can skip over every second number# like this:steps = [1, 2, 3, 4, 5][0:5:2]print(steps)# [1, 3, 5]# This works on strings too. In Python,# you can treat a string like a list of# letters:mystring = "abcdefdn nimt"[::2]print(mystring)# 'aced it'15、翻轉字符串和列表
可以用切片操作來翻轉列表或字符串,將step設置為負值即可實現:
revstring = "abcdefg"[::-1]print(revstring)# 'gfedcba'revarray = [1, 2, 3, 4, 5][::-1]print(revarray)# [5, 4, 3, 2, 1]16、圖片顯示
可以通過Pillow模塊來顯示圖片,例如顯示Kitty小貓,首先安裝python圖片庫:
pip3 install Pillow然後下載你要顯示的圖片,並重命名。然後可以通過以下命令來顯示圖片:
from PIL import Imageim = Image.open("kittens.jpg")im.showprint(im.format, im.size, im.mode)# JPEG (1920, 1357) RGB或者也可以直接通過IPython來顯示:
Pillow的功能遠不止顯示圖片。它可以對圖片進行分析,調整大小,濾波,增強,變形等等。更多資料詳見文檔:
https://pillow.readthedocs.io/en/stable/。
17、使用map函數
Python的一個內建函數是 map。map的基本語法是:
map(function, something_iterable)傳入的參數是一個函數,和一個需要執行的對象,可以是任何可迭代對象。在下面的例子中使用的是list:
def upper(s): return s.uppermylist = list(map(upper, ['sentence', 'fragment']))print(mylist)# ['SENTENCE', 'FRAGMENT']# Convert a string representation of# a number into a list of ints.list_of_ints = list(map(int, "1234567")))print(list_of_ints)# [1, 2, 3, 4, 5, 6, 7]map是一個代替循環的好方式,可以在你的代碼中嘗試使用map函數。
18、從列表或字符串中獲取唯一元素
通過set函數可以將列表或字符串轉換為集合,集合中的不含重複元素:
mylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]print (set(mylist))# {1, 2, 3, 4, 5, 6}# And since a string can be treated like a # list of letters, you can also get the # unique letters from a string this way:print (set("aaabbbcccdddeeefff"))# {'a', 'b', 'c', 'd', 'e', 'f'}19、找出最常出現的值
查找列表或字符串中最常出現的值:
test = [1, 2, 3, 4, 2, 2, 3, 1, 4, 4, 4]print(max(set(test), key = test.count))# 4你可以嘗試自行理解上述代碼。
好吧,也許你並沒有嘗試。上述代碼的工作原理如下:
max將返回列表中的最大值。key參數接受單個參數函數確定定製排序順序,在本例中,它是test.count,該函數應用於iterable對象中的每個元素。.count是列表的一個內建函數,該函數接收一個參數,並計算該參數的出現次數。因此在本例中,test.count(1)返回2,testcount(4)返回4。set(test)返回test列表中的所有唯一值,因此是{1,2,3,4}。因此在上面的這行語句中我們首先找出了test列表的所有獨特值,即{1,2,3,4}。接著,將.count函數應用於set中的每個值,得到一個數量列表,然後通過max找出數量最大的值。
20、創建進度條
可以自行創建進度條,但也可以通過progress模塊來快速創建:
pip3 install progress然後通過以下代碼來創建進度條:
from progress.bar import Barbar = Bar('Processing', max=20)for i in range(20): # Do some work bar.nextbar.finish效果如下:
21、在交互式shell中使用用 _ 來獲取上一個表達式的運行結果
可以使用下劃線操作符來獲取最後運行的表達式的輸出,在IPython中操作如下:
In [1]: 3 * 3Out[1]: 9In [2]: _ + 3Out[2]: 12這種方法在python shell中也是適用的,IPython還可以通過Out[n]來獲取任意第n個表達式的輸出結果。
22、快速創建web伺服器
您可以快速啟動web伺服器,來提供當前工作目錄的內容:
python3 -m http.server如果您想與同事共享一些內容,或者想測試一個簡單的HTML站點,這是非常有用的。
23、多行字符串
雖然可以使用三重引號在代碼中包含多行字符串,但這並不理想。在三重引號之間的所有內容都變成字符串,包括格式。相比我更喜歡第二種方式,它將多行連接在一起,允許你很好地格式化代碼。惟一的缺點是需要顯式地放入新行:
s1 = """Multi line strings can be put between triple quotes. It's not ideal when formatting your code though"""print (s1)# Multi line strings can be put# between triple quotes. It's not ideal# when formatting your code thoughs2 = ("You can also concatenate multiple\n" +"strings this way, but you'll have to\n""explicitly put in the newlines")print(s2)# You can also concatenate multiple# strings this way, but you'll have to# explicitly put in the newlines24、用於條件賦值的三元運算符
這是另一種使你代碼變得簡潔,同時保持可讀性的方法:
[on_true] if [expression] else [on_false]一個簡單的例子如下:
x = "Success!" if (y == 2) else "Failed!"25、統計元素的出現次數
可以使用Collections依賴包中的Counter方法來獲得一個包含列表中所有惟一元素計數的字典:
from collections import Countermylist = [1, 1, 2, 3, 4, 5, 5, 5, 6, 6]c = Counter(mylist)print(c)# Counter({1: 2, 2: 1, 3: 1, 4: 1, 5: 3, 6: 2})# And it works on strings too:print(Counter("aaaaabbbbbccccc"))# Counter({'a': 5, 'b': 5, 'c': 5})26、比較運算符的連接
可以在python中連結比較運算符,從而使代碼更簡潔,可讀性更強:
x = 10# Instead of:if x > 5 and x < 15:print("Yes")# yes# You can also write:if 5 < x < 15:print("Yes")# Yes27、加入色彩
通過 Colorama 依賴包,可以在終端中添加更多色彩:
from colorama import Fore, Back, Styleprint(Fore.RED + 'some red text')print(Back.GREEN + 'and with a green background')print(Style.DIM + 'and in dim text')print(Style.RESET_ALL)print('back to normal now')關於Colorama依賴包的更多信息,參見:
https://pypi.org/project/colorama/
28、日期處理
python-dateutil模塊為標準的datetime模塊提供了強大的擴展。首先安裝該模塊:
pip3 install python-dateutil 你可以用這個庫做很多很酷的事情。我講把我認為特別有用的一個功能作為示例:日誌文件中日期的模糊解析等。如下:
from dateutil.parser import parselogline = 'INFO 2020-01-01T00:00:01 Happy new year, human.'timestamp = parse(log_line, fuzzy=True)print(timestamp)# 2020-01-01 00:00:01隻要記住,如果datatime不具備某個功能,那datautil一定有該功能,datautil是datatime功能的延續。
29、整除
在Python 2中,除法運算符(/)默認為整數除法,除非其中一個操作數是浮點數。如下:
# Python 25 / 2 = 25 / 2.0 = 2.5在python3中,除法運算符/默認為浮點除法,//運算符變成了整數除法。所以有:
Python 35 / 2 = 2.55 // 2 = 2對於這種變化背後的完整動機,可以閱讀PEP-0238:
https://www.python.org/dev/peps/pep-0238/
30、通過chardet檢測字符集合
可以使用chardet模塊來檢測文件中的字符集合。這在分析大量隨機文本時非常有用。安裝chardet模塊:
pip install chardet現在你有了一個額外的命令行工具chardetect,它可以這樣使用:
chardetect somefile.txtsomefile.txt: ascii with confidence 1.0你也可以通過編程的方式來使用這個依賴包,詳見技術文檔:
https://chardet.readthedocs.io/en/latest/usage.html
以上就是30個python的技巧,希望這些技巧能幫助你在新的一年裡有個不錯的開始。
所有CSDN 用戶都可參與投票活動
加入福利群,每周還有精選學習資料、技術圖書等福利發送
點擊投票頁面「講師頭像」,60+公開課免費學習