日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

詳解Python里的分支代碼

python爬蟲(chóng)知識(shí)分享 ? 來(lái)源:python爬蟲(chóng)知識(shí)分享 ? 作者:python爬蟲(chóng)知識(shí)分享 ? 2022-04-21 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Python 里的分支代碼

Python 支持最為常見(jiàn)的 if/else 條件分支語(yǔ)句,不過(guò)它缺少在其他編程語(yǔ)言中常見(jiàn)的 switch/case 語(yǔ)句。

除此之外,Python 還為 for/while 循環(huán)以及 try/except 語(yǔ)句提供了 else 分支,在一些特殊的場(chǎng)景下,它們可以大顯身手。

1. 避免多層分支嵌套

如果這篇文章只能刪減成一句話就結(jié)束,那么那句話一定是“要竭盡所能的避免分支嵌套”。

過(guò)深的分支嵌套是很多編程新手最容易犯的錯(cuò)誤之一。假如有一位新手 JavaScript 程序員寫(xiě)了很多層分支嵌套,那么你可能會(huì)看到一層又一層的大括號(hào):if { if { if { ... }}}。俗稱(chēng)“嵌套 if 地獄(Nested If Statement Hell)”。

但是因?yàn)?Python 使用了縮進(jìn)來(lái)代替 {},所以過(guò)深的嵌套分支會(huì)產(chǎn)生比其他語(yǔ)言下更為嚴(yán)重的后果。比如過(guò)多的縮進(jìn)層次很容易就會(huì)讓代碼超過(guò) PEP8 中規(guī)定的每行字?jǐn)?shù)限制。讓我們看看這段代碼:

def buy_fruit(nerd, store):
    """去水果店買(mǎi)蘋(píng)果

    - 先得看看店是不是在營(yíng)業(yè)
    - 如果有蘋(píng)果的話,就買(mǎi) 1 個(gè)
    - 如果錢(qián)不夠,就回家取錢(qián)再來(lái)
    """
    if store.is_open():
        if store.has_stocks("apple"):
            if nerd.can_afford(store.price("apple", amount=1)):
                nerd.buy(store, "apple", amount=1)
                return
            else:
                nerd.go_home_and_get_money()
                return buy_fruit(nerd, store)
        else:
            raise MadAtNoFruit("no apple in store!")
    else:
        raise MadAtNoFruit("store is closed!")

上面這段代碼最大的問(wèn)題,就是過(guò)于直接翻譯了原始的條件分支要求,導(dǎo)致短短十幾行代碼包含了有三層嵌套分支。

這樣的代碼可讀性和維護(hù)性都很差。不過(guò)我們可以用一個(gè)很簡(jiǎn)單的技巧:“提前結(jié)束” 來(lái)優(yōu)化這段代碼:

def buy_fruit(nerd, store):
    if not store.is_open():
        raise MadAtNoFruit("store is closed!")

    if not store.has_stocks("apple"):
        raise MadAtNoFruit("no apple in store!")

    if nerd.can_afford(store.price("apple", amount=1)):
        nerd.buy(store, "apple", amount=1)
        return
    else:
        nerd.go_home_and_get_money()
        return buy_fruit(nerd, store)

“提前結(jié)束”指:在函數(shù)內(nèi)使用 returnraise 等語(yǔ)句提前在分支內(nèi)結(jié)束函數(shù)。比如,在新的 buy_fruit 函數(shù)里,當(dāng)分支條件不滿足時(shí),我們直接拋出異常,結(jié)束這段這代碼分支。這樣的代碼沒(méi)有嵌套分支,更直接也更易讀。

2. 封裝那些過(guò)于復(fù)雜的邏輯判斷

如果條件分支里的表達(dá)式過(guò)于復(fù)雜,出現(xiàn)了太多的 not/and/or,那么這段代碼的可讀性就會(huì)大打折扣,比如下面這段代碼:

# 如果活動(dòng)還在開(kāi)放,并且活動(dòng)剩余名額大于 10,為所有性別為女性,或者級(jí)別大于 3
# 的活躍用戶發(fā)放 10000 個(gè)金幣
if activity.is_active and activity.remaining > 10 and \
        user.is_active and (user.sex == 'female' or user.level > 3):
    user.add_coins(10000)
    return

對(duì)于這樣的代碼,我們可以考慮將具體的分支邏輯封裝成函數(shù)或者方法,來(lái)達(dá)到簡(jiǎn)化代碼的目的:

if activity.allow_new_user() and user.match_activity_condition():
    user.add_coins(10000)
    return

事實(shí)上,將代碼改寫(xiě)后,之前的注釋文字其實(shí)也可以去掉了。因?yàn)楹竺孢@段代碼已經(jīng)達(dá)到了自說(shuō)明的目的。至于具體的 什么樣的用戶滿足活動(dòng)條件? 這種問(wèn)題,就應(yīng)由具體的 match_activity_condition() 方法來(lái)回答了。

Hint: 恰當(dāng)?shù)姆庋b不光直接改善了代碼的可讀性,事實(shí)上,如果上面的活動(dòng)判斷邏輯在代碼中出現(xiàn)了不止一次的話,封裝更是必須的。不然重復(fù)代碼會(huì)極大的破壞這段邏輯的可維護(hù)性。

3. 留意不同分支下的重復(fù)代碼

重復(fù)代碼是代碼質(zhì)量的天敵,而條件分支語(yǔ)句又非常容易成為重復(fù)代碼的重災(zāi)區(qū)。所以,當(dāng)我們編寫(xiě)條件分支語(yǔ)句時(shí),需要特別留意,不要生產(chǎn)不必要的重復(fù)代碼。

讓我們看下這個(gè)例子:

# 對(duì)于新用戶,創(chuàng)建新的用戶資料,否則更新舊資料
if user.no_profile_exists:
    create_user_profile(
        username=user.username,
        email=user.email,
        age=user.age,
        address=user.address,
        # 對(duì)于新建用戶,將用戶的積分置為 0
        points=0,
        created=now(),
    )
else:
    update_user_profile(
        username=user.username,
        email=user.email,
        age=user.age,
        address=user.address,
        updated=now(),
    )

在上面的代碼中,我們可以一眼看出,在不同的分支下,程序調(diào)用了不同的函數(shù),做了不一樣的事情。但是,因?yàn)槟切┲貜?fù)代碼的存在,我們卻很難簡(jiǎn)單的區(qū)分出,二者的不同點(diǎn)到底在哪。

其實(shí),得益于 Python 的動(dòng)態(tài)特性,我們可以簡(jiǎn)單的改寫(xiě)一下上面的代碼,讓可讀性可以得到顯著的提升:

if user.no_profile_exists:
    profile_func = create_user_profile
    extra_args = {'points': 0, 'created': now()}
else:
    profile_func = update_user_profile
    extra_args = {'updated': now()}

profile_func(
    username=user.username,
    email=user.email,
    age=user.age,
    address=user.address,
    **extra_args
)

當(dāng)你編寫(xiě)分支代碼時(shí),請(qǐng)額外關(guān)注由分支產(chǎn)生的重復(fù)代碼塊,如果可以簡(jiǎn)單的消滅它們,那就不要遲疑。

4. 謹(jǐn)慎使用三元表達(dá)式

三元表達(dá)式是 Python 2.5 版本后才支持的語(yǔ)法。在那之前,Python 社區(qū)一度認(rèn)為三元表達(dá)式?jīng)]有必要,我們需要使用 x and a or b 的方式來(lái)模擬它。[注]

事實(shí)是,在很多情況下,使用普通的 if/else 語(yǔ)句的代碼可讀性確實(shí)更好。盲目追求三元表達(dá)式很容易誘惑你寫(xiě)出復(fù)雜、可讀性差的代碼。

所以,請(qǐng)記得只用三元表達(dá)式處理簡(jiǎn)單的邏輯分支。

language = "python" if you.favor("dynamic") else "golang"

對(duì)于絕大多數(shù)情況,還是使用普通的 if/else 語(yǔ)句吧。

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4977

    瀏覽量

    74417
  • python
    +關(guān)注

    關(guān)注

    58

    文章

    4889

    瀏覽量

    90330
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    解讀藍(lán)牙工業(yè)應(yīng)用新價(jià)值

    近日,云(股票代碼:920374)總經(jīng)理張敏先生受邀接受全球權(quán)威組織藍(lán)牙技術(shù)聯(lián)盟(Bluetooth SIG)專(zhuān)訪,圍繞藍(lán)牙技術(shù)在工業(yè)場(chǎng)景的應(yīng)用痛點(diǎn)、技術(shù)優(yōu)勢(shì)、落地價(jià)值及未來(lái)拓展等核心議題分享深度見(jiàn)解,為工業(yè)物聯(lián)網(wǎng)數(shù)字化轉(zhuǎn)
    的頭像 發(fā)表于 04-22 10:20 ?331次閱讀

    [VirtualLab] 使用Python運(yùn)行VirtualLab Fusion光學(xué)仿真

    摘要 VirtualLab Fusion允許Python外部訪問(wèn)其建模技術(shù)、求解器和結(jié)果。這個(gè)用例介紹了一種使用路徑變量和Visual Studio代碼Python連接到VirtualLab
    發(fā)表于 03-31 09:39

    SCANSTA111:增強(qiáng)型掃描橋接多分支可尋址IEEE 1149.1(JTAG)端口芯片詳解

    SCANSTA111:增強(qiáng)型掃描橋接多分支可尋址IEEE 1149.1(JTAG)端口芯片詳解 在電子設(shè)備的測(cè)試與調(diào)試過(guò)程中,IEEE 1149.1(JTAG)標(biāo)準(zhǔn)發(fā)揮著重要作用。而TI
    的頭像 發(fā)表于 03-30 11:30 ?178次閱讀

    如何在 VisionFive 上使用 Python 包?

    VisionFive Fedora 下的本地目錄,請(qǐng)?jiān)谠?b class='flag-5'>代碼目錄下執(zhí)行以下命令: 提示:源代碼可從以下位置下載:愿景五.gpio. sudo yum install python
    發(fā)表于 03-30 08:28

    1688 商品詳情 API 調(diào)用與數(shù)據(jù)解析 Python 實(shí)戰(zhàn)

    你想要的是 1688 商品詳情 API 的 Python 調(diào)用與數(shù)據(jù)解析實(shí)戰(zhàn)方案,核心是完成 API 憑證配置、接口請(qǐng)求(含簽名)、響應(yīng)數(shù)據(jù)解析、異常處理 的全流程落地,我會(huì)提供可直接運(yùn)行的代碼,并
    的頭像 發(fā)表于 02-10 11:23 ?406次閱讀

    Termux中調(diào)試圣誕樹(shù)Python代碼

    在Termux中調(diào)試Python代碼(以圣誕樹(shù)立例)非常簡(jiǎn)單,核心分為環(huán)境準(zhǔn)備、代碼編寫(xiě)、運(yùn)行調(diào)試三個(gè)步驟,下面一步步教你操作: 一、環(huán)境準(zhǔn)備(首次使用需做) Termux默認(rèn)可能沒(méi)有Pyth
    發(fā)表于 12-09 09:02

    C語(yǔ)言的分支結(jié)構(gòu)介紹

    1.簡(jiǎn)單if語(yǔ)句 C語(yǔ)言中的分支結(jié)構(gòu)語(yǔ)句中的if條件語(yǔ)句。 簡(jiǎn)單if語(yǔ)句的基本結(jié)構(gòu)如下: 代碼語(yǔ)言:javascript if(表達(dá)式) { 執(zhí)行代碼塊; } 其語(yǔ)義是:如果表達(dá)式的值為真,則執(zhí)行其后的語(yǔ)句,否則不執(zhí)
    發(fā)表于 11-25 07:48

    蜂鳥(niǎo)E203簡(jiǎn)單分支預(yù)測(cè)的改進(jìn)

    1.蜂鳥(niǎo)E203的原有分支預(yù)測(cè) 蜂鳥(niǎo)E203處理器為了能夠連續(xù)不斷的取指令,需要在每個(gè)時(shí)鐘周期都能生成一條待取的指令。因此,在取指令的階段,IFU單元模塊進(jìn)行了簡(jiǎn)單的譯碼處理,用以判別
    發(fā)表于 10-24 07:45

    提高條件分支指令預(yù)測(cè)正確率的方法

    基于全局分支歷史的ghare分支預(yù)測(cè)器 主要構(gòu)成 分支目標(biāo)緩沖器BTB 分支歷史寄存器BHR 方式歷史寄存器PHT 對(duì)于某個(gè)條件分支指令
    發(fā)表于 10-22 08:22

    淘寶商品詳情接口(item_get)企業(yè)級(jí)全解析:參數(shù)配置、簽名機(jī)制與 Python 代碼實(shí)戰(zhàn)

    本文詳解淘寶開(kāi)放平臺(tái)taobao.item_get接口對(duì)接全流程,涵蓋參數(shù)配置、MD5簽名生成、Python企業(yè)級(jí)代碼實(shí)現(xiàn)及高頻問(wèn)題排查,提供可落地的實(shí)戰(zhàn)方案,助你高效穩(wěn)定獲取商品數(shù)據(jù)。
    的頭像 發(fā)表于 09-26 09:13 ?1131次閱讀
    淘寶商品詳情接口(item_get)企業(yè)級(jí)全解析:參數(shù)配置、簽名機(jī)制與 <b class='flag-5'>Python</b> <b class='flag-5'>代碼</b>實(shí)戰(zhàn)

    愛(ài)回收商品詳情接口全方位對(duì)接指南:從認(rèn)證機(jī)制到數(shù)據(jù)提取最佳實(shí)踐(附 Python 代碼 + 成色數(shù)據(jù)處理)

    本文詳解愛(ài)回收二手?jǐn)?shù)碼商品詳情接口對(duì)接,涵蓋認(rèn)證、簽名生成、成色映射、估價(jià)緩存等核心環(huán)節(jié),提供可復(fù)用代碼與避坑指南,解決簽名失敗、數(shù)據(jù)延遲等常見(jiàn)問(wèn)題。
    的頭像 發(fā)表于 09-25 10:33 ?1250次閱讀

    VVIC 平臺(tái)商品詳情接口高效調(diào)用方案:從簽名驗(yàn)證到數(shù)據(jù)解析全流程

    本文詳解VVIC平臺(tái)商品詳情接口調(diào)用全流程,涵蓋參數(shù)配置、簽名生成、異常處理與數(shù)據(jù)解析,提供可復(fù)用的Python代碼及避坑指南,助力開(kāi)發(fā)者高效實(shí)現(xiàn)安全、穩(wěn)定的數(shù)據(jù)對(duì)接。
    的頭像 發(fā)表于 09-23 10:28 ?811次閱讀

    termux如何搭建python游戲

    用VS Code編輯 - 版本控制:`git`管理代碼,同步至GitHub/Gitee - 任務(wù)調(diào)度:通過(guò)`crontab`設(shè)置定時(shí)測(cè)試(如每分鐘運(yùn)行游戲腳本:`*/1 * * * * python
    發(fā)表于 08-29 07:06

    如何統(tǒng)計(jì)蜂鳥(niǎo)E203的分支預(yù)測(cè)率?

    想請(qǐng)問(wèn)大家如何統(tǒng)計(jì)蜂鳥(niǎo)E203的分支預(yù)測(cè)率,我嘗試在exu_commit模塊統(tǒng)計(jì),但是發(fā)現(xiàn)預(yù)測(cè)率都有寫(xiě)問(wèn)題,想請(qǐng)教以下大家
    發(fā)表于 06-10 07:05
    纳雍县| 桓台县| 陆良县| 镇雄县| 新疆| 墨脱县| 翁牛特旗| 宁陕县| 民权县| 罗田县| 古丈县| 错那县| 高雄市| 固镇县| 昌平区| 延安市| 五台县| 自治县| 唐海县| 永和县| 敖汉旗| 五原县| 从化市| 阳曲县| 高尔夫| 台东市| 镇坪县| 光山县| 雷波县| 正安县| 樟树市| 页游| 达州市| 镇远县| 湖州市| 玛沁县| 饶河县| 揭西县| 镇巴县| 镇江市| 巨野县|