国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

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

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

3天內不再提示

詳解Python里的分支代碼

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-04-21 15:20 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Python 里的分支代碼

Python 支持最為常見的 if/else 條件分支語句,不過它缺少在其他編程語言中常見的 switch/case 語句。

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

1. 避免多層分支嵌套

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

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

但是因為 Python 使用了縮進來代替 {},所以過深的嵌套分支會產生比其他語言下更為嚴重的后果。比如過多的縮進層次很容易就會讓代碼超過 PEP8 中規定的每行字數限制。讓我們看看這段代碼:

def buy_fruit(nerd, store):
    """去水果店買蘋果

    - 先得看看店是不是在營業
    - 如果有蘋果的話,就買 1 個
    - 如果錢不夠,就回家取錢再來
    """
    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!")

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

這樣的代碼可讀性和維護性都很差。不過我們可以用一個很簡單的技巧:“提前結束” 來優化這段代碼:

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)

“提前結束”指:在函數內使用 returnraise 等語句提前在分支內結束函數。比如,在新的 buy_fruit 函數里,當分支條件不滿足時,我們直接拋出異常,結束這段這代碼分支。這樣的代碼沒有嵌套分支,更直接也更易讀。

2. 封裝那些過于復雜的邏輯判斷

如果條件分支里的表達式過于復雜,出現了太多的 not/and/or,那么這段代碼的可讀性就會大打折扣,比如下面這段代碼:

# 如果活動還在開放,并且活動剩余名額大于 10,為所有性別為女性,或者級別大于 3
# 的活躍用戶發放 10000 個金幣
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

對于這樣的代碼,我們可以考慮將具體的分支邏輯封裝成函數或者方法,來達到簡化代碼的目的:

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

事實上,將代碼改寫后,之前的注釋文字其實也可以去掉了。因為后面這段代碼已經達到了自說明的目的。至于具體的 什么樣的用戶滿足活動條件? 這種問題,就應由具體的 match_activity_condition() 方法來回答了。

Hint: 恰當的封裝不光直接改善了代碼的可讀性,事實上,如果上面的活動判斷邏輯在代碼中出現了不止一次的話,封裝更是必須的。不然重復代碼會極大的破壞這段邏輯的可維護性。

3. 留意不同分支下的重復代碼

重復代碼是代碼質量的天敵,而條件分支語句又非常容易成為重復代碼的重災區。所以,當我們編寫條件分支語句時,需要特別留意,不要生產不必要的重復代碼。

讓我們看下這個例子:

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

在上面的代碼中,我們可以一眼看出,在不同的分支下,程序調用了不同的函數,做了不一樣的事情。但是,因為那些重復代碼的存在,我們卻很難簡單的區分出,二者的不同點到底在哪。

其實,得益于 Python 的動態特性,我們可以簡單的改寫一下上面的代碼,讓可讀性可以得到顯著的提升:

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
)

當你編寫分支代碼時,請額外關注由分支產生的重復代碼塊,如果可以簡單的消滅它們,那就不要遲疑。

4. 謹慎使用三元表達式

三元表達式是 Python 2.5 版本后才支持的語法。在那之前,Python 社區一度認為三元表達式沒有必要,我們需要使用 x and a or b 的方式來模擬它。[注]

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

所以,請記得只用三元表達式處理簡單的邏輯分支。

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

對于絕大多數情況,還是使用普通的 if/else 語句吧。

審核編輯:湯梓紅

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

    關注

    30

    文章

    4967

    瀏覽量

    73954
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

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

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    1688 商品詳情 API 調用與數據解析 Python 實戰

    你想要的是 1688 商品詳情 API 的 Python 調用與數據解析實戰方案,核心是完成 API 憑證配置、接口請求(含簽名)、響應數據解析、異常處理 的全流程落地,我會提供可直接運行的代碼,并
    的頭像 發表于 02-10 11:23 ?248次閱讀

    Termux中調試圣誕樹Python代碼

    在Termux中調試Python代碼(以圣誕樹立例)非常簡單,核心分為環境準備、代碼編寫、運行調試三個步驟,下面一步步教你操作: 一、環境準備(首次使用需做) Termux默認可能沒有Pyth
    發表于 12-09 09:02

    C語言的分支結構介紹

    1.簡單if語句 C語言中的分支結構語句中的if條件語句。 簡單if語句的基本結構如下: 代碼語言:javascript if(表達式) { 執行代碼塊; } 其語義是:如果表達式的值為真,則執行其后的語句,否則不執
    發表于 11-25 07:48

    蜂鳥E203簡單分支預測的改進

    1.蜂鳥E203的原有分支預測 蜂鳥E203處理器為了能夠連續不斷的取指令,需要在每個時鐘周期都能生成一條待取的指令。因此,在取指令的階段,IFU單元模塊進行了簡單的譯碼處理,用以判別
    發表于 10-24 07:45

    提高條件分支指令預測正確率的方法

    基于全局分支歷史的ghare分支預測器 主要構成 分支目標緩沖器BTB 分支歷史寄存器BHR 方式歷史寄存器PHT 對于某個條件分支指令
    發表于 10-22 08:22

    基于全局預測歷史的gshare分支預測器的實現細節

    GShare預測機制簡介 GShare預測機制作為一種常用的分支預測機制,通過基于分支歷史和分支地址來預測分支指令的執行路徑。分支歷史是指
    發表于 10-22 06:50

    淘寶商品詳情接口(item_get)企業級全解析:參數配置、簽名機制與 Python 代碼實戰

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

    愛回收商品詳情接口全方位對接指南:從認證機制到數據提取最佳實踐(附 Python 代碼 + 成色數據處理)

    本文詳解愛回收二手數碼商品詳情接口對接,涵蓋認證、簽名生成、成色映射、估價緩存等核心環節,提供可復用代碼與避坑指南,解決簽名失敗、數據延遲等常見問題。
    的頭像 發表于 09-25 10:33 ?863次閱讀

    VVIC 平臺商品詳情接口高效調用方案:從簽名驗證到數據解析全流程

    本文詳解VVIC平臺商品詳情接口調用全流程,涵蓋參數配置、簽名生成、異常處理與數據解析,提供可復用的Python代碼及避坑指南,助力開發者高效實現安全、穩定的數據對接。
    的頭像 發表于 09-23 10:28 ?684次閱讀

    termux如何搭建python游戲

    用VS Code編輯 - 版本控制:`git`管理代碼,同步至GitHub/Gitee - 任務調度:通過`crontab`設置定時測試(如每分鐘運行游戲腳本:`*/1 * * * * python
    發表于 08-29 07:06

    如何統計蜂鳥E203的分支預測率?

    想請問大家如何統計蜂鳥E203的分支預測率,我嘗試在exu_commit模塊統計,但是發現預測率都有寫問題,想請教以下大家
    發表于 06-10 07:05

    零基礎入門:如何在樹莓派上編寫和運行Python程序?

    是一種非常有用的編程語言,其語法易于閱讀,允許程序員使用比匯編、C或Java等語言更少的代碼行。Python編程語言最初實際上是作為Linux的腳本語言而開發的。Py
    的頭像 發表于 03-25 09:27 ?2025次閱讀
    零基礎入門:如何在樹莓派上編寫和運行<b class='flag-5'>Python</b>程序?

    使用Python API在OpenVINO?中創建了用于異步推理的自定義代碼,輸出張量的打印結果會重復,為什么?

    使用 Python* API 在 OpenVINO? 中創建了用于異步推理的自定義代碼。 遇到輸出張量的打印結果會重復的問題,即使輸入圖像不同。
    發表于 03-06 07:53

    創建了用于OpenVINO?推理的自定義C++和Python代碼,從C++代碼中獲得的結果與Python代碼不同是為什么?

    創建了用于OpenVINO?推理的自定義 C++ 和 Python* 代碼。 在兩個推理過程中使用相同的圖像和模型。 從 C++ 代碼中獲得的結果與 Python*
    發表于 03-06 06:22

    運行OVModelForCausalLM Python模塊時出錯了,怎么解決?

    創建了一個自定義 Python* 代碼,類似于遵循 240-dolly-2-instruction 的 Jupyter 筆記本。 OVModelForCausalLM Python* 模塊運行時出錯。
    發表于 03-05 06:44