成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

改善Python程序的建議

Clect / 3117人閱讀

摘要:斷言是用來(lái)捕獲用戶定義的約束的,不是用來(lái)捕獲程序本身的錯(cuò)誤的。使用自動(dòng)關(guān)閉資源語(yǔ)句可以在代碼塊執(zhí)行完畢后還原進(jìn)入該代碼塊時(shí)的現(xiàn)場(chǎng)。在文件管理時(shí)使用總能保證文件被正常關(guān)閉。則是將指向?qū)ο蟆⒖假Y料編寫(xiě)高質(zhì)量代碼改善程序的個(gè)建議

三元操作符:
我們都知道在C語(yǔ)言中,三元操作符為C ? X : Y,在人們的強(qiáng)烈要求下,python2.5之后三元操作符等價(jià)為X if C else Y。

什么時(shí)候應(yīng)該使用斷言?
斷言的基本語(yǔ)法如下:
assert expression1 ["," expression2]
計(jì)算expression1的值會(huì)返回True或者False,當(dāng)值為False的時(shí)候會(huì)引發(fā)AssertError,而expression2是可選的,常用來(lái)查看具體的異常信息。
斷言是有代價(jià)的,會(huì)對(duì)性能產(chǎn)生一定的影響,但python并沒(méi)有嚴(yán)格定義調(diào)試與發(fā)布模式之間的差別,通常禁用斷言的方法是在運(yùn)行腳本時(shí)加上-O標(biāo)志,這種方法帶來(lái)的影響是它不優(yōu)化字節(jié)碼,而是忽略與斷言有關(guān)的語(yǔ)句。
斷言是用來(lái)捕獲用戶定義的約束的,不是用來(lái)捕獲程序本身的錯(cuò)誤的。

斷言應(yīng)該被使用在正常邏輯不可到達(dá)的地方或正常情況下總是為真的場(chǎng)合。

異常能處理就不要使用斷言。

不要用斷言檢查用戶輸入。

當(dāng)函數(shù)調(diào)用后,需要確定返回值是否合理時(shí)可以使用斷言。

當(dāng)條件是業(yè)務(wù)邏輯繼續(xù)的先決條件時(shí)可以使用斷言。

我最近在一個(gè)爬蟲(chóng)代碼里使用了幾次斷言,使用斷言是為了保證程序自身所記錄的頁(yè)數(shù)與爬蟲(chóng)所運(yùn)行到的頁(yè)數(shù)相同,否則會(huì)在存儲(chǔ)數(shù)據(jù)時(shí)發(fā)生錯(cuò)誤。


數(shù)據(jù)交換值時(shí)不推薦使用中間變量
x,y = y,x 這種方法有更好的性能。

構(gòu)建合理的包層次來(lái)管理module
本質(zhì)上每一個(gè)python文件都是一個(gè)模塊,但在大的項(xiàng)目中把所有的python文件放在一個(gè)目錄下不是一個(gè)好的做法。我們應(yīng)該用package包來(lái)管理模塊。
__init__.py的一些作用:

Package/ __init__.py
  Module1.py
  Module2.py
  Subpackage/ __init__.py
        Module1.py
        Module2.py

使包和普通目錄區(qū)分

如果我們?cè)赑ackage包下的__init__.py中添加:
from Module1 import Test語(yǔ)句,則可以直接使用from Package import Test來(lái)導(dǎo)入類Test

當(dāng)__init__.py為空,意圖使用from Package import *語(yǔ)句將包Package中所有的模塊導(dǎo)入當(dāng)前命名空間將會(huì)失敗。它僅僅會(huì)執(zhí)行__init__.py文件。因此我們需要修改__init__.py文件。
如果我們?cè)?b>__init__.py文件中添加:

__all__ = ["Module1","Module2","Subpackage"]
這樣我們就能使用from Package import *語(yǔ)句將包Package中所有的模塊導(dǎo)入當(dāng)前命名空間。


使用with自動(dòng)關(guān)閉資源
with語(yǔ)句可以在代碼塊執(zhí)行完畢后還原進(jìn)入該代碼塊時(shí)的現(xiàn)場(chǎng)。在文件管理時(shí)使用with總能保證文件被正常關(guān)閉。

None的特殊性
所有被賦值為None的變量相等,并且None與任何其他非None的對(duì)象比較結(jié)果都為False.

字符串的連接特別是大規(guī)模字符串的處理,應(yīng)該優(yōu)先使用join而不是+。
如果我們進(jìn)行以下操作:S1+S2+S3+..,執(zhí)行一次+操作便會(huì)在內(nèi)存中申請(qǐng)一塊新的內(nèi)存,并將上一次操作的結(jié)果和本次操作的右操作數(shù)復(fù)制到該內(nèi)存中。在N個(gè)字符串連接中,會(huì)產(chǎn)生N-1個(gè)中間結(jié)果,每產(chǎn)生一個(gè)中間結(jié)果都要申請(qǐng)和復(fù)制一次內(nèi)存,總共要申請(qǐng)N-1次內(nèi)存,嚴(yán)重影響效率。時(shí)間復(fù)雜度接近O(n^2)。
而當(dāng)使用join()方法連接字符串時(shí),會(huì)首先計(jì)算需要申請(qǐng)的總的內(nèi)存空間,然后一次性申請(qǐng)所需內(nèi)存并將字符序列中的每一個(gè)元素復(fù)制到內(nèi)存中。時(shí)間復(fù)雜度為O(n)。

python中一切皆對(duì)象,每一個(gè)對(duì)象都有一個(gè)唯一的id。
函數(shù)傳參既不是傳值也不是傳引用
在C/C++中,如果執(zhí)行:

a = 5;
b = a;
b = 7;

在內(nèi)存中申請(qǐng)一塊內(nèi)存并將a的值復(fù)制到該內(nèi)存中,當(dāng)執(zhí)行b = 7時(shí)將b對(duì)應(yīng)的值從5改到7。
而對(duì)于python,賦值并不是復(fù)制,b=a使得a和b引用同一個(gè)對(duì)象。b=7則是將b指向?qū)ο?。
python函數(shù)參數(shù)到底是傳值還是傳引用,實(shí)際都不是,而是傳對(duì)象或者說(shuō)傳對(duì)象的引用。
對(duì)可變對(duì)象的修改在函數(shù)外部以及內(nèi)部都可見(jiàn),調(diào)用者和被調(diào)用者之間共享這個(gè)對(duì)象。
對(duì)于不可變對(duì)象,由于并不能真正修改,因?yàn)?,修改往往是通過(guò)生成一個(gè)新對(duì)象然后賦值來(lái)實(shí)現(xiàn)的。

警惕默認(rèn)參數(shù)潛在的問(wèn)題

def在python中是一個(gè)可執(zhí)行的語(yǔ)句,當(dāng)解釋器執(zhí)行def時(shí),默認(rèn)參數(shù)也會(huì)被計(jì)算,并存在函數(shù)的.func_defaults屬性中。  
由于Python中函數(shù)參數(shù)傳遞的是對(duì)象,可變對(duì)象在調(diào)用者和被調(diào)用者之間共享。
def appendtest(newitem,lista=[]):
    print(id(lista))
    lista.append(newitem)
    print(id(lista))
    return lista

>>> appendtest(1)
12345
12345
[1]
>>> appendtest("a")
12345
12345
[1,"a"]

PS:我們可以用這個(gè)屬性,統(tǒng)計(jì)某個(gè)方法被調(diào)用的次數(shù)。
如果不想讓默認(rèn)參數(shù)所指向的對(duì)象在所有的函數(shù)調(diào)用中共享,而是在函數(shù)調(diào)用的過(guò)程中動(dòng)態(tài)生成,可在定義的時(shí)候使用None對(duì)象作為占位符。

def appendtest(newitem,lista=None):
    print(id(lista))
    lista.append(newitem)
    print(id(lista))
    return lista

str()和repr()的區(qū)別:目標(biāo)不同:str()面向用戶,repr()面向解釋器和開(kāi)發(fā)人員
字符串的一些技巧:

python遇到未閉合的小括號(hào)時(shí)會(huì)自動(dòng)將多行代碼拼接為一行和把相鄰的兩個(gè)字符串字面量拼接在一起。

s = ("SELECT * "
    "FROM atable "
    "WHERE afirld="value"")
print(s)
>>> SELECT * FROM atable WHERE afirld="value"

str的一些方法
str方法很多,只說(shuō)幾個(gè)有意思的:

count()能查找子串在字符串中出現(xiàn)的次數(shù),這個(gè)方法在調(diào)用replace方法時(shí)能使用,可以批量替換。
replace(old,new[,count])用以替換字符串的某些子串,如果指定count參數(shù),就最多替換count次,不指定則替換全部。


參考資料:《編寫(xiě)高質(zhì)量代碼:改善Python程序的91個(gè)建議》

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/38504.html

相關(guān)文章

  • Python貓薦書(shū)系統(tǒng)之四:《Python源碼剖析》

    摘要:以下內(nèi)容僅針對(duì)版書(shū)籍,等新版上市后,薦書(shū)欄目會(huì)對(duì)兩版的差異跟進(jìn)介紹。當(dāng)然,后續(xù)其它薦書(shū)的書(shū)目,也很有可能會(huì)送福利,一樣不容錯(cuò)過(guò)。 showImg(https://segmentfault.com/img/bVbjIxq?w=6000&h=4000); 大家好,新一期的薦書(shū)欄目如期跟大家見(jiàn)面了。 先來(lái)看看今天的主角是誰(shuí):《Python源碼剖析——深度探索動(dòng)態(tài)語(yǔ)言核心技術(shù)》,2008年出版...

    simpleapples 評(píng)論0 收藏0
  • Python貓薦書(shū)系列之五:Python高性能編程

    摘要:鋪墊已了,進(jìn)入今天的正題,貓薦書(shū)系列之五高性能編程本書(shū)適合已入門(mén)還想要進(jìn)階和提高的讀者閱讀。書(shū)中列舉了兩個(gè)慘痛的教訓(xùn)華爾街公司騎士資本由于軟件升級(jí)引入的錯(cuò)誤,損失億美元公司小時(shí)全球中斷的嚴(yán)重事故。 showImg(https://segmentfault.com/img/bVbm92w?w=6720&h=4480); 稍微關(guān)心編程語(yǔ)言的使用趨勢(shì)的人都知道,最近幾年,國(guó)內(nèi)最火的兩種語(yǔ)言非...

    channg 評(píng)論0 收藏0
  • Python貓薦書(shū)系列之五:Python高性能編程

    摘要:鋪墊已了,進(jìn)入今天的正題,貓薦書(shū)系列之五高性能編程本書(shū)適合已入門(mén)還想要進(jìn)階和提高的讀者閱讀。書(shū)中列舉了兩個(gè)慘痛的教訓(xùn)華爾街公司騎士資本由于軟件升級(jí)引入的錯(cuò)誤,損失億美元公司小時(shí)全球中斷的嚴(yán)重事故。 showImg(https://segmentfault.com/img/bVbm92w?w=6720&h=4480); 稍微關(guān)心編程語(yǔ)言的使用趨勢(shì)的人都知道,最近幾年,國(guó)內(nèi)最火的兩種語(yǔ)言非...

    馬永翠 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<