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

Python程序員開發(fā)中常犯的10個錯誤
來源:易賢網(wǎng) 閱讀:1359 次 日期:2014-07-08 18:58:15
溫馨提示:易賢網(wǎng)小編為您整理了“Python程序員開發(fā)中常犯的10個錯誤”,方便廣大網(wǎng)友查閱!

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

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

1.濫用表達(dá)式作為函數(shù)參數(shù)默認(rèn)值

Python允許開發(fā)者指定一個默認(rèn)值給函數(shù)參數(shù),雖然這是該語言的一個特征,但當(dāng)參數(shù)可變時,很容易導(dǎo)致混亂,例如,下面這段函數(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

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

代碼如下:

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

3.為異常指定不正確的參數(shù)

假設(shè)代碼中有如下代碼:

代碼如下:

>>> 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通常是用來綁定異常里的 第二參數(shù),好讓其進(jìn)行更進(jìn)一步的檢查。因此,在上面這段代碼里,IndexError異常并沒有被except語句捕獲,異常最后被綁定 到了一個名叫IndexError的參數(shù)上。

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

代碼如下:

>>> try:

...     l = ["a", "b"]

...     int(l[2])

... except (ValueError, IndexError) as e: 

...     pass

...

>>>

4.誤解Python規(guī)則范圍

Python的作用域解析是基于LEGB規(guī)則,分別是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

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

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

代碼如下:

>>> 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賦值(因此,假設(shè)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

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

對上面的代碼進(jìn)行修改,正確地執(zhí)行:

代碼如下:

>>> 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)

...

你期望的結(jié)果是:

代碼如下:

0

2

4

6

8

實際上:

代碼如下:

8

8

8

8

8

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

解決方案:

代碼如下:

>>> 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.創(chuàng)建循環(huán)模塊依賴關(guān)系

假設(shè)有兩個文件,a.py和b.py,然后各自導(dǎo)入,如下:

在a.py中:

代碼如下:

import b

def f():

    return b.x

print f()

在b.py中:

代碼如下:

import a

x = 1

def g():

    print a.f()

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

代碼如下:>>> import a

1

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

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

當(dāng)我們試圖導(dǎo)入b.py會發(fā)生什么(先前沒有導(dǎo)入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'

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

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

代碼如下:

x = 1

def g():

    import a # This will be evaluated only when g() is called

    print a.f()

無論何時導(dǎo)入,一切都可以正常運行:

代碼如下:

>>> 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標(biāo)準(zhǔn)庫模塊名稱沖突

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

9.未按規(guī)定處理Python2.x和Python3.x之間的區(qū)別

看一下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中運行結(jié)果:

代碼如下:$ python3 foo.py 1

key error

1

$ python3 foo.py 2

value error

2

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

10.濫用__del__方法

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

代碼如下:

import foo

class Bar(object):

        ...

    def __del__(self):

        foo.cleanup(self.myhandle)

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

代碼如下:

import mod

mybar = mod.Bar()

你會獲得一個AttributeError異常。

至于為什么會出現(xiàn)該異常,點擊這里查看詳情。當(dāng)解釋器關(guān)閉時,該模塊的全局變量全部設(shè)置為None。因此,在上面這個例子里,當(dāng)__del__被調(diào)用時,foo已經(jīng)全部被設(shè)置為None。

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

修復(fù)上面問題的代碼:

代碼如下:

import foo

import atexit

def cleanup(handle):

    foo.cleanup(handle)

class Bar(object):

    def __init__(self):

        ...

        atexit.register(cleanup, self.myhandle)

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

總結(jié)

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

更多信息請查看IT技術(shù)專欄

更多信息請查看腳本欄目
易賢網(wǎng)手機網(wǎng)站地址:Python程序員開發(fā)中常犯的10個錯誤
由于各方面情況的不斷調(diào)整與變化,易賢網(wǎng)提供的所有考試信息和咨詢回復(fù)僅供參考,敬請考生以權(quán)威部門公布的正式信息和咨詢?yōu)闇?zhǔn)!

2026上岸·考公考編培訓(xùn)報班

  • 報班類型
  • 姓名
  • 手機號
  • 驗證碼
關(guān)于我們 | 聯(lián)系我們 | 人才招聘 | 網(wǎng)站聲明 | 網(wǎng)站幫助 | 非正式的簡要咨詢 | 簡要咨詢須知 | 新媒體/短視頻平臺 | 手機站點 | 投訴建議
工業(yè)和信息化部備案號:滇ICP備2023014141號-1 云南省教育廳備案號:云教ICP備0901021 滇公網(wǎng)安備53010202001879號 人力資源服務(wù)許可證:(云)人服證字(2023)第0102001523號
云南網(wǎng)警備案專用圖標(biāo)
聯(lián)系電話:0871-65099533/13759567129 獲取招聘考試信息及咨詢關(guān)注公眾號:hfpxwx
咨詢QQ:1093837350(9:00—18:00)版權(quán)所有:易賢網(wǎng)
云南網(wǎng)警報警專用圖標(biāo)
中文字幕免费精品_亚洲视频自拍_亚洲综合国产激情另类一区_色综合咪咪久久
国产欧美另类| 久久亚洲精品一区二区| 欧美色播在线播放| 亚洲欧美日韩综合| 国内成+人亚洲| 久久久久久久久蜜桃| 亚洲国产欧美另类丝袜| 欧美国产三区| 午夜精品福利一区二区三区av| 国产一区在线播放| 黄色欧美成人| 亚洲欧洲精品成人久久奇米网| 国产精品日韩欧美| 黄色亚洲大片免费在线观看| 欧美体内谢she精2性欧美| 欧美精品一区三区在线观看| 在线性视频日韩欧美| 国产精品老牛| 欧美午夜精品久久久久久人妖| 性色av一区二区三区| 欧美一区视频在线| 久久久精品国产免费观看同学| 国产精品视频yy9299一区| 国产精品一区二区久久国产| 欧美日韩在线大尺度| 欧美成人三级在线| 久久网站热最新地址| 久久精品免费观看| 国产精品白丝av嫩草影院| 亚洲国产精品一区二区第四页av | 国内自拍一区| 日韩午夜激情电影| 99re热这里只有精品视频| 韩国av一区二区三区| 99热在线精品观看| 久久精品国产亚洲aⅴ| 久久成人18免费网站| 性久久久久久久久久久久| 欧美主播一区二区三区美女 久久精品人| 夜夜嗨av一区二区三区中文字幕 | 精东粉嫩av免费一区二区三区| 亚洲人成在线观看网站高清| 欧美一区二区在线免费观看| 欧美女同在线视频| 国产精品高潮久久| 国外视频精品毛片| 91久久久久久久久| 欧美激情在线| 亚洲伊人久久综合| 国产精品va在线| 一本到12不卡视频在线dvd| 亚洲欧美成aⅴ人在线观看| 久久综合精品一区| 国产欧美日韩综合一区在线观看| 亚洲欧洲99久久| 国产精品久久婷婷六月丁香| 一本色道久久综合狠狠躁篇怎么玩| 久久男人资源视频| 欧美成人日韩| 亚洲欧美日韩成人| 日韩视频免费大全中文字幕| 国产精品久久久久久久久婷婷| 欧美一区午夜精品| 亚洲第一中文字幕| 欧美天堂亚洲电影院在线播放| 亚洲免费一级电影| 亚洲福利视频网| 国产精品久久久一区二区三区| 午夜精品一区二区三区在线| 国产在线国偷精品产拍免费yy| 亚洲手机视频| 国产精品久久亚洲7777| 久久不见久久见免费视频1| 亚洲精品五月天| 国产精品任我爽爆在线播放| 免费试看一区| 性欧美在线看片a免费观看| 在线免费观看视频一区| 久久xxxx| 一本色道久久综合狠狠躁篇怎么玩 | 欧美日韩一区在线观看视频| 亚洲夜间福利| 亚洲精品一区二区三区在线观看| 欧美黄色免费网站| 激情综合自拍| 亚洲大片av| 亚洲国产高清一区| 国产午夜精品久久久久久久| 欧美成人免费一级人片100| 亚洲美女视频| 在线一区欧美| 国产精品日日做人人爱| 国自产拍偷拍福利精品免费一| 在线精品视频一区二区三四| 国产一区二区三区在线观看网站| 欧美日韩综合在线| 99re8这里有精品热视频免费 | 久久久久国内| 欧美影院精品一区| 久热精品在线视频| 久久久久久免费| 久久久久久综合| 久久久久国内| 久久一二三四| 欧美一区二视频| 国产精品毛片一区二区三区| 亚洲成人自拍视频| 亚洲午夜女主播在线直播| 亚洲综合欧美日韩| 午夜一区不卡| 亚洲美女性视频| 一本一本久久| 亚洲一区二区三区久久| 亚洲精品国产欧美| 久久久精品午夜少妇| 国产精品久久综合| 免费亚洲电影| 欧美日韩在线免费视频| 国产精品色婷婷| 国内精品久久久久影院薰衣草| 激情丁香综合| 久久免费黄色| 国产裸体写真av一区二区| 亚洲国产成人久久综合一区| 99pao成人国产永久免费视频| 午夜在线精品偷拍| 久久人人精品| 欧美精品一区三区| 亚洲精品看片| 欧美成人一品| 亚洲国产日韩美| 久久午夜av| 久久久综合激的五月天| 国产精品天天看| 在线播放一区| 午夜精品国产更新| 亚洲国产欧美国产综合一区 | 午夜伦欧美伦电影理论片| 久久精品视频在线看| 欧美日韩亚洲综合| 欧美一区二区视频97| 国产精品国产自产拍高清av王其 | 欧美国产日韩a欧美在线观看| 又紧又大又爽精品一区二区| 久久青草久久| 亚洲少妇诱惑| 国产精品亚洲综合久久| 一区二区三区四区五区在线 | 一本色道久久综合精品竹菊| 国产小视频国产精品| 亚洲美女视频在线免费观看| 久久精品30| 亚洲国产日韩欧美一区二区三区| 麻豆成人在线观看| 日韩视频在线免费| 国产精品视频网站| 久久五月婷婷丁香社区| 99视频精品全部免费在线| 国产有码在线一区二区视频| 欧美成人免费网| 性欧美精品高清| 亚洲一区在线观看免费观看电影高清| 国产欧美日本| 国产精品久久久一区麻豆最新章节| 欧美一区二区三区另类 | 久久九九国产精品| 亚洲摸下面视频| 亚洲欧美电影在线观看| 欧美日韩成人激情| 久久婷婷国产综合国色天香| 欧美紧缚bdsm在线视频| 黑人操亚洲美女惩罚| 性久久久久久久久| 欧美福利视频在线| 亚洲第一精品影视| 久久精品国产免费观看| 欧美午夜视频| 久久精品国语| 亚洲视频图片小说| 国产日韩欧美在线一区| 欧美国产精品v| 一区二区三区欧美视频| 午夜激情综合网| 性做久久久久久| 1024亚洲| 亚洲伦理在线免费看| 欧美伊久线香蕉线新在线| 亚洲一区二区视频| 久久综合激情| 国产欧美1区2区3区| 国产精品久久久久久久久果冻传媒| 精品1区2区3区4区| 亚洲欧美大片| 久久久成人精品| 国产精品青草久久| 亚洲二区视频| 亚洲精选在线观看| 久久亚洲国产成人| 亚洲日韩第九十九页| 亚洲一区在线观看免费观看电影高清|