幾個小技巧,讓你的Python程式碼更加Pythonic

2022-01-13 16:00:16

 剛開始學習Python的時候,我們就瞭解了python的編碼風格要求,通過python終端方式輸入 import this 可以看到它的具體描述。

 

這就是著名的「python之禪」,簡言之,就是要寫符合pythonic的程式碼,簡潔、優雅、可讀性強。

下面選取了一些常見的Python規範和程式碼風格,大家可以進行參考和學習。

命名

首先看一下變數的命名規範(pep8)規範:

資料夾 :包名,建議僅使用小寫字母命名,不建議使用下劃線。

模組: 小寫或者小寫加下劃線連線,比如 module.pydb_convert.py 等。

類: 駝峰式,首字母大寫,單詞直接連線。

class ThisIsAClass(object):
    pass

函數 :小寫,用下劃線隔開

def this_is_a_func():
    pass

變數: 小寫,用下劃線隔開

this_is_a_variable = 1

**常數:**常數名所有字母大寫,由下劃線連線各個單詞,如THIS_IS_A_CONSTANT = 1

語法風格

1.交換a 和 b的數值

其他語言的方法:

a = 5
b = 6
temp = a
a = b
b = temp

python中,更加簡潔的方法:

a = 5
b = 6
a, b = b, a
print(a, b)
輸出:6 5

2.多個變數賦值

python中可以一行程式碼,同時給多個變數賦值

a,b,c = 2,5,12

3.合併字串

傳統的字串合併方法,由於字串物件不可改變,每次修改會產生一個新的物件,這種方法會消耗很多記憶體。

list_str = ["hello ", "python", "!"]
result = ""
for i in list_str:
    result+=i
print(result)

python中,使用join()方法更加高效,注意join()方法只適用於元素是字串的列表、元組、集合等型別。

list_str = ["hello ", "python", "!"]
result = "".join(list_str)
print(result)

輸出:hello python!

4.列表去重

使用集合的唯一性,對列表進行去重

a = [1, 2, 3, 1, 2,3 , 1, 3, 2, 4, 1, 3, 4, 5, 6, 5, 4, 4, 3, 6]
lst = list(set(a))
print(lst)
輸出:

5.if/else 三目運算

python支援的三目運算格式:

為真時的結果 if 判斷條件 else 為假時的結果(注意,沒有冒號)
a=4
st = "a大於4" if a>4 else "a小於等於4"
print(st)
輸出:a小於等於4

6.enumerate

enumerate()是 Python 的內建函數。可以將一個可迭代的(Iterable)物件(列表、字串等)組成一個索引序列,可以同時獲得索引和值。

獲取列表元素及索引

# 一般寫法
names = ['Bob', 'Alice', 'Guido']
n = len(names)
for i in range(n):
    print(f'{i} {names[i]}')

# 使用enumerate()函數
names = ['Bob', 'Alice', 'Guido']
for index, value in enumerate(names):
    print(f'{index}: {value}')
輸出:
0: Bob
1: Alice
2: Guido

7.解包

解包在英文裡叫做 Unpacking,就是將容器裡面的元素逐個取出來。

解壓列表/元組的元素,賦值給不同的變數

a, b, c = [1,2,3]
print(a, b, c)
輸出:1 2 3

函數中的解包操作

在函數呼叫中,* 能夠將元組或列表解包成不同的引數。

def func(a, b, c, d):
    print(a, b, c, d)

args = [1, 2, 3, 4]
func(*args)
輸出:1 2 3 4

在函數呼叫中,** 會以鍵/值的形式解包一個字典,使其成為一個獨立的關鍵字引數。

def func(a, b, c, d):
    print(a, b, c, d)

kwargs = {"a": 1, "b": 2, "c": 3, "d": 4}
func(**kwargs)
輸出:1 2 3 4

8.列表推導式

列表推導式可以利用 range 區間、元組、列表、字典和集合等資料型別,快速生成一個滿足指定需求的列表。

[表示式 for 迭代變數 in 可迭代物件 [if 條件表示式] ]

[if 條件表示式] 可以省略。

生成一個列表,列表元素分別為 [1x1,2x2,3x3……nxn],假設n = 10

# 一般方法
lst = []
for i in range(1, 11):
    lst.append(i*i)
print(lst)
輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
# 列表推導式
lst = [i*i for i in range(1,11)]
print(lst)
輸出:[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]

要求返回的序列中不存在偶數項

lst = [i*i for i in range(1, 11) if i % 2 != 0]
print(lst)
輸出:[1, 9, 25, 49, 81]

9.使用關鍵字in

  • in:如果在指定的序列中找到值返回 True,否則返回 False。

  • not in:如果在指定的序列中沒有找到值返回 True,否則返回 False。

判斷元素是否在列表中

number=[1,2,3,4,5]
if 1 in number:
    print("1 in number")
if 0 not in number:
    print("0 not in number")

在 for 迴圈中,獲取列表、元組、字典的每一項:

list = [2, 3, 4]
for num in list:
    print (num)
    
dic = {"name": "xiaoming", "age": 18}
for k, v in dic.items():
    print(k, v)

10.使用zip同步處理多個列表

zip() 函數是 Python 內建函數,它可以將多個序列(列表、元組、字典、集合、字串等)中對應位置的元素重新組合,生成一個個新的元組。

z = zip([1,2,3],[3,4,5])
print(list(z))
輸出:[(1, 3), (2, 4), (3, 5)]

11.真值判斷

當判斷一個變數是否為 True 的時候,Python 具有自身獨特的方式,不需要寫出判斷條件,只需要在 if 或 while 關鍵字後面直接寫上該物件即可。

常見的真值為False的情況:

  • 常數:None and False.

  • 數值0值: 0, 0.0, 0j

  • 序列或者集合為空:'', (), [], {}, set(), range(0)

    # 對於布林物件,建議這樣寫
    x = True
    if x:
        pass
    # 不建議這樣寫
    if x == True:
        pass
    
    lst = []
    # 對於列表物件,建議這樣寫
    if lst:
        pass
    # 不建議這樣寫
    if len(lst) != 0:
        pass

    更多關於pythonic的寫法,可以參考《effctive python》這本書,還有Python官網的程式碼規範要求