狠狠操夜夜甜|人妻在线中文字幕亚洲无码不卡av|一区二区欧美亚洲|日躁夜躁狠狠躁2001|亚洲,超碰,欧美|18AV成人电影|午夜成人免费在线|婷婷激情网深爱五月|色欲综合成人在线|在线美女搞黄大片

中企動力 > 頭條 > python2和

網(wǎng)站性能檢測評分

注:本網(wǎng)站頁面html檢測工具掃描網(wǎng)站中存在的基本問題,僅供參考。

python2和

Python代碼風(fēng)格:PEP8規(guī)則 筆記 推廣視頻課程

img

隔心島

關(guān)注

Python程序設(shè)計的代碼風(fēng)格應(yīng)該遵循PEP8規(guī)則:

一、代碼布局

1、縮進(jìn):

每級縮進(jìn)4個空格(不用Tab,更不空格Tab混用)

1、續(xù)行應(yīng)該與其包裹元素對齊,要么使用圓括號、方括號和花括號內(nèi)的隱式行連接來垂直對齊,要么使用懸掛式縮進(jìn)對齊。當(dāng)使用懸掛縮進(jìn)時,應(yīng)該考慮到第一行不應(yīng)該有參數(shù),以及使用縮進(jìn)以區(qū)分自己是續(xù)行。

2、縮進(jìn)4個空格的規(guī)則對于續(xù)行是可選的。

3、當(dāng) if 語句的條件部分長到需要換行寫的時候,注意可以在兩個字符關(guān)鍵字的連接處(比如 if ),增加一個空格,再增加一個左括號來創(chuàng)造一個4空格縮進(jìn)的多行條件。這會與 if 語句內(nèi)同樣使用4空格縮進(jìn)的代碼產(chǎn)生視覺沖突。PEP沒有明確指明要如何區(qū)分i發(fā)的條件代碼和內(nèi)嵌代碼。可使用的選項包括但不限于下面幾種情況:

4、(可以參考下面關(guān)于是否在二進(jìn)制運算符之前或之后截斷的討論)

在多行結(jié)構(gòu)中的大括號/中括號/小括號的右括號可以與內(nèi)容對齊單獨起一行作為最后一行的第一個字符,如:

或者也可以與多行結(jié)構(gòu)的第一行第一個字符對齊,如:

2、Tab還是空格?

空格是被首先推薦的縮進(jìn)方式。

Tab應(yīng)該只在現(xiàn)有代碼已經(jīng)使用tab進(jìn)行縮進(jìn)的情況下使用,以便和現(xiàn)有代碼保持一致。

Python 3不允許再同一個代碼塊中Tab和空格混合使用。

混合使用制表符和空格縮進(jìn)的Python2代碼應(yīng)該統(tǒng)一轉(zhuǎn)成空格。

使用命令行運行Python 2時,使用-t選項,會出現(xiàn)非法混用tab和空格的警告。當(dāng)使用-tt選項時,這些警告會變成錯誤。強(qiáng)烈推薦使用這些選項!

3、最大行長

每行最大長度79個字符。

對于連續(xù)大段的文字(比如文檔字符串(docstring)或注釋),每行應(yīng)該被限制在72個字符長度內(nèi)。

Python標(biāo)準(zhǔn)庫比較傳統(tǒng),將行長限制在79個字符以內(nèi)(文檔字符串/注釋為72個字符)。

一種推薦的換行方式是利用Python圓括號、方括號和花括號中的隱式續(xù)行。長行可以通過在括號內(nèi)換行來分成多行。應(yīng)該最好加上反斜杠來區(qū)別續(xù)行。

有時續(xù)行只能使用反斜杠才。例如,較長的多個 with 語句不能采用隱式續(xù)行,只能接受反斜杠表示換行:

另一個這樣的例子是assert語句。要確保續(xù)行的縮進(jìn)適當(dāng)。

在二元運算符之前應(yīng)該換行嗎?

遵循數(shù)學(xué)的傳統(tǒng)能產(chǎn)出更多可讀性高的代碼:

4、空行

頂層函數(shù)和類的定義,前后用兩個空行隔開。

類里的方法定義用一個空行隔開。

相關(guān)的功能組可以用額外的空行(盡量少地)隔開。一堆相關(guān)的單行代碼之間的空白行可以省略(例如,一組虛擬實現(xiàn) dummy implementations)。

在函數(shù)中使用空行來區(qū)分邏輯段(盡量少地)。

Python接受control-L(即^L)換頁符作為空格;許多工具把這些字符當(dāng)作頁面分隔符,所以你可以在文件中使用它們來分隔相關(guān)段落。請注意,一些編輯器和基于Web的代碼閱讀器可能無法識別control-L為換頁,將在其位置顯示另一個字形。

5、源文件編碼

Python核心發(fā)布版本中的代碼總是以UTF-8格式編碼(或者在Python2中用ASCII編碼)。

使用ASCII(Python 2)或者UTF-8(Python 3)的文件不應(yīng)該添加編碼聲明。

在標(biāo)準(zhǔn)庫中,只有用作測試目的,或者注釋或文檔字符串需要提及作者名字而不得不使用非ASCII字符時,才能使用非默認(rèn)的編碼。否則,在字符串文字中包括非ASCII數(shù)據(jù)時,推薦使用\x, \u, U或N等轉(zhuǎn)義符。

對于Python 3.0及其以后的版本中,標(biāo)準(zhǔn)庫遵循以下原則(參見PEP 3131):Python標(biāo)準(zhǔn)庫中的所有標(biāo)識符都必須只采用ASCII編碼的標(biāo)識符,在可行的條件下也應(yīng)當(dāng)使用英文詞(很多情況下,使用的縮寫和技術(shù)術(shù)語詞都不是英文)。此外,字符串文字和注釋應(yīng)該只包括ASCII編碼。只有兩種例外:

(a) 測試情況下為了測試非ASCII編碼的特性

(b) 作者名字。作者名字不是由拉丁字母組成的也必須提供一個拉丁音譯名。

鼓勵面向全球的開源項目都采用類似的原則。

6、導(dǎo)入

1、imports應(yīng)該分行寫,而不是都寫在一行,例如:

這樣寫也是可以的:

導(dǎo)入(import)始終在文件的頂部,在模塊注釋和文檔字符串之后,在模塊全局變量和常量之前。

導(dǎo)入順序如下:

imports應(yīng)該按照下面的順序分組來寫:

1、標(biāo)準(zhǔn)庫imports

2、相關(guān)第三方imports

3、本地應(yīng)用/庫的特定imports

不同組的imports之前用空格隔開。

將任何相關(guān)的 __all__ 說明(specification)放在imports之后。

推薦使用絕對(absolute)imports,因為這樣通常更易讀,在import系統(tǒng)沒有正確配置的情況下,也會有更好的表現(xiàn)(或者至少會給出錯誤信息):

在絕對路徑比較長的情況下,也可以使用相對導(dǎo)入:

Python 3中已經(jīng)禁止隱式的相對導(dǎo)入。

導(dǎo)入類的方法,通??梢赃@樣寫:

如果和本地命名的拼寫產(chǎn)生了沖突,應(yīng)當(dāng)使用絕對導(dǎo)入:

禁止使用通配符導(dǎo)入。

通配符導(dǎo)入(from import *)應(yīng)該避免,因為它不清楚命名空間有哪些名稱存,混淆讀者和許多自動化的工具。唯一的例外是重新發(fā)布對外的API時可以考慮使用。

7、模塊中前后具有雙下劃線的變量名

像__all__ , __author__ , __version__ 等這樣的模塊中的變量名(也就是名字里有兩個前綴下劃線和兩個后綴下劃線),應(yīng)該放在文檔字符串的后面,以及除from __future__ 之外的import表達(dá)式前面。Python要求將來在模塊中的導(dǎo)入,必須出現(xiàn)在除文檔字符串之外的其他代碼之前。

比如:

二、字符串引號

Python中單引號字符串和雙引號字符串都是相同的。注意盡量避免在字符串中的反斜杠以提高可讀性。

根據(jù)PEP 257, 三個引號都使用雙引號。

三、表達(dá)式和語句中的空格

在下列情況下,避免使用無關(guān)的空格:

1、緊跟在小括號,中括號或者大括號后。

2、緊貼在逗號、分號或者冒號之前。

3、然而,冒號在切片中就像二元運算符,在兩邊應(yīng)該有相同數(shù)量的空格(把它當(dāng)做優(yōu)先級最低的操作符)。在擴(kuò)展的切片操作中,所有的冒號必須有相同的間距。例外情況:當(dāng)一個切片參數(shù)被省略時,空格就被省略了。

4、緊貼在函數(shù)參數(shù)的左括號之前。

5、緊貼索引或者切片的左括號之前。

6、為了和另一個賦值語句對齊,在賦值運算符附件加多個空格。

其他建議

1、避免在尾部添加空格。因為尾部的空格通常都看不見,會產(chǎn)生混亂:比如,一個反斜杠后面跟一個空格的換行符,不算續(xù)行標(biāo)記。有些編輯器不會保留尾空格,并且很多項目(像CPython)在pre-commit的掛鉤調(diào)用中會過濾掉尾空格。

總是在二元運算符兩邊加一個空格:賦值(=),增量賦值(+=,-=),比較(==,,!=,,=,in,not,in,is,is not),布爾(and, or, not)。

如果使用具有不同優(yōu)先級的運算符,請考慮在具有最低優(yōu)先級的運算符周圍添加空格。有時需要通過自己來判斷;但是,不要使用一個以上的空格,并且在二元運算符的兩邊使用相同數(shù)量的空格。

2、在指定函數(shù) 關(guān)鍵字參數(shù) 或者 默認(rèn)參數(shù) 值的時候,不要在=附近加上空格。

3、功能型注釋應(yīng)該使用冒號的一般性規(guī)則,并且在使用 ->的時候要在兩邊加空格。(參考下面的功能注釋得到能夠多信息)

4、當(dāng)給有類型備注的參數(shù)賦值的時候,在=兩邊添加空格(僅針對那種有類型備注和默認(rèn)值的參數(shù))。

5、復(fù)合語句(同一行中的多個語句)通常是不允許的。

6、雖然有時候?qū)⑿〉拇a塊和 if/for/while 放在同一行沒什么問題,多行語句塊的情況不要這樣用,同樣也要避免代碼行太長!

四、注釋

與代碼自相矛盾的注釋比沒注釋更差。修改代碼時要優(yōu)先更新注釋!

注釋是完整的句子。如果注釋是斷句,首字母應(yīng)該大寫,除非它是小寫字母開頭的標(biāo)識符(永遠(yuǎn)不要修改標(biāo)識符的大小寫)。

如果注釋很短,可以省略末尾的句號。注釋塊通常由一個或多個段落組成。段落由完整的句子構(gòu)成且每個句子應(yīng)該以點號(后面要有兩個空格)結(jié)束,并注意斷詞和空格。

非英語國家的程序員請用英語書寫你的注釋,除非你120%確信代碼永遠(yuǎn)不會被不懂你的語言的人閱讀。

1、注釋塊

注釋塊通常應(yīng)用在代碼前,并和這些代碼有同樣的縮進(jìn)。每行以 '# '(除非它是注釋內(nèi)的縮進(jìn)文本,注意#后面有空格)。

注釋塊內(nèi)的段落用僅包含單個 '#' 的行分割。

2、行內(nèi)注釋

慎用行內(nèi)注釋(Inline Comments) 節(jié)儉使用行內(nèi)注釋。 行內(nèi)注釋是和語句在同一行,至少用兩個空格和語句分開。行內(nèi)注釋不是必需的,重復(fù)羅嗦會使人分心。

不推薦:

但是有時,很有必要:

加了以后對理解代碼很有幫助的情況下,關(guān)鍵處才加。

3、文檔字符串

文檔字符串的標(biāo)準(zhǔn)參見:PEP 257。

為所有公共模塊、函數(shù)、類和方法書寫文檔字符串。非公開方法不一定有文檔字符串,建議有注釋(出現(xiàn)在 def 行之后)來描述這個方法做什么。

更多參考:PEP 257 文檔字符串約定。注意結(jié)尾的 """ 應(yīng)該單獨成行,例如:

單行的文檔字符串,結(jié)尾的 """ 在同一行。

4、版本標(biāo)簽

如果你必須在源文件中包含git、Subversion、CVS或RCS crud信息,放置在模塊的文檔字符串之后,任何其他代碼之前,上下各用一個空行:

五、命名規(guī)范

Python庫的命名約定有點混亂,不可能完全一致。但依然有些普遍推薦的命名規(guī)范的。新的模塊和包 (包括第三方的框架) 應(yīng)該遵循這些標(biāo)準(zhǔn)。對不同風(fēng)格的已有的庫,建議保持內(nèi)部的一致性。

1、最重要的原則

用戶可見的API命名應(yīng)遵循使用約定而不是實現(xiàn)。

2、命名風(fēng)格

以下是常見的命名方式:

b(單個小寫字母)

B(單個大寫字母)

lowercase (小寫字母)

lower_case_with_underscores (使用下劃線分隔的小寫字母)

UPPERCASE( 大寫字母)

UPPER_CASE_WITH_UNDERSCORES (使用下劃線分隔的大寫字母)

CapitalizedWords(首字母大寫的單詞串或駝峰縮寫)

注意: 使用大寫縮寫時,縮寫使用大寫字母更好。故 HTTPServerError 比 HttpServerError 更好。

mixedCase(不同于首字母大寫,第一個單詞的首字母小寫)

Capitalized_Words_With_Underscores(帶下劃線,首字母大寫,巨丑無比)

還有一種風(fēng)格使用短前綴分組名字。這在Python中不常用, 但出于完整性提一下。例如,os.stat()返回的元組有st_mode, st_size, st_mtime等等這樣的名字(與POSIX系統(tǒng)調(diào)用結(jié)構(gòu)體一致)。

X11庫的所有公開函數(shù)以X開頭, Python中通常認(rèn)為是不必要的,因為屬性和方法名有對象作前綴,而函數(shù)名有模塊名為前綴。

下面講述首尾有下劃線的情況:

_single_leading_underscore:(單前置下劃線): 弱內(nèi)部使用標(biāo)志。 例如"from M import " 不會導(dǎo)入以下劃線開頭的對象。

single_trailing_underscore_(單后置下劃線): 用于避免與 Python關(guān)鍵詞的沖突。 例如:

__double_leading_underscore(雙前置下劃線): 當(dāng)用于命名類屬性,會觸發(fā)名字重整。 (在類FooBar中,__boo變成 _FooBar__boo)。

__double_leading_and_trailing_underscore__(雙前后下劃線):用戶名字空間的魔法對象或?qū)傩?。例?__init__ , __import__ or __file__,不要自己發(fā)明這樣的名字。

3、命名約定規(guī)范

避免采用的名字:

決不要用字符'l'(小寫字母el),'O'(大寫字母oh),或 'I'(大寫字母eye) 作為單個字符的變量名。一些字體中,這些字符不能與數(shù)字1和0區(qū)別。用'L' 代替'l'時。

包和模塊名:

模塊名要簡短,全部用小寫字母,可使用下劃線以提高可讀性。包名和模塊名類似,但不推薦使用下劃線。

模塊名對應(yīng)到文件名,有些文件系統(tǒng)不區(qū)分大小寫且截短長名字,在 Unix上不是問題,但當(dāng)把代碼遷移到 Mac、Windows 或 DOS 上時,就可能是個問題。當(dāng)然隨著系統(tǒng)的演進(jìn),這個問題已經(jīng)不是經(jīng)常出現(xiàn)。

另外有些模塊底層用C或C++ 書寫,并有對應(yīng)的高層Python模塊,C/C++模塊名有一個前置下劃線 (如:_socket)。

類名:

遵循CapWord。

接口需要文檔化并且可以調(diào)用時,可能使用函數(shù)的命名規(guī)則。

注意大部分內(nèi)置的名字是單個單詞(或兩個),CapWord只適用于異常名稱和內(nèi)置的常量。

異常名:

如果確實是錯誤,需要在類名添加后綴 "Error"。

全局變量名:

變量盡量只用于模塊內(nèi)部,約定類似函數(shù)。

對設(shè)計為通過 "from M import " 來使用的模塊,應(yīng)采用 __all__ 機(jī)制來防止導(dǎo)入全局變量;或者為全局變量加一個前置下劃線。

函數(shù)名:

函數(shù)名應(yīng)該為小寫,必要時可用下劃線分隔單詞以增加可讀性。 mixedCase(混合大小寫)僅被允許用于兼容性考慮(如: threading.py)。

函數(shù)和方法的參數(shù):

實例方法第一個參數(shù)是 'self'。

類方法第一個參數(shù)是 'cls'。

如果函數(shù)的參數(shù)名與保留關(guān)鍵字沖突,通常在參數(shù)名后加一個下劃線。

方法名和實例變量:

同函數(shù)命名規(guī)則。

非公開方法和實例變量增加一個前置下劃線。

為避免與子類命名沖突,采用兩個前置下劃線來觸發(fā)重整。類Foo屬性名為__a, 不能以 Foo.__a訪問。(執(zhí)著的用戶還是可以通過Foo._Foo__a。) 通常雙前置下劃線僅被用來避免與基類的屬性發(fā)生命名沖突。

常量:

<...

學(xué)習(xí)python經(jīng)常遇到的錯誤 公司視頻課程

img

Sukhna

關(guān)注

Python簡介

Python是一種動態(tài)的、面向?qū)ο蟮?、解釋性高級編程語言。由于內(nèi)置的高級數(shù)據(jù)結(jié)構(gòu)和對動態(tài)類型和動態(tài)綁定的支持,使用python進(jìn)行快速應(yīng)用程序開發(fā)是非常方便的。同時,作為一種腳本語言,它與現(xiàn)有的組件和服務(wù)兼容。Python還支持模塊和各種庫的擴(kuò)展,有助于實現(xiàn)模塊化編程和提高代碼重用性。

在這篇文章

剛剛接觸過該語言的新來者可能無法適應(yīng)Python簡單而靈活的語法,或者低估Python的強(qiáng)大性能。鑒于此,本文列出了Python開發(fā)人員經(jīng)常犯的10個小錯誤。

這篇文章是供Python高級開發(fā)人員參考的,Python白可以參考下面的文章:

http://onlamp/pub/a/python/2004/02/05/learn_python.html

常見錯誤1:濫用表達(dá)式作為函數(shù)參數(shù)的默認(rèn)值

Python允許開發(fā)人員指定函數(shù)參數(shù)的默認(rèn)值。這也是Python的一個主要特性,但是當(dāng)默認(rèn)值是可變的時,它可能會給開發(fā)人員帶來一些問題。例如,下面定義的函數(shù):

>>> def foo(bar=[]): # bar is optional and defaults to [] if not specified... bar.append("baz")# but this line could be problematic, as we'll see...... return bar

你看到蟲子了嗎?也就是說,在每次調(diào)用之前不要為函數(shù)分配一個變量參數(shù),并認(rèn)為參數(shù)是默認(rèn)值。例如,上面的代碼,一個可能會多次調(diào)用foo()returns'baz'when,每個調(diào)用foo(),為[ ]的價值吧,那是一個空的列表。

但是讓我們看看代碼運行的結(jié)果:

>;>;>;foo()[“巴茲”] >;>;>;foo()[“巴茲”、“Baz”] & gt;

嗯?你為什么要加上“巴茲”每次調(diào)用foo到現(xiàn)有列表(),而不是一個新的列表?答案是函數(shù)定義的默認(rèn)值只在函數(shù)定義時執(zhí)行一次。因此,當(dāng)?shù)谝淮味x富時,bar被初始化為默認(rèn)值(空列表)。此后,每次調(diào)用富()函數(shù)時,參數(shù)欄就是第一次初始化時生成的列表。

常見的解決方案:

>>> def foo(bar=None):... if bar is None: # or if not bar:... bar = []... bar.append("baz")... return bar...>>> foo()["baz"]>>> foo()["baz"]>>>foo()["baz"]

常見錯誤2:類變量的錯誤使用

代碼示例:

>;>;>;類(對象):…x=1…>;>;>;B(A):通…

結(jié)果沒有問題。

>;>;>;b.x = 2 >;>;>;打印A.x,b.x,c.x121

結(jié)果也是正確的。

>;>;>;內(nèi)= 3 >;>;>;打印A.x,b.x,c.x323

到底是什么?我們只改變了A.x.,C.x為什么要改變呢?

在Python中,類變量是以字典的形式在內(nèi)部處理的,其次是解析的方法(方法解析順序,MRO)。因此,在上面的代碼中,因為在類C中找不到屬性x,所以它從父類中查找x的值。雖然Python支持多重繼承,上述代碼,換句話說,只有一個父類A,C沒有自己的X是獨立的類,那么,C.x實際上指的是a.x.如果處理得當(dāng),它會使Python的錯誤。

如果您想深入了解Python的類特性,請蓋章:

https://toptal/python/python-class-attributes-an-overly-thorough-guide

常見錯誤3:指定異常代碼塊參數(shù)的錯誤

假設(shè)您有以下代碼:

嘗試:…l“A”,“B”…int(L [ 2 ])除了ValueError,#誤差系數(shù)…要捕獲這兩個異常,對嗎?Traceback(最)…通過…最近的電話最后文件”):;3號線,;誤差系數(shù):列表索引超出范圍

這里的問題是,除語句不接受以這種方式指定的異常列表。在python2. x,變量在除了異常語句可以用來綁定異常信息的第二可選參數(shù)進(jìn)一步查看異常。因此,在上面的代碼中,除了聲明不捕捉誤差系數(shù)的例外;相反,例外的是綁定到參數(shù)誤差系數(shù)。

在一個例外語句中同時捕獲多個異常的正確方法是將第一個參數(shù)分配給元組,并編寫要寫入元組的異常類型。為了方便起見,您可以使用AS關(guān)鍵字、Python 2和Python 3來支持這種語法格式:

嘗試:…L =“A”,“B”…int(l [ 2 ])…除了(ValueError,IndexError)的…

常見錯誤4:錯誤理解Python中變量的范圍

Python變量的范圍如下legb規(guī)則。legb是縮寫的地方,封閉,全球和內(nèi)置。它分別代表本地范圍、封閉范圍、全局范圍和內(nèi)置范圍。這條規(guī)則一目了然。事實上,Python中的這種工作更為獨特,并導(dǎo)致一些編程錯誤,如:

(10)…1…X. ..>;>;>;foo(最)追蹤(最近的電話上):stdin文件;1號線,;;2號線:在foounboundlocalerror,當(dāng)?shù)豽ariable'x'referenced之前分配

問題在哪里?

上述錯誤是因為在將變量分配給作用域時,Python自動將變量視為作用域中的局部變量,并屏蔽同名變量的外部定義。因此,正確的原代碼,添加在一個函數(shù)的賦值語句后,意外地收到了unboundlocalerror錯誤消息。

請把更多關(guān)于UnboundLocalError:

http:/ /文檔。Python。org / 2 /常/ HTML # why-am-i-getting-an-unboundlocalerror-when-the-variable-has-a-value編程。

當(dāng)使用列表時,Python程序員更容易陷入這樣的陷阱,例如:

>;>;>;1 = 2,[ 1, 3 ] >;>;>;DEF(匹配foo1):(5)# lst.append…這個效果不錯…& gt…;>;>;匹配foo1(& gt);>;>;1 [ 1, 2, 3,5 ] >;>;>;1 = [ 1 2, 3 ] >,>;>;定義;Foo2(LST = [ 5 ]):…#…但是這些炸彈!& gt…>;>;Foo2;Traceback(最)最近通話(上):stdin文件;1號線,;;文件”線,2,在foounboundlocalerror:當(dāng)?shù)豽ariable'lst'referenced之前分配

奇怪的是,為什么匹配foo1正常運行,和Foo2死機(jī)?

原因與前面的問題類似,但這里的錯誤更為微妙。功能匹配foo1不指定一個值的變量和函數(shù)的LST,F(xiàn)oo2有一個賦值操作。

首先,LST =【5】= 1+1的縮寫[ 5 ],在Foo2功能在試圖做一個分配給變量的LST(Python變量LST默認(rèn)為局部變量)。然而,LST + = [ 5 ]聲明是一變量自動賦值操作(在可變LST范圍是一個功能,但功能Foo2 Foo2)不聲明變量,所以他們叫你!

常見錯誤5:遍歷列表時修改列表

下面代碼中的錯誤是顯而易見的:

>;>;>;奇數(shù)=λx:bool(x 2)>;>;>;數(shù)= [ N N的范圍(10)] >;>;>;我在范圍(Len(數(shù)字):奇(數(shù))[我]):如果…德爾數(shù)[我]:刪除項目#壞…從listwhile迭代Traceback(最近的叫它…最后文件”):;2號線,;誤差系數(shù):列表索引超出范圍

有經(jīng)驗的程序員知道,在使用Python遍歷列表或數(shù)組時,不應(yīng)刪除列表(數(shù)組)中的元素。雖然上述代碼的錯誤是顯而易見的,但是高級程序員在編寫復(fù)雜代碼時會犯這樣的錯誤。

幸運的是,Python集成了大量經(jīng)典編程范例,如果使用得當(dāng),可以大大簡化代碼并提高編程效率。簡單的代碼將減少錯誤的可能性。列表解析(列表推導(dǎo)式)是一種工具,將完美的避免了上述缺陷,以及解決方法如下:

>>> odd = lambda x : bool(x % 2)>>> numbers = [n for n in range(10)]>>> numbers[:] = [n for n in numbers if not odd(n)] # ahh, the beauty of it all>>> numbers[0, 2, 4, 6, 8]

關(guān)于列表解析,更多詳情請戳:http:/ /文檔。Python。org / 2 /教程/數(shù)據(jù)結(jié)構(gòu)。HTML #嘖嘖listcomps

常見錯誤6:不理解Python閉包中的變量綁定

代碼示例:

>;>;>;create_multipliers(DEF):…返回[λx:i x,i(5);”;“;”;“;”;“gt”:…

你認(rèn)為運行結(jié)果會是:

02468

但實際產(chǎn)出結(jié)果如下:8

八千八百八十八

沒有驚喜!

這種情況是由Python延遲綁定(后期綁定)機(jī)制引起的,也就是說,只有在調(diào)用內(nèi)部函數(shù)時,才會搜索閉包中的變量的值。所以在上面的代碼中,每次在create_multipliers回歸函數(shù)()函數(shù)被調(diào)用時,該變量的值我是在附近的范圍查詢。(此時,返回的循環(huán)結(jié)束,所以i值為4)。

常見的解決方案:

>;>;>;DEF create_multipliers():返回[λx,我=我:我×××,我(5)];…;”;“;”;“;“;”;“詩”:“02468”…

是的,我們使用匿名函數(shù)lambda的默認(rèn)參數(shù)生成結(jié)果序列。有些人認(rèn)為它很簡單,有人會說它很聰明,其他人會覺得很難理解。如果您是Python開發(fā)人員,對語法有深刻的理解是非常重要的。

常見錯誤7:模塊之間的循環(huán)依賴關(guān)系

假設(shè)你有兩個文件,a.py和b.py,并互相介紹,如下圖所示:

在a.py模塊代碼:

進(jìn)口bdef f():返回b.xprint f()

在b.py模塊代碼:

進(jìn)口AX = 1def G():打印A.f()

首先,我們嘗試導(dǎo)入a.py:

進(jìn)口A1

運行結(jié)果正確!這似乎有點意外,因為我們在這里進(jìn)行循環(huán)介紹,應(yīng)該報錯了!

答案是,如果Python中只有一個循環(huán)導(dǎo)入,程序就不會出錯。如果導(dǎo)入了一個模塊,Python將自動識別并不再次導(dǎo)入。但如果每個模塊的功能或變量以不同的位置訪問其他模塊,那么錯誤易出現(xiàn)雙倍。

回到上面的例子中,輸入a.py模塊時,程序可以導(dǎo)入b.py模塊正常,因為b.py模塊不當(dāng)時參觀a.py任何變量或函數(shù)。的b.py模塊只引用A.f()在a.py模塊功能。調(diào)用A.f()函數(shù)屬于G()函數(shù),和G()函數(shù)不叫在a.py或b.py模塊。所以程序沒有錯。

但是,如果我們進(jìn)口的b.py模塊導(dǎo)入前的a.py模塊,結(jié)果會怎樣?

>;>;>;進(jìn)口btraceback(最后調(diào)用文件”):;1號線,;文件”b.py”線,1,在& lt;模塊& gt進(jìn)口;文件a.py,6號線,在;F(文件)”a.py”,4號線,在freturn b.xattributeerror:'module'object沒有attribute'x”

錯了!問題是,在進(jìn)口b.py過程,它試圖進(jìn)口a.py模塊,和a.py模塊調(diào)用f()函數(shù),和f()函數(shù)試圖訪問b.x變量。但在這一點上,b.x變量未定義,那么還有一個意思是例外。

上述問題可以通過稍微修改b.py,即解決,進(jìn)口在G a.py()函數(shù)。

改性b.py:

x = 1def g():

進(jìn)口這將只計算#當(dāng)G(是)calledprint(A.f)

現(xiàn)在我們進(jìn)入b.py模塊,不給你!

>;>;>;進(jìn)口B >;>;>;(1)不到印刷# module'a'calls'print以來第一次(F)在可以印刷#”了一次,這是我們的電話to'g”

常見錯誤8:文件命名與Python標(biāo)準(zhǔn)庫模塊的名稱沖突

Python的優(yōu)點之一是它集成了一個豐富的標(biāo)準(zhǔn)庫。因此,稍微關(guān)注一下Python標(biāo)準(zhǔn)庫模塊名和文件名。例如,如果有一個模塊的代碼中的命名email.py,只是email.py模塊和Python標(biāo)準(zhǔn)庫中的名字。)

上述問題更為復(fù)雜。例如,當(dāng)導(dǎo)入模塊A時,如果模塊A試圖在Python標(biāo)準(zhǔn)庫中導(dǎo)入模塊B,但您定義了一個同名的模塊B,模塊A將錯誤地將您的自定義模塊B替換為Python標(biāo)準(zhǔn)庫中的模塊B。這是一個嚴(yán)重的錯誤,因為程序員很難意識到它是由命名沖突引起的。

因此,Python程序員應(yīng)該注意避免與Python標(biāo)準(zhǔn)庫模塊的命名沖突。畢竟,修改自己模塊的名稱比修改標(biāo)準(zhǔn)庫的名稱要容易得多!當(dāng)然,您還可以編寫一個Python改進(jìn)建議(Python增強(qiáng)建議,PEP),用于修改標(biāo)準(zhǔn)庫的名稱。

常見錯誤9:不熟悉python2和Python3之間的差異

首先看代碼在叫foo.py文件:

進(jìn)口系統(tǒng)定義的酒吧(我):如果我= = 1:提高KeyError(1)如果我= = 2(2):提高ValueError DEF壞(nonetry:):E =酒吧(int(sys. argv [ 1 ]))除了KeyError E:打?。P(guān)鍵錯誤”)作為除ValueError E:打?。◣胖嫡`差)打?。‥(壞))

在Python 2中,上述代碼正常運行。

Python 1key錯誤值1美元美元叫foo.py Python叫foo.py 2value 2

但在Python 3中運行時:

1key Python3美元叫foo.py errortraceback(最后調(diào)用):文件“foo。PY”,19行,叫foo.py;”、“,”*(”)、“17”、“于”、“于”、“

發(fā)生了什么事?結(jié)果表明,在Python 3中,除了代碼塊操作區(qū)域外,不能訪問異常對象。(原因是Python 3將循環(huán)引用保存在內(nèi)存堆棧中,直到垃圾收集器在垃圾收集器運行之后在內(nèi)存中清除。)

更多內(nèi)容,請戳:

http:/ /文檔。Python。org / 3 /參考/ compound_stmts HTML #除外。

一種解決方案是,在除代碼塊的范圍之外,可以通過對異常對象的引用來訪問異常對象。以下是處理代碼和運行結(jié)果python2和Python3是一致的:

進(jìn)口系統(tǒng)定義的酒吧(我):如果我= = 1:提高KeyError(1)如果我= = 2(2):提高ValueError DEF好(nonetry:):例外=酒吧(int(sys. argv [ 1 ]))除了KeyError E:例外= E打?。P(guān)鍵錯誤”)除了E = E:ValueError異常打?。◣胖嫡`差)打?。ɡ猓ê玫模?/p>

再次,在Python3運行代碼:

1key錯誤值1美元美元叫foo.py Python3 Python3叫foo.py 2value 2

問題解決了!

更多關(guān)于python2和Python3的區(qū)別,請戳:

http:/ / toptal。COM / Python #招聘指南

常見錯誤10:_del_誤用的方法

假設(shè)文件名為mod.py有以下代碼:

進(jìn)口fooclassbar(對象):…DEF __del__(自我):foo.cleanup(自我。myhandle)

那么,你想在another_mod.py文件做如下:

進(jìn)口modmybar = MOD吧()。

如果你嘗試運行another_mod.py,會有一個意思是例外。

為什么?因為當(dāng)Python解釋器關(guān)閉時,模塊全局變量的值設(shè)置為。因此,在上面的例子中,當(dāng)__del__函數(shù)被調(diào)用foo的值已經(jīng)沒有。

有關(guān)Python解釋器的更多信息,請蓋章:

https://mail.python.org/pipermail/python-bugs-list/2009-january/069209.html

調(diào)用atexit.register()函數(shù)可以解決以上Python高階編程問題。atexit.register()函數(shù)調(diào)用后,當(dāng)你的代碼運行時,它將運行解釋器關(guān)閉之前。

利用上述方法,修改后的mod.py文件如下:

進(jìn)...

神級程序員把Python2和3當(dāng)中最常見的問題都收集了!很全面的總結(jié) 企業(yè)視頻課程

img

小魔女

關(guān)注

Mac OSX本身系統(tǒng)自帶Python2.7,但 不建議直接使用、刪除和更改 ,因為可能有些程序是需要依賴系統(tǒng)自帶的python 2.*,盲目修改后可能會導(dǎo)致系統(tǒng)產(chǎn)生未知錯誤。

所以建議在 不修改系統(tǒng)的python條件下 搭建Python雙版本環(huán)境。在給大家分享之前呢,小編推薦一下一個挺不錯的交流寶地,里面都是一群熱愛并在學(xué)習(xí)Python的小伙伴們,大幾千了吧,各種各樣的人群都有,特別喜歡看到這種大家一起交流解決難題的氛圍,群資料也上傳了好多,各種大牛解決小白的問題,這個Python群:330637182 歡迎大家進(jìn)來一起交流討論,一起進(jìn)步,盡早掌握這門Python語言。

Mac OSX在系統(tǒng)自帶的python之外,可以 安裝Python2.7和Python3.5/3.6版本 ,并且雙版本兼容。

本文下方,防止原文鏈接失效】

在參考的安裝流程中,我發(fā)現(xiàn)了一些問題并進(jìn)行了解決,列出問題及解決方法如下:

1.Python2.7安裝后,按原文博主的安裝方法無法修改系統(tǒng)默認(rèn)的Python命令為自己安裝Python路徑和版本:

解決方法:

打開系統(tǒng)配置文件:

vi ~/.bash_profile

添加入自己的安裝的Python2.7的路徑地址:

PATH="/usr/local/Cellar/python/2.7.14/bin:${PATH}"

讓PATH變量生效:

source ~/.bash_profile

我們看到,命令行輸入 which python2.7 時,路徑地址改變,不再是系統(tǒng)默認(rèn)地址:

python2.7

我們前往路徑地址修改添加 python

文件:(復(fù)制一個python2.7然后重命名為python即可)

前往路徑地址修改添加`python`文件

這樣默認(rèn)的python即修改為我們所安裝的python2.7版本,而非系統(tǒng)自帶的python路徑,命令行輸入 which python

查看:

查看所安裝的python2.7版本

這樣,我們就將系統(tǒng)的默認(rèn)python命令鏈接到了我們所安裝的python目錄下,而非系統(tǒng)自帶的python路徑。

2.Python2.7和Python3.6安裝后,pip2和pip3下載的包仍在Mac OSX系統(tǒng)自帶的Python2.7的包目錄下,而非Python2.7和Python3.6的安裝目錄:

問題圖示如下:

pip的version都是系統(tǒng)自帶python的包下載路徑:

pip的version都是系統(tǒng)自帶python的路徑

pip的路徑都是系統(tǒng)自帶python的路徑,而非我們的安裝路徑:

python的路徑

添加入自己的安裝的Python2.7和Python3.6的路徑地址:

我們看到,命令行輸入 which pip 和 pip --version 時,pip的路徑地址改變,pip下載的包的地址也改變,不再是系統(tǒng)默認(rèn)地址:

pip版本顯示

這樣,即可保證使用pip下載的包路徑正確,且和我們所安裝的兩個版本python分別對應(yīng)。

3.Pip總是不能正常下載包,安裝模塊包ConnectTimeoutError錯誤:

我們在使用pip無法正常下載包的時候可以使用國內(nèi)鏡像服務(wù),如用豆瓣的源下載安裝 selenium 包:

pip install selenium -i http://pypi.douban/simple --trusted-host pypi.douban

如果是要給python3下載依賴,注意pip和python版本對應(yīng),同理:

pip3 install selenium -i http://pypi.douban/simple --trusted-host pypi.douban

這樣,即可正常的使用pip來下載安裝包了。

安裝流程

主要就這幾個步驟而已,不會太困難的(或許有些你本來就裝好了)

Step 2 安裝套件管理工具Homebrew

Step 4 設(shè)定路徑$PATH(不跟系統(tǒng)Python 打架)

Step 5 完成啰!確認(rèn)安裝結(jié)果~

Step 1 安裝Xcode

可以到App Store搜尋Xcode并安裝安裝好了之后就把Xcode打開~第一次開啟的時候會需要同意他的License Agreement之類的東西。然后到terminal輸入來安裝Xcode command line tool:

xcode-select--install

安裝Xcode 就到此結(jié)束啰,要進(jìn)入下一個步驟了!

Step 2安裝套件管理工具: Homebrew

可以到官網(wǎng)或是在terminal 里貼上:

ruby-e"$(curl -fsSL https://raw.githubusercontent/Homebrew/install/master/install)"

安裝好后可以跑一下

brew doctor

如果出現(xiàn)

Your system is ready to brew.

代表萬事OK,那如果有Warning的話,也不用太擔(dān)心,可以按照里面的步驟去修正就好啰!

如果有出現(xiàn)Warning的話,雖然會在上面看到一句

If everything you use Homebrew for is working fine: please don't worry and just ignore them.

不過還是建議大家把東西裝好,才不會到時候忘記自己到底什么東西還沒設(shè)定好。

Step 3 安裝Python

接下來要正式進(jìn)入安裝Python的步驟了!

首先,輸入

python --version

天哪!都還沒開始裝Python,電腦里面怎么已經(jīng)有了?

這是Mac系統(tǒng)要使用的Python,所以平常沒適不要去亂動比較好??!

所以現(xiàn)在我們要用homebrew來安裝平??梢裕▉y搞?)使用的Python。

利用homebrew 搜尋Python

brew search python

這時候,會看到python和python3。

因為我已經(jīng)裝了,所以旁邊會寫(installed)。要安裝Python啰!

brew install python

這樣就開始安裝了。

裝完之后在輸入

brew install python3

在安裝的時候,Python 會被安裝在

/usr/local/Cellar

那就來看看這個資料夾吧

open /usr/local/Cellar/

就可以看到你正在安裝的Python出現(xiàn)了!

除了Python之外,也有可能會裝一些其他的東西,例如sqlite。

總之,不用太擔(dān)心,homebrew會自己搞定。

(因為我裝了很多哩哩摳摳,所以你的資料夾里可能不會有這么多東西)

什么是路徑$PATH 呢?

還記得我們在裝Python的時候,輸入了brew,

系統(tǒng)就自動會知道要開始跑homebrew。

系統(tǒng)到底怎么知道我們的brew在哪里?

這就是$PATH的用途了!

echo $PATH

接下來就會看到一串類似這樣的東西

/usr/bin**:**/bin**:**/usr/sbin**:**/sbin**:**/usr/local/bin

分號(:)是 分隔 的意思

所以當(dāng)你在terminal里面輸入brew時

系統(tǒng)就會開始從/usr/bin找起

如果在/usr/bin里面找不到的話

就會往下一個/bin去搜尋,以此類推

現(xiàn)在,我們回到資料夾去看

brew其實就在/usr/local/bin里面!

所以現(xiàn)在的問題就是,系統(tǒng)在/usr/bin里面也有一份Python

現(xiàn)在我們在/usr/local/Cellar里面也裝了Python

這樣在terminal打上python指令時,誰會被開啟呢?

因為路徑有 順序 ,所以它會先找到系統(tǒng)的Python

現(xiàn)在就要來解決這個問題

sudo emacs/etc/paths

sudo讓我們?nèi)〉霉芾韱T權(quán)限

用emacs這個程式編輯路徑檔案

terminal會要求輸入密碼

(就是平常裝東西也需要輸入的密碼)現(xiàn)在要把/usr/local/bin移到上面去control + k:把一行字剪下來control + y:把字貼上control + x + s:存檔control + x + c:關(guān)掉emacs

這時,再打一次

為什么沒有變???

因為要 開一個新的terminal 才會更新??!

開新式窗后再輸入一次就會看到我們剛剛修改的結(jié)果了。

這樣就完成啰!

其實python3本身比較不會跟其他人打架

因為他就是獨立的python3

所以我們主要是要確認(rèn)是不是讀到我們用brew裝的python

which python

這時候看到

/usr/local/bin/python

再來看看python3 吧

which python3

應(yīng)該會是

/usr/local/bin/python3

就代表讀到剛剛裝好的python啰!

當(dāng)然如果你要跑系統(tǒng)本身的python

(應(yīng)該是用不到啦~)

就輸入

/usr/bin/python

總之就是…大功告成啰!

謝謝閱讀!原文鏈接:

企業(yè)里Python2和3哪個用的多?為什么? 企業(yè)視頻課程

img

卜連虎

關(guān)注

python2和python3的差異

如果你是一個初學(xué)者,或許你曾經(jīng)觸摸過其他的編程言語,你可能不知道,在開端學(xué)習(xí)python的時分都會遇到一個比較讓人很頭疼的問題:版別問題??!是學(xué)習(xí)python2 仍是學(xué)習(xí) python3 ?這是十分讓人糾結(jié)的!

查找一下便會發(fā)現(xiàn)python3 和 python2 是不兼容的,并且差異比較大,究竟學(xué)習(xí)哪個版別呢?

所以先學(xué) Python2 仍是 Python3 都不是問題,或許說都是問題??墒乾F(xiàn)在總算不必糾結(jié)這個問題了!哈哈,好開心

因為一個開發(fā)者已經(jīng)發(fā)布了一個網(wǎng)站來倒計時Python 2.7的“退休”。

能夠看出,Python 2.7有望在兩年后退休。

開發(fā)商表明,因為官方的日期沒有發(fā)布,估計Python 2.7會在2020年4月12日退休,這是時刻的時分,pycon將舉辦。

Python 2,感謝您多年的忠誠服務(wù)。

巨蟒3,現(xiàn)在你在舞臺上。

Python 2.7是2 x系列的最終一個版別。它的繼任者Python 3在2008年12月發(fā)布,但它與2。X系列不兼容。3的3的特征和語法被移植回2.6和2.7。2.7的支撐時刻至少為10年,并將在2020之前供給過錯批改。

怎么轉(zhuǎn)換為Python 3?

如果您的主代碼仍然根據(jù)Python 2,這是完全能夠了解的。最流行的包PyPI上現(xiàn)在能夠運轉(zhuǎn)在Python 2和Python 3,添加更多的日常。為了簡化轉(zhuǎn)換,官方搬遷指南供給了在Python 3中運轉(zhuǎn)Python 2代碼的主張。

所以我主張:

1. 如果是你在企業(yè)中,需求用到python而學(xué)習(xí)python的話,那就要看企業(yè)的使用python的版別進(jìn)行學(xué)習(xí);

2. 如果想要更多的老練解決方案,最少的bug,最安穩(wěn)的使用那就用python2 ;

3. 如果你是在讀大學(xué)的學(xué)生,那我主張你學(xué)習(xí)python3,比及結(jié)業(yè)的時分或許python已經(jīng)成為了干流。

另外,選2仍是3一般都是編程小白才會考慮??紤]的起點是作為一個初學(xué)者,有時候在學(xué)習(xí)的過程中會出現(xiàn)一些問題或者會參考一些項目去學(xué)習(xí),這個時候會想一下,2是干流或者是3。已然剛學(xué)何不找個干流的。其實不管是2仍是3,只需照這一個學(xué),就可以了。中心的差異在學(xué)習(xí)的時候也能更好的去加深一些形象

img

在線咨詢

建站在線咨詢

img

微信咨詢

掃一掃添加
動力姐姐微信

img
img

TOP