成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Python老司機也會翻車!10個最容易犯的Python開發錯誤

開發 后端
在平時的工作中,Python開發者很容易犯一些小錯誤,這些錯誤都很容易避免,大講臺老師總結了Python開發者最常犯的10個錯誤,一起來看下,不知你中槍了沒有。

[[206764]]

Python是一門簡單易學的編程語言,語法簡潔而清晰,并且擁有豐富和強大的類庫。與其它大多數程序設計語言使用大括號不一樣 ,它使用縮進來定義語句塊。

在平時的工作中,Python開發者很容易犯一些小錯誤,這些錯誤都很容易避免,大講臺老師總結了Python開發者最常犯的10個錯誤,一起來看下,不知你中槍了沒有。

(一)濫用表達式作為函數參數默認值

Python允許開發者指定一個默認值給函數參數,雖然這是該語言的一個特征,但當參數可變時,很容易導致混亂,例如,下面這段函數定義:

 

在上面這段代碼里,一旦重復調用foo()函數(沒有指定一個bar參數),那么將一直返回'bar',因為沒有指定參數,那么foo()每次被調用的時候,都會賦予[]。下面來看看,這樣做的結果:

 

解決方案:

 

(二)錯誤地使用類變量

先看下面這個例子:

 

這樣是有意義的:

 

再來一遍:

 

僅僅是改變了A.x,為什么C.x也跟著改變了。

在Python中,類變量都是作為字典進行內部處理的,并且遵循方法解析順序(MRO)。在上面這段代碼中,因為屬性x沒有在類C中發現,它會查找它的基類(在上面例子中只有A,盡管Python支持多繼承)。換句話說,就是C自己沒有x屬性,獨立于A,因此,引用 C.x其實就是引用A.x。

(三)為異常指定不正確的參數

假設代碼中有如下代碼:

 

問題在這里,except語句并不需要這種方式來指定異常列表。然而,在Python 2.x中,except Exception,e通常是用來綁定異常里的 第二參數,好讓其進行更進一步的檢查。因此,在上面這段代碼里,IndexError異常并沒有被except語句捕獲,異常***被綁定 到了一個名叫IndexError的參數上。

在一個異常語句里捕獲多個異常的正確方法是指定***個參數作為一個元組,該元組包含所有被捕獲的異常。與此同時,使用as關鍵字來保證***的可移植性,Python 2和Python 3都支持該語法。

 

(四)誤解Python規則范圍

Python的作用域解析是基于LEGB規則,分別是Local、Enclosing、Global、Built-in。實際上,這種解析方法也有一些玄機,看下面這個例子:

 

許多人會感動驚訝,當他們在工作的函數體里添加一個參數語句,會在先前工作的代碼里報UnboundLocalError錯誤( 點擊這里查看更詳細描述)。

在使用列表時,開發者是很容易犯這種錯誤的,看看下面這個例子:

 

為什么foo2失敗而foo1運行正常?

答案與前面那個例子是一樣的,但又有一些微妙之處。foo1沒有賦值給lst,而foo2賦值了。lst += [5]實際上就是lst = lst + [5],試圖給lst賦值(因此,假設Python是在局部作用域里)。然而,我們正在尋找指定給lst的值是基于lst本身,其實尚未確定。

(五)修改遍歷列表

下面這段代碼很明顯是錯誤的: 

 

在遍歷的時候,對列表進行刪除操作,這是很低級的錯誤。稍微有點經驗的人都不會犯。

對上面的代碼進行修改,正確地執行: 

 

(六)如何在閉包中綁定變量

看下面這個例子:

 

你期望的結果是:

 

實際上:

 

是不是非常吃驚!出現這種情況主要是因為Python的后期綁定行為,該變量在閉包中使用的同時,內部函數又在調用它。

解決方案:

 

(七)創建循環模塊依賴關系

假設有兩個文件,a.py和b.py,然后各自導入,如下:

在a.py中:

 

在b.py中:

 

首先,讓我們試著導入a.py: 

 

可以很好地工作,也許你會感到驚訝。畢竟,我們確實在這里做了一個循環導入,難道不應該有點問題嗎?

僅僅存在一個循環導入并不是Python本身問題,如果一個模塊被導入,Python就不會試圖重新導入。根據這一點,每個模塊在試圖訪問函數或變量時,可能會在運行時遇到些問題。

當我們試圖導入b.py會發生什么(先前沒有導入a.py):

 

出錯了,這里的問題是,在導入b.py的過程中還要試圖導入a.py,這樣就要調用f(),并且試圖訪問b.x。但是b.x并未被定義。

可以這樣解決,僅僅修改b.py導入到a.py中的g()函數:

 

無論何時導入,一切都可以正常運行:

 

(八)與Python標準庫模塊名稱沖突

Python擁有非常豐富的模塊庫,并且支持“開箱即用”。因此,如果不刻意避免,很容易發生命名沖突事件。例如,在你的代碼中可能有一個email.py的模塊,由于名稱一致,它很有可能與Python自帶的標準庫模塊發生沖突。

(九)未按規定處理Python2.x和Python3.x之間的區別

看一下foo.py:

 

在Python 2里面可以很好地運行:

 

但是在Python 3里:

 

解決方案:

 

在Py3k中運行結果:

 

在 Python招聘指南里有許多關于Python 2與Python 3在移植代碼時需要關注的注意事項與討論,大家可以前往看看。

(10)濫用__del__方法

比如這里有一個叫mod.py的文件:

 

下面,你在another_mod.py文件里執行如下操作:

 

你會獲得一個AttributeError異常。

當解釋器關閉時,該模塊的全局變量全部設置為None。因此,在上面這個例子里,當__del__被調用時,foo已經全部被設置為None。

一個很好的解決辦法是使用atexit.register()代替。順便說一句,當程序執行完成后,您注冊的處理程序會在解釋器關閉之前停止 工作。

修復上面問題的代碼:

 

在程序的正常終止的前提下,這個實現提供了一個整潔可靠的方式調用任何需要清理的功能。

總結

Python是一款強大而靈活的編程語言,并且帶有許多機制和模式來大大提高工作效率。正如任何一門語言或軟件工具一樣,人們對其能力都會存在一個限制性地理解或欣賞,有些是弊大于利,有些時候反而會帶來一些陷阱。 

責任編輯:龐桂玉 來源: 馬哥Linux運維
相關推薦

2011-05-31 15:38:37

CSS

2011-04-18 12:55:04

JavaScript開發者

2022-10-28 19:00:00

Python

2018-04-04 09:55:18

語言PHP易犯錯誤

2022-05-17 09:32:24

Bash編程Linux

2019-12-23 08:48:24

Java技術全局變量

2012-08-31 10:09:04

用戶體驗錯誤初創團隊

2012-09-21 14:02:36

創業創業團隊用戶體驗

2009-07-10 09:20:11

IT人才經驗談

2016-11-02 12:56:58

Linux新手錯誤

2019-04-24 08:56:34

Java開發人員常犯錯誤

2022-06-28 10:13:09

Pandas錯誤Python

2025-06-10 03:00:00

2011-07-06 08:49:05

程序員

2012-06-18 09:20:38

亞馬遜云服務Amazon

2020-03-30 15:12:27

Python開發錯誤

2015-08-26 10:00:31

獨立游戲cp錯誤

2018-02-01 08:50:51

IT培訓Google AnalAPI

2023-07-19 11:19:37

AI項目人工智能

2018-09-29 16:10:02

編程語言Java程序員
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 中文字幕 在线观看 | 青青久久| 天天综合永久 | 国产精品免费大片 | 亚洲综合视频 | 久久久久久久一区 | 国产精品大片在线观看 | 日韩欧美在线播放 | 国产精品网页 | www.青青草 | 久久久久国产一区二区三区 | 国产精品美女久久久久aⅴ国产馆 | 在线视频a| 成年人黄色小视频 | 精品一区在线 | 成人国产精品色哟哟 | 性高湖久久久久久久久3小时 | 97色综合 | 久久国产欧美一区二区三区精品 | 在线播放中文字幕 | 国产精品美女久久久久久免费 | 日韩专区中文字幕 | 手机av在线 | 久久久久久国产精品免费免费 | 国产免费福利小视频 | 日本欧美国产 | 国产精品久久精品 | 久久这里有精品 | 日本黄视频在线观看 | 精品国产一区二区三区在线观看 | 久久久久久久久中文字幕 | 澳门永久av免费网站 | 久久久久久国产精品 | 欧美国产亚洲一区二区 | 国产欧美在线 | 一区二区三区在线观看免费视频 | 国产精品久久久久久久久久三级 | 国产精品久久久久久久久免费相片 | 国产中文字幕在线 | 久久这里有精品 | 精品欧美乱码久久久久久 |