中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久

python程序員開發中常犯的10個錯誤
來源:易賢網 閱讀:1724 次 日期:2016-06-30 09:34:57
溫馨提示:易賢網小編為您整理了“python程序員開發中常犯的10個錯誤”,方便廣大網友查閱!

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 <stdin>, line 3, in <module>

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 <stdin>, line 1, in <module>

  file <stdin>, 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 <stdin>, line 1, in <module>

  file <stdin>, 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 <stdin>, line 2, in <module>

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 <stdin>, line 1, in <module>

     file b.py, line 1, in <module>

    import a

     file a.py, line 6, in <module>

 print f()

     file a.py, line 4, in f

 return b.x

attributeerror: 'module' object has no attribute '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 <module>

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

更多信息請查看腳本欄目
易賢網手機網站地址:python程序員開發中常犯的10個錯誤
由于各方面情況的不斷調整與變化,易賢網提供的所有考試信息和咨詢回復僅供參考,敬請考生以權威部門公布的正式信息和咨詢為準!

2026上岸·考公考編培訓報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關于我們 | 聯系我們 | 人才招聘 | 網站聲明 | 網站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網安備53010202001879號 人力資源服務許可證:(云)人服證字(2023)第0102001523號
云南網警備案專用圖標
聯系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權所有:易賢網
云南網警報警專用圖標
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
亚洲国产欧美日韩另类综合| 亚洲美女精品成人在线视频| 国产精品手机在线| 亚洲日本中文字幕| 亚洲电影免费在线观看| 欧美激情视频网站| 午夜伦欧美伦电影理论片| 亚洲风情在线资源站| 国产精品久久久久三级| 久久午夜色播影院免费高清| 国产主播精品| 国产精品国产一区二区| 免费在线日韩av| 亚洲精品五月天| 今天的高清视频免费播放成人 | 蜜桃av噜噜一区| 亚洲精品一线二线三线无人区| 免费久久精品视频| 一区二区日韩| 亚洲第一精品久久忘忧草社区| 国产精品免费视频观看| 欧美国产在线观看| 久久影音先锋| 久久这里有精品视频| 亚洲国产一区二区三区在线播| 亚洲免费观看高清在线观看 | 亚洲精品一区中文| 亚洲国产成人高清精品| 正在播放亚洲一区| 中文在线不卡视频| 免费成人av在线| 国产视频一区在线观看一区免费| 免费在线观看一区二区| 国产专区精品视频| 国产精品成人观看视频国产奇米| 一本久久综合亚洲鲁鲁| 亚洲一区二区三区777| 亚洲网友自拍| 国产精品久久久久久久久久三级 | 午夜亚洲精品| 亚洲日本激情| 亚洲电影免费在线 | 国产精品家教| 欧美日韩精品三区| 欧美天天在线| 亚洲伦理在线观看| 亚洲天堂av电影| 老司机一区二区三区| 欧美日韩国产成人在线| 国产欧美一区二区精品性| 国产一区深夜福利| 日韩亚洲欧美成人一区| 亚洲午夜精品国产| 欧美日韩免费在线观看| 欧美日韩国产在线播放网站| 欧美专区亚洲专区| 欧美区二区三区| 亚洲二区精品| 欧美人与禽性xxxxx杂性| 麻豆精品一区二区综合av| 午夜一区在线| 久久精品国产精品亚洲| 久久久久久久久蜜桃| 欧美一区国产在线| 欧美久久在线| 国产精品美女999| 国产欧美日韩一区二区三区| 国产精品日韩在线播放| 欧美福利专区| 亚洲美洲欧洲综合国产一区| 国产日韩专区在线| 欧美肥婆bbw| 欧美精品一区二| 欧美亚州一区二区三区| 美女精品在线观看| 国产精品高潮呻吟久久| 国模 一区 二区 三区| 亚洲精品国产精品国自产在线| 国产日韩久久| 美国十次成人| 亚洲欧洲精品一区二区三区不卡 | 日韩午夜av| 欧美欧美天天天天操| 99视频精品免费观看| 国产乱人伦精品一区二区| 国产欧美日本一区视频| 影音欧美亚洲| 亚洲国产专区校园欧美| 欧美精品久久久久久久久久| 亚洲久久一区二区| 欧美四级在线观看| 99精品欧美一区二区三区综合在线 | 亚洲黄一区二区| 亚洲在线观看视频网站| 久久久一二三| 国产精品毛片va一区二区三区| 亚洲国产美女精品久久久久∴| 亚洲一区二区三区四区在线观看 | 韩国视频理论视频久久| 在线亚洲电影| 欧美成人免费在线| 91久久综合亚洲鲁鲁五月天| 久久gogo国模裸体人体| 国内精品美女av在线播放| 亚洲欧美日韩精品久久| 国产色综合久久| 免费视频一区| 久久久精品一区二区三区| 亚洲精品乱码久久久久久久久| 欧美日韩亚洲综合一区| 欧美一区二区三区另类| 国产日韩欧美综合| 免费在线播放第一区高清av| 欧美日韩一区在线观看视频| 老色批av在线精品| 欧美美女bb生活片| 激情五月综合色婷婷一区二区| 欧美日韩一区二区免费视频| 六十路精品视频| 久色成人在线| 欧美精品一区二区三区很污很色的 | 欧美日韩另类综合| 欧美另类一区| 欧美日韩免费高清| 亚洲美女在线观看| 欧美激情国产日韩精品一区18| 亚洲国产精品久久久久婷婷老年 | 国产尤物精品| 欧美一区二区三区在线播放| 欧美乱在线观看| 午夜激情一区| 国语自产精品视频在线看抢先版结局 | 国产美女精品视频| 久久精品人人做人人综合| 禁断一区二区三区在线| 欧美日韩 国产精品| 中文国产一区| 在线看不卡av| 欧美人妖在线观看| 亚洲在线观看免费| 国产麻豆成人精品| 香蕉乱码成人久久天堂爱免费 | 伊人久久大香线蕉av超碰演员| 欧美激情精品| 先锋a资源在线看亚洲| 亚洲激情黄色| 国产精品久久久久久久久免费樱桃| 久久久久久久波多野高潮日日 | 国产亚洲一区在线播放| 性高湖久久久久久久久| 亚洲国产成人精品女人久久久| 欧美日韩国产色视频| 久久国产精品久久国产精品 | 国产精品久久久久天堂| 久久精品国内一区二区三区| 欧美综合国产| 狠狠爱www人成狠狠爱综合网| 亚洲图片欧美一区| 欧美经典一区二区| 国产精品v欧美精品v日本精品动漫| 精品成人国产在线观看男人呻吟| 亚洲一区二区三区精品在线| 国内精品写真在线观看| 在线日韩成人| 久久激情婷婷| 欧美天天在线| 亚洲国产精品尤物yw在线观看| 欧美一区二区三区视频免费| 久久亚洲春色中文字幕| 欧美成人精品福利| 亚洲黄色一区二区三区| 亚洲在线免费观看| 欧美肥婆在线| 在线观看的日韩av| 国产拍揄自揄精品视频麻豆| 蜜臀91精品一区二区三区| 亚洲一区二区黄| 亚洲成色777777在线观看影院| 欧美日韩第一页| 鲁大师成人一区二区三区| 午夜精品久久久久久久久| 新片速递亚洲合集欧美合集| 国产欧美日韩综合精品二区| 欧美日韩日韩| 久久久久久久久久久久久9999| 亚洲欧美欧美一区二区三区| 99精品国产在热久久婷婷| 国产亚洲女人久久久久毛片| 欧美视频一区二区| 欧美国产亚洲另类动漫| 久久久亚洲精品一区二区三区| 亚洲专区在线视频| 99re热这里只有精品视频| 一色屋精品视频免费看| 国产精品一区二区三区免费观看| 欧美日韩一区二区三区在线视频 | 欧美激情第4页| 亚洲女同性videos| 一区二区三区精密机械公司| 尤物九九久久国产精品的分类|