Python中通常不應(yīng)該犯的7個(gè)錯(cuò)誤
介紹
Python是一門相對(duì)容易掌握的語(yǔ)言,但是由于假設(shè)了很多事情,因此犯錯(cuò)誤非常容易。 此外,這些錯(cuò)誤可能會(huì)在很長(zhǎng)一段時(shí)間內(nèi)被忽略。 在我其他前四個(gè)菜鳥Python錯(cuò)誤之前。
避免這些新手Python錯(cuò)誤
他們可能會(huì)工作,但可能會(huì)更好。
今天,我將分享更多在Python 3.8中容易犯的錯(cuò)誤。
№1:+ =
在許多情況下,我當(dāng)然會(huì)犯的一個(gè)錯(cuò)誤是獲取+ =操作數(shù)。 假設(shè)必須用兩個(gè)獨(dú)立的操作數(shù)來(lái)完成加法似乎太容易了,一個(gè)用于加法,另一個(gè)用于斷言。 幸運(yùn)的是,Python(以及許多其他編程語(yǔ)言)支持可以同時(shí)執(zhí)行數(shù)學(xué)運(yùn)算和斷言運(yùn)算的操作數(shù)。
代替:
x = x + 5
做:
x += 5
№2:位置自變量符號(hào)
在大多數(shù)現(xiàn)代腳本語(yǔ)言中,可以將兩種主要類型的參數(shù)用作函數(shù)的參數(shù):
位置和關(guān)鍵詞。
在python 3.8發(fā)行之前,還沒(méi)有辦法表示位置參數(shù),這使得位置參數(shù)默認(rèn)值基本上是不可能的。 但是,由于更改是在Python 3.8中對(duì)此進(jìn)行了更新,因此我們可以使用。 您應(yīng)該使用它們,因?yàn)槲恢脜?shù)是具有出色性能的優(yōu)質(zhì)Python代碼的基礎(chǔ)。 如果您的代碼需要用Python補(bǔ)償?shù)囊患?,尤其是在機(jī)器學(xué)習(xí)時(shí),那可能就是性能。
關(guān)鍵字參數(shù)在函數(shù)定義時(shí)評(píng)估一次。 這可能特別不利于遞歸算法的性能。 而且,如果您要編寫成本函數(shù),則絕對(duì)必須使用位置參數(shù)。 這并不是說(shuō)根本不應(yīng)該使用它們,但是,只要有可能,最好使用位置參數(shù)。
代替:
- def numbers(custom, five=5,ten=10,fifteen=15):
- total = five + ten + fifteen + custom
- return(total)
做:
- def numbers(custom,\,five=5,ten=10,fifteen=15):
- total = five + ten + fifteen + custom
- return(total)
同樣重要的是要記住,此功能是相當(dāng)新的,因此僅使用位置參數(shù)以提高性能的概念將僅限于Python 3.8+
№3:初始化返回
盡管這當(dāng)然并不常見(jiàn),并且可能是一個(gè)相當(dāng)大的菜鳥動(dòng)作,但我已經(jīng)看到人們嘗試在其初始化函數(shù)中執(zhí)行返回。 在Python的面向?qū)ο蟮氖澜缰校看螌?shí)例化類時(shí)都會(huì)調(diào)用__init__函數(shù)。 初始化函數(shù)對(duì)于設(shè)置變量,移動(dòng)數(shù)據(jù)和構(gòu)造類型而言非常有用。 功能強(qiáng)大,責(zé)任重大,Python的__init__函數(shù)應(yīng)用于類初始化,而不是監(jiān)視,不循環(huán),不直接執(zhí)行,僅用于類初始化。 并請(qǐng)(我有經(jīng)驗(yàn)的人正在這樣做!)
不要返回init!
(這沒(méi)有任何意義!)

№4:循環(huán)依賴
當(dāng)編寫一個(gè)大型Python程序包時(shí),每個(gè)程序段都可以實(shí)現(xiàn)相似的目標(biāo),通常,您的程序包將彼此依賴。 這可能會(huì)帶來(lái)很大的問(wèn)題,并可能導(dǎo)致一些被稱為"循環(huán)依賴項(xiàng)"的事情。 發(fā)生這種情況時(shí),當(dāng)模塊周圍的不同位置嘗試相互訪問(wèn)時(shí),您可能會(huì)遇到問(wèn)題。
№5:空格還是縮進(jìn)?
如您所知,Python使用縮進(jìn)而不是定界符將代碼包含在其他代碼中。 對(duì)于許多人來(lái)說(shuō),這使代碼更易于閱讀和編寫,盡管主觀上我個(gè)人鄙視它。 但是,在其他語(yǔ)言中,我通常傾向于使用縮進(jìn)(Tab鍵)來(lái)縮進(jìn)代碼。但是,根據(jù)PEP8,應(yīng)該為縮進(jìn)使用四個(gè)空格。 老實(shí)說(shuō),這是我只有在與很多人一起進(jìn)行項(xiàng)目時(shí)才遵循的原則。 對(duì)我而言,只要保持一致,我就不會(huì)將空格或縮進(jìn)視為重要的事情,但從正式意義上講,您應(yīng)該使用空格。 話雖如此,在編寫用于某項(xiàng)工作的實(shí)際代碼或需要許多其他用戶遵守的大型項(xiàng)目時(shí),遵循PEP8的標(biāo)準(zhǔn)可能是一個(gè)好主意。
№6:塊迭代
當(dāng)執(zhí)行迭代的for循環(huán)時(shí),編寫全長(zhǎng)的for循環(huán)可以很容易地在代碼中表達(dá)您的想法。 但是,通常,如果您需要執(zhí)行的操作僅占用一行,則最好循環(huán)一行。 這不僅會(huì)使您的代碼更漂亮,更簡(jiǎn)潔,而且還可以提高性能。
代替:
- for i in x:
- i += 5
做:
- [i + 5 for i in x]
№7:實(shí)習(xí)弦
對(duì)于最后一個(gè)要考慮的錯(cuò)誤,我想談?wù)剬?shí)習(xí)琴弦。 在某些情況下,Python會(huì)嘗試重用不可變的對(duì)象,而字符串實(shí)習(xí)就是這種實(shí)際作用的一種情況。 所有長(zhǎng)度為1的字符串都被屏蔽。 字符串中除ASCII字符,數(shù)字和下劃線外沒(méi)有其他任何內(nèi)容。

在這里,我嘗試創(chuàng)建兩個(gè)不同的對(duì)象a和b,但這不是Python所做的。 Python實(shí)際上是b指向a的指針,而不是產(chǎn)生新的字符串。 但是,如果我們添加ASCII字符:

因此,在使用不可變字符串時(shí)請(qǐng)牢記這一點(diǎn),因?yàn)樗鼰o(wú)疑給我?guī)?lái)了很多麻煩。