作者 | Avi_Chawla
譯者 | 王德朕
編程(不僅Python,也包括其它編程語言)最好的一點(diǎn)是,有多種方法來實(shí)現(xiàn)同一解決方案。
使用不同的方法來達(dá)到相同的結(jié)果(圖像由作者繪制)
由于下述原因,有些方法會(huì)比其他方法更好:
- 消耗更少的內(nèi)存
- 運(yùn)行效率
- 較少的代碼
- 更容易理解
- 邏輯簡單
在這篇文章中,我將向你介紹20種場景,這些場景都會(huì)讓開發(fā)者不知不覺的陷入臃腫,丑陋,復(fù)雜的Python編碼陷阱中,從而限制發(fā)揮Python的潛力。
除此之外,我還會(huì)針對(duì)每個(gè)錯(cuò)誤提供一個(gè)替代方案進(jìn)行解決。
開始吧!
1 多次使用打印語句
新手寫法
如果你想打印多個(gè)變量,簡單的方式是為每個(gè)變量都使用 print 語句。
優(yōu)雅的寫法
根據(jù)經(jīng)驗(yàn),使用多個(gè) print 語句通常是編程人員(特別是新手)在 Python 中編碼時(shí)最常犯的錯(cuò)誤,因?yàn)樗麄儾恢朗褂?print 語句,可以在一行代碼中打印多個(gè)變量,代碼如下:
上述 sep 參數(shù)用于指定 print 語句輸出各個(gè)變量值(a,b,c)之間的分隔符。
注意:end 參數(shù)用于設(shè)置 print 語句輸出內(nèi)容的結(jié)尾字符。
上述代碼中,參數(shù) end=”\n---\n” 用于當(dāng)輸出一行后,輸出 ---,然后在輸出新一行字符。
?
2 使用FOR 循環(huán)打印相同的變量
新手寫法
如題所示,你的目標(biāo)是多次打印相同的變量,所以你會(huì)創(chuàng)建一個(gè) FOR 循環(huán)并迭代預(yù)期打印次數(shù),對(duì)嗎?我的意思是,這有什么問題嗎?
優(yōu)雅的寫法
雖然編寫一個(gè)FOR循環(huán)沒有壞處,并且一切正常,但是沒有必要編寫一個(gè) FOR 循環(huán)來多次打印同一變量。
3 創(chuàng)建獨(dú)立變量來跟蹤循環(huán)中的索引
新手的寫法
方法1:
為實(shí)現(xiàn)這一目標(biāo),一般需要定義一個(gè)新變量(idx)跟蹤索引值,并在迭代時(shí)對(duì)它遞增,代碼如下:
方法2:
如果不使用上述方法,人們還會(huì)創(chuàng)建一個(gè) range 迭代器來跟蹤索引,代碼如下:
優(yōu)雅的寫法
感謝設(shè)計(jì)了 enumerate() 函數(shù)的開發(fā)人員,使用這種方法可以按照下述方式跟蹤索引(idx)和值(i)。
4 使用FOR循環(huán)將列表轉(zhuǎn)換為字符串
字符串的列表(圖像由作者繪制)
新手寫法
如下所示,使用 FOR 循環(huán)每次收集一個(gè)元素
優(yōu)雅的寫法
將列表轉(zhuǎn)換為字符串的優(yōu)雅方法是使用 join() 方法,如下所示:
上述代碼不僅可以避免編寫一些不必要的長代碼,而且與 FOR 循環(huán)方法一樣直觀。
5 使用 FOR 循環(huán)從列表中刪除重復(fù)項(xiàng)
新手寫法
從列表中刪除重復(fù)項(xiàng)(圖像由作者繪制)
再次使用 FOR 循環(huán),通過迭代列表并在新列表中存儲(chǔ)唯一的元素來實(shí)現(xiàn)。
優(yōu)雅的寫法
只需要一行 Python 代碼就可以從列表中刪除重復(fù)內(nèi)容,如下所示:
上面的代碼返回一個(gè)集合,你可以將其轉(zhuǎn)換為列表:
6 使用 FOR 循環(huán)在列表中檢索元素
新手寫法
如果你想知道某個(gè)元素是否存在于列表(或集合)中,并返回一個(gè)布爾值(如果存在則為 True,否則為 False),新手實(shí)現(xiàn)如下所示:
代碼有點(diǎn)多,是吧?
優(yōu)雅的寫法
通過關(guān)鍵字in 可以使用一行代碼實(shí)現(xiàn)。
7 使用一個(gè)迭代變量在兩個(gè)相同大小的迭代對(duì)象上進(jìn)行迭代
新手寫法
該形式與第3-4節(jié)中所做相同,也就是為索引定義一個(gè)特定變量,這種實(shí)現(xiàn)比較簡單,如下所示:
優(yōu)雅的寫法
有經(jīng)驗(yàn)的方法是使用 zip() 函數(shù),該函數(shù)可以在兩個(gè)可迭代對(duì)象將對(duì)應(yīng)位置的值進(jìn)行匹配。
8 使用 FOR 循環(huán)反轉(zhuǎn)列表
逆向列表(圖像由作者繪制)
新手寫法
正如前文所示,我們可以在列表上進(jìn)行反向迭代并將元素附加到新列表中,代碼如下:
優(yōu)雅的寫法
如果你了解 Python 中的切片,那優(yōu)秀的解決方案只需要一行代碼。
不需要 FOR 循環(huán)!
9 使用 FOR 循環(huán)檢查回文結(jié)構(gòu)
新手寫法
在擴(kuò)展了上述情況(#9--反轉(zhuǎn)列表)的思路之后,我們可以檢查回文列表結(jié)構(gòu)。
優(yōu)雅的寫法
正如前文討論的那樣,有經(jīng)驗(yàn)的方式是使用切片,并將結(jié)果與原列表進(jìn)行比較。
10 使用 FOR 循環(huán)計(jì)算迭代對(duì)象中元素的出現(xiàn)次數(shù)
新手寫法
查找元素頻率的簡單方法是使用 FOR 循環(huán)在列表迭代,然后統(tǒng)計(jì)元素出現(xiàn)的次數(shù)。
優(yōu)雅的寫法
在這種情況下,避免編寫 FOR 循環(huán)的有經(jīng)驗(yàn)寫法是使用 count() 方法。
也可以對(duì)字符串變量使用 count() 方法。
11 使用 FOR 循環(huán)獲取字符串的子串
新手寫法
本次目標(biāo)是從 start_index 位置開始,返回一個(gè)長度為 n_chars 的字符串子串。
新手解決這個(gè)問題的方法是使用 FOR 循環(huán),如下所示:
優(yōu)雅的寫法
使用切片,可以避免 FOR 循環(huán)。
12 定義長整數(shù)常量
假設(shè)你想聲明一個(gè)值為1021的整數(shù)變量。
新手寫法
理想情況下,人們會(huì)連續(xù)寫0,并在打字時(shí)進(jìn)行計(jì)數(shù),但如果有人想引用這個(gè)代碼,他們數(shù)0難道不會(huì)很麻煩嗎?
優(yōu)雅的寫法
為了提高可讀性,可以用 _(下劃線)分隔一組0,如下所示:
但這仍然是一個(gè)麻煩,為什么數(shù) 0?
如果數(shù)字可以表示為 a^b 形式,那應(yīng)該使用 pow() 方法。
用IF變換字符串大小寫
給定一個(gè)字符串,目標(biāo)使大寫字母變成小寫,反之亦然。
新手寫法
簡單的方法是檢查每個(gè)元素的大小寫,然后對(duì)每個(gè)字符都進(jìn)行轉(zhuǎn)換。
輸出沒有問題,但為什么要這么做?
優(yōu)雅的寫法
使用 swapcase ()方法。
14 獲取兩個(gè)集合的并集
合并兩個(gè)集合(圖像由作者繪制)
新手寫法
遍歷這兩個(gè)集合,將元素添加到一個(gè)新的集合中。
代碼太多了,不是嗎?讓我們把它精簡到一行。
優(yōu)雅的寫法
Python中的集合為兩個(gè)集合的合并提供了一個(gè)union() 方法。
更重要的是,你可以將其擴(kuò)展到任意數(shù)量的輸入集合。
這很酷吧?想象一下,要合并4個(gè)集合,需要編寫多少個(gè) FOR 循環(huán)?
15 獲取兩個(gè)集合的交集
新手寫法
與上面討論的合并情況類似,我們可以尋找兩個(gè)集合之間的共同元素,如下所示:
優(yōu)雅的寫法
你可以使用 intersection() 方法實(shí)現(xiàn)同樣的功能:
16 在 IF 語句中寫多個(gè)條件
為了詳細(xì)說明這一點(diǎn),假設(shè)你想實(shí)現(xiàn)如下邏輯。
函數(shù)將輸入映射到輸出(圖像由作者繪制)
新手寫法
可以使用多個(gè) OR 分隔條件實(shí)現(xiàn)上述邏輯。
優(yōu)雅的寫法
避免使用多個(gè)條件語句的方法是使用關(guān)鍵字 in,代碼如下:
17 更改列表中所有元素的數(shù)據(jù)類型
給定一個(gè)表示整數(shù)的字符串列表,目標(biāo)修改數(shù)據(jù)類型將其轉(zhuǎn)換為整數(shù)列表。
新手寫法
使用 FOR 循環(huán)和類型強(qiáng)制轉(zhuǎn)換對(duì)單個(gè)元素進(jìn)行變更。
優(yōu)雅的寫法
聰明的做法是使用 map() 函數(shù),如下所示:
map() 函數(shù)接收的第一個(gè)參數(shù)是 function(int),第二個(gè)參數(shù)是可迭代對(duì)象(input_list)。
18 交換變量
給定兩個(gè)變量,目標(biāo)是對(duì)變量值進(jìn)行交換。
新手寫法
大多數(shù)C/C++程序員在這里采取的方法是定義一個(gè)新的變量(temp),他們通常也會(huì)在Python中擴(kuò)展這個(gè)方法。
優(yōu)雅的寫法
幸運(yùn)的是,Python 允許在一個(gè)語句中進(jìn)行多次賦值,從而避免了對(duì)臨時(shí)變量的需求。
19 使用嵌套循環(huán)生成兩個(gè)列表的所有組合
給定兩個(gè)列表(a的長度為n,b 的長度為 m),生成 (n*m)個(gè)組合。
新手寫法
編寫兩個(gè)嵌套的FOR循環(huán),并將所有組合追加到列表中。
優(yōu)雅的寫法
優(yōu)雅的寫法是使用 itertools 庫中的 product()方法,如下所示:
20 結(jié)論
在這篇文章中,我展示了20種不同場景,我相信大多數(shù)Python程序員都經(jīng)歷過這些情況,而且可能也采取了錯(cuò)誤的編碼解決方案,如果你注意到,在大多數(shù)情況下,優(yōu)雅的寫法主要側(cè)重于避免使用 FOR 循環(huán)進(jìn)行編碼。
作為這篇文章的重點(diǎn),你應(yīng)該永遠(yuǎn)記住,在大多數(shù)情況下,你想出的第一個(gè)解決方案并不是最優(yōu)方案,因此,使用谷歌搜索總是有幫助的,這也是為什么不完美主義的思維方式,對(duì)一名講究的程序員非常重要的原因(不僅是Python,其它語言也一樣)。
原文鏈接:
譯者簡介
王德朕,51CTO社區(qū)編輯,10年互聯(lián)網(wǎng)產(chǎn)研經(jīng)驗(yàn),6年IT教培行業(yè)經(jīng)驗(yàn)。