Python 三十個實踐、建議和技巧

【導讀】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 👍'

# You can also reverse this:
result = emoji.demojize('Python is 👍')
print(result)
# 'Python is :thumbs_up:'

14、列表切片操作
列表切片的基本語法是:

a[start:stop:step]

start,stop和step都是可選的(可填可不填),默認值是:

  • start:0

  • stop:列表的末尾

  • 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 Image

im = Image.open("kittens.jpg")
im.show()
print(im.format, im.size, im.mode)
# JPEG (1920, 1357) RGB

 

 

或者也可以直接通過IPython來顯示:

Pillow的功能遠不止顯示圖片。它可以對圖片進行分析,調整大小,濾波,增強,變形等等。

17、使用map()函數
Python的一個內建函數是 map()。map()的基本語法是:

map(function, something_iterable)

傳入的參數是一個函數,和一個需要執行的對象,可以是任何可迭代對象。在下面的例子中使用的是list:

def upper(s):
    return s.upper()

mylist = 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 Bar

bar = Bar('Processing', max=20)
for i in range(20):
    # Do some work
    bar.next()
bar.finish()

效果如下:

 

21、在交互式shell中使用用 _ 來獲取上一個表達式的運行結果可以使用下劃線操作符來獲取最後運行的表達式的輸出,在IPython中操作如下:

In [1]: 3 * 3
Out[1]: 9
In [2]: _ + 3
Out[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 though
s2 = ("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 newlines

24、用於條件賦值的三元運算符這是另一種使你代碼變得簡潔,同時保持可讀性的方法:

[on_true] if [expression] else [on_false]

一個簡單的例子如下:

x = "Success!" if (y == 2) else "Failed!"

25、統計元素的出現次數
可以使用Collections依賴包中的Counter方法來獲得一個包含列表中所有惟一元素計數的字典:

from collections import Counter

mylist = [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")
# Yes

27、加入色彩

 

通過 Colorama 依賴包,可以在終端中添加更多色彩:

from colorama import Fore, Back, Style
print(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')

28、日期處理
python-dateutil模塊爲標準的datetime模塊提供了強大的擴展。首先安裝該模塊:

pip3 install python-dateutil 

你可以用這個庫做很多很酷的事情。我講把我認爲特別有用的一個功能作爲示例:日誌文件中日期的模糊解析等。如下:

from dateutil.parser import parse
logline = '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功能的延續。

很多小夥伴在學習Python的過程中往往因爲沒有資料或者沒人指導從而導致自己不想學下去了,因此我特意準備了大量的PDF書籍、視頻教程,都免費送大家!都在這個羣了827513319 不管你是零基礎還是有基礎都可以獲取到自己相對應的學習禮包!包括Python軟件工具和2019最新入門到實戰教程!

29、整除
在Python 2中,除法運算符(/)默認爲整數除法,除非其中一個操作數是浮點數。如下:

# Python 2
5 / 2 = 2
5 / 2.0 = 2.5

在python3中,除法運算符/默認爲浮點除法,//運算符變成了整數除法。所以有:

Python 3
5 / 2 = 2.5
5 // 2 = 2

30、通過chardet檢測字符集合
可以使用chardet模塊來檢測文件中的字符集合。這在分析大量隨機文本時非常有用。安裝chardet模塊:

pip install chardet

現在你有了一個額外的命令行工具chardetect,它可以這樣使用:

chardetect somefile.txt
somefile.txt: ascii with confidence 1.0

你也可以通過編程的方式來使用這個依賴包,以上就是30個python的技巧,希望這些技巧能幫助你在新的一年裏有個不錯的開始。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章