色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

Python開發者最容易忽略的10個要點

454398 ? 來源:CSDN編譯 ? 作者:toptal ? 2021-01-02 10:13 ? 次閱讀

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

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

1.濫用表達式作為函數參數默認值

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

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

解決方案:
>>> 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.錯誤地使用類變量

先看下面這個例子:
>>> class A(object):
... x = 1
...
>>> class B(A):
... pass
...
>>> class C(A):
... pass
...
>>> print A.x, B.x, C.x
1 1 1

這樣是有意義的:
>>> B.x = 2
>>> print A.x, B.x, C.x
1 2 1

再來一遍:
>>> A.x = 3
>>> print A.x, B.x, C.x
3 2 3

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

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

3.為異常指定不正確的參數

假設代碼中有如下代碼:
>>> try:
... l = ["a", "b"]
... int(l[2])
... except ValueError, IndexError: # To catch both exceptions, right?
... pass
...
Traceback (most recent call last):
File "", line 3, in
IndexError: list index out of range

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

在一個異常語句里捕獲多個異常的正確方法是指定第一個參數作為一個元組,該元組包含所有被捕獲的異常。與此同時,使用as關鍵字來保證最大的可移植性,Python 2和Python 3都支持該語法。
>>> try:
... l = ["a", "b"]
... int(l[2])
... except (ValueError, IndexError) as e:
... pass
...
>>>

4.誤解Python規則范圍

Python的作用域解析是基于LEGB規則,分別是Local、Enclosing、Global、Built-in。實際上,這種解析方法也有一些玄機,看下面這個例子:
>>> x = 10
>>> def foo():
... x += 1
... print x
...
>>> foo()
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in foo
UnboundLocalError: local variable 'x' referenced before assignment

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

在使用列表時,開發者是很容易犯這種錯誤的,看看下面這個例子:
>>> lst = [1, 2, 3]
>>> def foo1():
... lst.append(5) # This works ok...
...
>>> foo1()
>>> lst
[1, 2, 3, 5]

>>> lst = [1, 2, 3]
>>> def foo2():
... lst += [5] # ... but this bombs!
...
>>> foo2()
Traceback (most recent call last):
File "", line 1, in
File "", line 2, in foo
UnboundLocalError: local variable 'lst' referenced before assignment

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

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

5.修改遍歷列表

下面這段代碼很明顯是錯誤的:
>>> odd = lambda x : bool(x % 2)
>>> numbers = [n for n in range(10)]
>>> for i in range(len(numbers)):
... if odd(numbers[i]):
... del numbers[i] # BAD: Deleting item from a list while iterating over it
...
Traceback (most recent call last):
File "", line 2, in
IndexError: list index out of range

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

對上面的代碼進行修改,正確地執行:
>>> 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]

6.如何在閉包中綁定變量

看下面這個例子:

>>> def create_multipliers():
... return [lambda x : i * x for i in range(5)]
>>> for multiplier in create_multipliers():
... print multiplier(2)
...

你期望的結果是:
0
2
4
6
8

實際上:
8
8
8
8
8

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

解決方案:
>>> def create_multipliers():
... return [lambda x, i=i : i * x for i in range(5)]
...
>>> for multiplier in create_multipliers():
... print multiplier(2)
...
0
2
4
6
8

7.創建循環模塊依賴關系

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

在a.py中:
import b

def f():
return b.x

print f()

在b.py中:
import a

x = 1

def g():
print a.f()

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

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

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

當我們試圖導入b.py會發生什么(先前沒有導入a.py):
>>> import b
Traceback (most recent call last):
File "", line 1, in
File "b.py", line 1, in
import a
File "a.py", line 6, in
print f()
File "a.py", line 4, in f
return b.x

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

可以這樣解決,僅僅修改b.py導入到a.py中的g()函數:
x = 1
def g():
import a # This will be evaluated only when g() is called
print a.f()

無論何時導入,一切都可以正常運行:
>>> import b
>>> b.g()
1 # Printed a first time since module 'a' calls 'print f()' at the end
1 # Printed a second time, this one is our call to 'g'

8.與Python標準庫模塊名稱沖突

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

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

看一下foo.py:
import sys

def bar(i):
if i == 1:
raise KeyError(1)
if i == 2:
raise ValueError(2)

def bad():
e = None
try:
bar(int(sys.argv[1]))
except KeyError as e:
print('key error')
except ValueError as e:
print('value error')
print(e)

bad()

在Python 2里面可以很好地運行:
$ python foo.py 1
key error
1
$ python foo.py 2
value error
2

但是在Python 3里:
$ python3 foo.py 1
key error
Traceback (most recent call last):
File "foo.py", line 19, in
bad()
File "foo.py", line 17, in bad
print(e)
UnboundLocalError: local variable 'e' referenced before assignment

解決方案:
import sys

def bar(i):
if i == 1:
raise KeyError(1)
if i == 2:
raise ValueError(2)

def good():
exception = None
try:
bar(int(sys.argv[1]))
except KeyError as e:
exception = e
print('key error')
except ValueError as e:
exception = e
print('value error')
print(exception)

good()

在Py3k中運行結果:
$ python3 foo.py 1
key error
1
$ python3 foo.py 2
value error
2

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

10.濫用__del__方法

比如這里有一個叫mod.py的文件:
import foo
class Bar(object):
...
def __del__(self):
foo.cleanup(self.myhandle)

下面,你在another_mod.py文件里執行如下操作:
import mod
mybar = mod.Bar()

你會獲得一個AttributeError異常。

至于為什么會出現該異常,點擊這里查看詳情。當解釋器關閉時,該模塊的全局變量全部設置為None。因此,在上面這個例子里,當__del__被調用時,foo已經全部被設置為None。

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

修復上面問題的代碼:
import foo
import atexit

def cleanup(handle):
foo.cleanup(handle)

class Bar(object):
def __init__(self):
...
atexit.register(cleanup, self.myhandle)

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

總結
Python是一款強大而靈活的編程語言,并且帶有許多機制和模式來大大提高工作效率。正如任何一門語言或軟件工具一樣,人們對其能力都會存在一個限制性地理解或欣賞,有些是弊大于利,有些時候反而會帶來一些陷進。 體會一名語言的細微之處,理解一些常見的陷阱,有助于你在開發者的道路上走的更遠。

編輯:hfy


聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 編程語言
    +關注

    關注

    10

    文章

    1945

    瀏覽量

    34767
  • python
    +關注

    關注

    56

    文章

    4797

    瀏覽量

    84742
收藏 人收藏

    評論

    相關推薦

    在人群里,看見鯤鵬開發者

    鯤鵬開發者,我們身邊的《頭號玩家》——
    的頭像 發表于 12-30 09:21 ?209次閱讀
    在人群里,看見鯤鵬<b class='flag-5'>開發者</b>

    云端AI開發者工具怎么用

    云端AI開發者工具通常包括代碼編輯器、模型訓練平臺、自動化測試工具、代碼管理工具等。這些工具不僅降低了AI開發的門檻,還極大地提高了開發效率和模型性能。下面,AI部落小編為您介紹云端AI開發者
    的頭像 發表于 12-05 13:31 ?137次閱讀

    AI驅動智慧未來,2024 TUYA全球開發者大會(中東)圓滿落幕

    2024年10月17日,涂鴉智能聯手阿里云共同舉辦的TUYA全球開發者大會在迪拜正式召開。這是涂鴉開發者大會首次落地中東,涂鴉攜手海內外行業領袖,為開發者帶來了前瞻的行業視野與實踐經驗
    的頭像 發表于 10-19 08:05 ?329次閱讀
    AI驅動智慧未來,2024 TUYA全球<b class='flag-5'>開發者</b>大會(中東)圓滿落幕

    KaihongOS 4.1.2開發者預覽版正式上線,誠邀開發者免費試用!

    深開鴻在2024開放原子開源生態大會上正式宣布KaihongOS4.1.2開發者預覽版全面上線,并向全球開發者開放免費下載。作為KaihongOS不斷創新與發展的重要里程碑,此次預覽版為開發者提供了
    的頭像 發表于 09-28 08:07 ?344次閱讀
    KaihongOS 4.1.2<b class='flag-5'>開發者</b>預覽版正式上線,誠邀<b class='flag-5'>開發者</b>免費試用!

    KaihongOS 4.1.2開發者預覽版正式上線,誠邀開發者免費試用!

    今日,深開鴻在2024開放原子開源生態大會上正式宣布KaihongOS 4.1.2開發者預覽版全面上線,并向全球開發者開放免費下載。作為KaihongOS不斷創新與發展的重要里程碑,此次預覽版為
    的頭像 發表于 09-26 15:59 ?468次閱讀

    2024年上海海思MCU開發者體驗官招募,手機/MatePad大獎等你拿!

    報名信息,報名提交后無法修改報名信息。開發者對所提交的報名信息真實性負責,如果報名信息不完整/報名信息作假,則報名無效; 2)沒有海思賬號的開發者需先注冊海思賬號才能提交報名,每個開發者僅限一
    發表于 08-02 17:29

    華為云開發者桌面全新發布 CodeArts IDE for Python,極致優雅云原生開發體驗

    近日,華為云正式發布 CodeArts IDE for Python,這是一款內置華為自研 Python 語言服務,提供智能編程、靈活調試能力的可擴展桌面開發工具,為華為云開發者提供卓
    的頭像 發表于 05-10 00:27 ?1247次閱讀
    華為云<b class='flag-5'>開發者</b>桌面全新發布 CodeArts IDE for <b class='flag-5'>Python</b>,極致優雅云原生<b class='flag-5'>開發</b>體驗

    機智云開發者中心:讓移動APP應用開發更智能化

    在移動應用市場的蓬勃發展中,開發者們面臨著不斷提高效率和創新的挑戰。為了幫助開發者更好地實現移動應用開發的目標,機智云物聯網的新版開發者中心,通過自動生成移動APP應用的功能,讓應用
    的頭像 發表于 03-26 16:45 ?346次閱讀
    機智云<b class='flag-5'>開發者</b>中心:讓移動APP應用<b class='flag-5'>開發</b>更智能化

    曙光智能計算開發者講壇于2024全球開發者先鋒大會期間在上海成功舉辦

    3月24日,曙光智能計算開發者講壇于2024全球開發者先鋒大會期間在上海成功舉辦。
    的頭像 發表于 03-26 09:42 ?622次閱讀

    Android 15的首個開發者預覽版現已發布

    Android 15 的首個開發者預覽版現已發布,以便各位開發者能與我們通力協作,打造更優秀的 Android 平臺。
    的頭像 發表于 03-12 14:16 ?933次閱讀
    Android 15的首個<b class='flag-5'>開發者</b>預覽版現已發布

    源碼開放,開發者手機 buff 疊滿

    開發者手機開源代碼編譯指導 編譯環境建議: ubuntu20.04 Linux 系統內存:最低 16G Pyhon 3.8 安裝必要工具: sudo apt-get update sudo
    發表于 03-04 14:29

    鴻蒙開發者預覽版如何?

    在24年的華為鴻蒙發布會中表示。預覽版已經向開發者開放申請,首批支持的機型有三款分別為華為 Mate 60、華為Mate 60 Pro、華為Mate X5。 其HarmonyOS NEXT去除
    發表于 02-17 21:54

    鴻蒙系統優缺點,能否作為開發者選擇

    星河版已經是純血鴻蒙,但是它的發展一些周期。生態圈的建立難度大,各大廠商加入鴻蒙原生開發需要時間累積。 鴻蒙開發人才空缺,由于鴻蒙作為一款新型的系統,程序員們都是從0學起。所以市面上很少有鴻蒙開發者
    發表于 02-16 21:00

    華為宣布HarmonyOS NEXT鴻蒙星河版開發者預覽面向開發者開放申請

    華為宣布HarmonyOS NEXT鴻蒙星河版開發者預覽面向開發者開放申請,這意味著鴻蒙生態進入第二階段,將加速千行百業的應用鴻蒙化。
    的頭像 發表于 01-29 16:42 ?1429次閱讀
    華為宣布HarmonyOS NEXT鴻蒙星河版<b class='flag-5'>開發者</b>預覽面向<b class='flag-5'>開發者</b>開放申請

    您有一份OpenHarmony開發者論壇2023年度總結,請查收~

    。 截至 2023 年 12 月,OpenHarmony 開發者論壇注冊用戶突破 **5000+**人,總共收到了 **790+**次技術提問和 **1460+**次回答,其中有 **460+**回答
    發表于 01-26 17:27
    主站蜘蛛池模板: 亚洲麻豆精品成人A在线观看| WWW夜片内射视频在观看视频| 国产精品久久毛片A片软件爽爽| 无码专区久久综合久综合字幕 | 色婷婷综合久久久久中文一区二区| YELLOW高清视频免费观看| 日本夜夜夜| 韩国伦理片2018在线播放免费观看 | 最新中文字幕在线视频| 青草在线在线d青草在线| 国产欧美亚洲综合第一页| 在线免费观看成年人视频| 日本久久久久久久做爰片日本| 国产主播福利一区二区| 99在线国产视频| 亚洲精品一二三| 欧美精品AV一区二区无码| 国产在线播放精品视频| 99视频一区| 亚洲人成电影网站| 秋霞伦理手机在线看片| 久久re视频这里精品09免费| 北原多香子qvod| 一二三四在线播放免费观看中文版视频| 欧美老妇与zozoz0交| 精品少妇爆AV无码专区| 成人网视频在线观看免费| 一级大乳奶| 手机观看毛片| 欧美阿v在线天堂| 久久精品国产亚洲AV蜜臀| 国产成人精品男人免费| 97干97吻| 亚洲一区二区女搞男| 乳色吐息未增删樱花ED在线观看| 久久久久综合网| 国产一区二区三区内射高清| 扒开美女的内衣亲吻漫画| 最新国产麻豆精品| 夜色资源站国产www在线视频| 思思re热免费精品视频66|