亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

        Python 初學(xué)者常犯的5個(gè)錯(cuò)誤

        2019-09-10 07:22:44
        電腦報(bào) 2019年37期

        Python是一種高級的動態(tài)編程語言,它以易于使用著名。目前Python社區(qū)已經(jīng)非常完善了,近幾年它的發(fā)展尤為迅猛。但是易于使用同樣能帶來一些壞處,即易于誤用。在本文中,我們列舉了 初學(xué)者常犯的5 個(gè)錯(cuò)誤,希望它們能幫助初學(xué)者寫更加正確與優(yōu)美的代碼。

        1. 可變的缺省參數(shù)

        Python 中的缺省參數(shù)會在執(zhí)行函數(shù)定義時(shí)計(jì)算一次,這表示在函數(shù)完成定義后該表達(dá)式只執(zhí)行一次,因此缺省值可以用于后續(xù)的每一次調(diào)用。如果我們令缺省參數(shù)為可變的,例如列表或字典等,那么對于將來所有的調(diào)用,該參數(shù)都是一直保留且可變的。

        如下為不正確的表達(dá)方式,如果我們第一次調(diào)用 add_item 增加「a」時(shí),items=[『a』]。當(dāng)我們第二次調(diào)用 add_item 增加「b」時(shí),由于定義中的 items=[] 只在初始化的時(shí)候運(yùn)行一次,因此這時(shí)的 items=[『a』, 『b』]。

        尤其是當(dāng)我們在調(diào)用 add_item 函數(shù)時(shí)沒傳入任何參數(shù),那么 items 還是能保留以前記住的內(nèi)容,相當(dāng)于將以前的內(nèi)容泄露給了后續(xù)的調(diào)用。

        def add_item(new_item, items=[]):

        items.append(new_item)

        正確的表達(dá)方式應(yīng)該是如下,在我們沒傳入 items 時(shí)應(yīng)該要將它初始化為空白列表:

        def add_item(new_item, items=None):

        if items is None:

        items = []

        items.append(new_item)

        2. 將 assert 聲明語句作為保證條件

        因?yàn)?assert 語句很容易檢查一些條件是否滿足或執(zhí)行是否正確,開發(fā)者經(jīng)常用它來檢查某部分代碼的有效性。但是當(dāng) Python 解釋器調(diào)用時(shí)帶了-O (optimize) flag,那么 assert 語句會從字節(jié)碼中移除。所以,如果 assert 語句在面向用戶驗(yàn)證的產(chǎn)品代碼中,根本就不會執(zhí)行,因?yàn)樗赡軙斐梢恍┌踩┒础?/p>

        因此開發(fā)者應(yīng)該只在測試中使用 assert 語句,不正確的示例如下:

        assert re.match(VALID_ADDRESS_REGEXP, email) is not None

        正確的代碼要改成:

        if not re.match(VALID_ADDRESS_REGEXP, email):

        raise AssertionError

        3. 使用 isinstance 代替 type

        type 和 isinstance 都能檢查某個(gè)對象的類別是什么。但是它們間有非常重要的區(qū)別,isinstance 在解析目標(biāo)類型時(shí),它會關(guān)注繼承關(guān)系,而 type 并不會。正因?yàn)檫@個(gè)區(qū)別,isinstance 在某些時(shí)候并不是我們所想的那樣。例如以下案例:

        def which_number_type(num):

        if isinstance(num, int):

        print(‘Integer’)

        else:

        raise TypeError(‘Not an integer’)

        which_number(False) # prints ‘Integer’, which is incorrect

        因?yàn)椴紶栴愋偷淖兞吭?Python 中是 int 的子類,isinstance(num, int) 同樣會得出 True,這并不是我們想要的。在特定的類別中,使用 type 可能更加正確。

        4. 不必要的 lambda 表達(dá)式

        函數(shù)在 Python 中是最常用的結(jié)構(gòu),我們能將函數(shù)賦值給某個(gè)變量,并將該變量作為參數(shù)傳遞給另外一個(gè)函數(shù),這也是函數(shù)常見的用法。但這對于初學(xué)者或了解其他編程語言的開發(fā)者而言,這種傳遞方式是非常反直覺的。

        一個(gè)比較常見的模式可以表示為:

        def request(self, method, **kwargs):

        # ...

        if method not in (“get”, “post”):

        req.get_method = lambda: method.upper()

        # ...

        上面采用匿名函數(shù) lambda 的方式,最好可以改成以下:

        def request(self, method, **kwargs):

        # ...

        if method not in (“get”, “post”):

        req.get_method = method.upper

        # ...

        5. Raising NotImplemented

        這種命名可能會使開發(fā)者感到困惑,NotImplementedError 是一種 exception 類,當(dāng)派生類需要重寫某個(gè)方法時(shí),Python 應(yīng)該觸發(fā)這類錯(cuò)誤。而 NotImplemented 是一個(gè)常量,它用于實(shí)現(xiàn)二進(jìn)制操作。當(dāng)我們觸發(fā) NotImplemented 時(shí),Python 會給出「TypeError」的報(bào)錯(cuò)。

        錯(cuò)誤的例子:

        class SitesManager(object):

        def get_image_tracking_code(self):

        raise NotImplemented

        正確表達(dá)方法應(yīng)該是:

        class SitesManager(object):

        def get_image_tracking_code(self):

        raise NotImplementedError

        91快射视频在线观看| 国产第19页精品| 亚洲春色AV无码专区在线播放| 国产自产自现在线视频地址 | 国产在线观看自拍av| 色播亚洲视频在线观看| 精品久久综合亚洲伊人| 果冻国产一区二区三区| 精彩亚洲一区二区三区| 人妻少妇中文字幕乱码| 亚洲最新偷拍网站| 日本久久精品在线播放| 国产高清在线视频一区二区三区| 帮老师解开蕾丝奶罩吸乳视频 | 久久久精品欧美一区二区免费| 国产成人久久蜜一区二区| av网址在线一区二区| 日韩欧美在线综合网另类| 老熟妻内射精品一区| 欧美v日韩v亚洲综合国产高清| 一本色道精品亚洲国产一区| 2019最新中文字幕在线观看| 国产av无码专区亚洲av手机麻豆| 精品人妻av一区二区三区不卡| 户外精品一区二区三区| 国产探花在线精品一区二区| 国产免费一区二区三区最新不卡| 少妇特殊按摩高潮对白| 久久久久亚洲av无码专区首| 国产精品成人99一区无码| 国产AV无码无遮挡毛片| 日本黄色3级一区二区| 亚洲日韩国产精品乱-久| 中文人妻无码一区二区三区| 国产成人av三级三级三级在线 | 青青草视频是针对华人| 无码va在线观看| 日日摸日日碰人妻无码老牲| 天堂av国产一区二区熟女人妻| 亚洲人成网线在线播放va蜜芽 | av成人综合在线资源站|