每種語言都有自己的味道,而我最喜歡
Python
家的酿联。代碼如詩终息,你可以順著人類的思維去寫代碼,既然選擇了Python
大法柳譬,就應(yīng)該像Pythonista
那樣思考,寫出Pythonic
的代碼续镇,這篇文章介紹的都是很簡單很基本的技巧美澳,但也正是這些基礎(chǔ)的用法使得Python
變得與眾不同。
行內(nèi)判斷
求絕對值
Non-pythonic version
# Non-pythonic, ugly
if x < 0:
y = -x
else:
y = x
Pythonic version
#Pythonic, elegant
y = -x if x < 0 else x
快速交換
交換兩個變量的值
Non-pythonic version
# Non-pythonic, ugly
temp = x
x = y
y = temp
Pythonic version
#Pythonic, elegant
x, y = y, x
快速生成數(shù)組
找出數(shù)組中所有大于零的數(shù)摸航?
Non-pythonic version
# Non-pythonic, ugly
x_list = [1, -1, 2, 3, -4]
y_list = []
for x in x_list:
if x > 0:
y_list.append(x)
Pythonic version
#Pythonic, elegant
x_list = [1, -1, 2, 3, -4]
y_list = [x for x in x_list if x > 0]
不只是數(shù)組酱虎,字典也可以快速生成:
#Pythonic, elegant
x_list = [1, -1, 2, 3, -4]
x_dict = {str(x): x for x in x_list}
列表切片
想要獲取列表中第 3-5 個元素?
Non-pythonic version
# Non-pythonic, ugly
alist = [1, 2, 3, 4, 5, 6, 7]
blist = []
index = 0
for x in alist:
if 2 < index < 6:
blist.append(x)
index += 1
Pythonic version
#Pythonic, elegant
alist = [1, 2, 3, 4, 5, 6, 7]
blist = alist[3:6]
切片還有很多其他用法读串,可以戳這里了解更多。
簡化判斷
Non-pythonic version
# Non-pythonic, ugly
if x == 1 or x == 2 or x ==3 or x == 4:
print(x)
Pythonic version
#Pythonic, elegant
if x in [1, 2, 3, 4]:
print(x)
獲取序號
Non-pythonic version
# Non-pythonic, ugly
i = 0
for x in x_list:
print(i, x)
i += 1
Pythonic version
#Pythonic, elegant
for index, x in enumerate(x_list):
print(index, x)
只要 x_list
是可以迭代的對象就行排监,enumerate()
還可以接受一個參數(shù)來指定序號的初始值:
for index, x in enumerate(x_list, 1)
指定起始序號為1杰捂。
用Counter
來計數(shù)
還在手動計數(shù)?
# Non-pythonic, ugly
x_list = ['Ozil', 'Ramsey', 'Ozil', 'Ramsey', 'Giroud']
x_dict = {}
for x in x_list:
if x in x_dict.keys():
x_dict[x] += 1
else:
x_dict[x] = 1
print(x_dict)
試試Counter
吧
#Pythonic, elegant
from collections import Counter
x_list = ['Ozil', 'Ramsey', 'Ozil', 'Ramsey', 'Giroud']
x_dict = Counter(x_list)
print(x_dict)
巧用函數(shù)工具
這里介紹兩個常用的 Python 函數(shù)工具峭弟,map
,reduce
, 體會函數(shù)式編程的快感脱拼。
比如我有一大堆英文名,書寫不規(guī)范熄浓,要求你整理成規(guī)范的形式(首字母大寫,其余小寫)俯在,這個例子來源于廖老師的Python教程中的習(xí)題
Non-pythonic version
# Non-pythonic, ugly
name_list = ['luccy', 'BaTT', 'bOunD']
for name in name_list:
name = name[0].upper()+ name[1:].lower()
print(name)
覺得上面的代碼還行娃惯,不算丑陋?讓我們換個思路愕提,用 map
馒稍,map()
函數(shù)接收兩個參數(shù)浅侨,一個是函數(shù),一個是Iterable
(可迭代對象)鼓黔,map
將傳入的函數(shù)依次作用到序列的每個元素不见,并把結(jié)果作為新的Iterator
返回。
Pythonic version
謝謝 @想成為會寫代碼的biologi 提醒 Python 有現(xiàn)成的 string.capitalize()
函數(shù):
#Pythonic, elegant
def normalize(name):
return name.capitalize()
name_list = ['luccy', 'BaTT', 'bOunD']
print(list(map(normalize, name_list)))
再來思考這個問題稳吮,給你一個列表,求出列表中所有元素的積(還是來自于廖老師的博客)
Non-pythonic version
# Non-pythonic, ugly
alist = [1, 3, 6, 10]
product = 1
for x in alist:
sum *= x
對于這種問題,其實(shí)我們完全可以用reduce
來解決眼虱,reduce
把一個函數(shù)作用在一個序列[x1, x2, x3, ...]上捏悬,這個函數(shù)必須接收兩個參數(shù)撞蚕,reduce
把結(jié)果繼續(xù)和序列的下一個元素做累積計算过牙,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
就讓我們把這個求積的過程用reduce()
來解決吧:
Pythonic version
#Pythonic, elegant
def prod(alist):
return reduce(multi, alist)
def multi(x, y):
return x * y
alist = [1, 3, 6, 10]
print(prod(alist))