Python 代碼就該是這種味道

每種語言都有自己的味道,而我最喜歡 Python 家的酿联。代碼如詩终息,你可以順著人類的思維去寫代碼,既然選擇了 Python 大法柳譬,就應(yīng)該像 Pythonista 那樣思考,寫出 Pythonic 的代碼续镇,這篇文章介紹的都是很簡單很基本的技巧美澳,但也正是這些基礎(chǔ)的用法使得 Python 變得與眾不同。

Life is short, you need 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))
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末寇钉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子扫倡,更是在濱河造成了極大的恐慌,老刑警劉巖疚鲤,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件缘挑,死亡現(xiàn)場離奇詭異,居然都是意外死亡诲宇,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蹬挺,熙熙樓的掌柜王于貴愁眉苦臉地迎上來它掂,“玉大人,你說我怎么就攤上這事虐秋。” “怎么了客给?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵靶剑,是天一觀的道長蜻拨。 經(jīng)常有香客問我桩引,道長,這世上最難降的妖魔是什么血崭? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任厘灼,我火速辦了婚禮,結(jié)果婚禮上舰讹,老公的妹妹穿的比我還像新娘闪朱。我一直安慰自己,他們只是感情好监透,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布胀蛮。 她就那樣靜靜地躺著,像睡著了一般粪狼。 火紅的嫁衣襯著肌膚如雪任岸。 梳的紋絲不亂的頭發(fā)上享潜,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天嗅蔬,我揣著相機(jī)與錄音,去河邊找鬼艺蝴。 笑死,一個胖子當(dāng)著我的面吹牛猜敢,可吹牛的內(nèi)容都是我干的盒延。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼胯盯,長吁一口氣:“原來是場噩夢啊……” “哼畦贸!你這毒婦竟也來了楞捂?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤胶坠,失蹤者是張志新(化名)和其女友劉穎繁堡,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體椭蹄,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳矩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了割以。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡猜极,死狀恐怖消玄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情莱找,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布辞色,位于F島的核電站浮定,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏桦卒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一建蹄、第九天 我趴在偏房一處隱蔽的房頂上張望裕偿。 院中可真熱鬧,春花似錦劲腿、人聲如沸鸟妙。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽房午。三九已至个从,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間嫌松,已是汗流浹背奕污。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留贾陷,地道東北人嘱根。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像该抒,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子冈爹,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

推薦閱讀更多精彩內(nèi)容