色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    4801

    瀏覽量

    68735
  • python
    +關注

    關注

    56

    文章

    4799

    瀏覽量

    84810
收藏 人收藏

    評論

    相關推薦

    請問使用AFE4400SPO2EVM測試完之后,GUI里面的數據如何作為原始數據導入到python操作界面呢?

    請問使用AFE4400SPO2EVM測試完之后,GUI里面的數據如何作為原始數據導入到python操作界面呢?
    發表于 01-03 07:38

    十幾種格力空調故障代碼詳解

    十幾種格力空調故障代碼詳解,查表一目了然
    發表于 11-27 15:15 ?0次下載

    使用Python進行串口通信的案例

    python復制代碼 import serialimport time # 配置串口參數serial_port = '/dev/ttyUSB0' # 在Windows上可能是 'COM3' 或其他類
    的頭像 發表于 11-22 09:11 ?280次閱讀

    對比Python與Java編程語言

    Python與Java都是目前非常流行的編程語言,它們各有其獨特的優勢和適用場景。以下是對這兩種編程語言的對比: 一、語法和易用性 Python 語法簡潔,代碼更易讀,非常適合初學者。 動態類型系統
    的頭像 發表于 11-15 09:31 ?349次閱讀

    Python代理技術詳解:從入門到進階

    Python代理技術是一種在網絡編程中廣泛使用的技術,它允許通過代理服務器發送和接收網絡請求。
    的頭像 發表于 11-12 07:06 ?268次閱讀

    使用Python進行圖像處理

    下面是一個關于使用Python在幾行代碼中分析城市輪廓線的快速教程。
    的頭像 發表于 11-07 10:14 ?249次閱讀
    使用<b class='flag-5'>Python</b>進行圖像處理

    Python常用函數大全

    Python 世界,有一些寶藏函數和模塊,它們可以讓你編程更輕松、代碼更高效。這篇文章將帶你一一認識這些神器,讓你的開發生活瞬間輕松不少!
    的頭像 發表于 10-27 17:20 ?287次閱讀

    PDF文件批量打印源代碼

    壓縮包中包含可批量打印PDF文件的Python代碼,可以借助PYcharm工具執行,實現多PDF文件同時打印。
    發表于 08-08 14:26 ?0次下載

    pytorch和python的關系是什么

    ,PyTorch已經成為了一個非常受歡迎的框架。本文將介紹PyTorch和Python之間的關系,以及它們在深度學習領域的應用。 Python簡介 Python是一種高級、解釋型、通用的編程語言,由Guido van Rossu
    的頭像 發表于 08-01 15:27 ?2074次閱讀

    用pycharm進行python爬蟲的步驟

    提供了許多有用的功能,如代碼自動完成、調試和版本控制等。您可以從JetBrains的官方網站下載PyCharm,并根據您的需求選擇免費社區版或付費專業版。 創建一個新的Python項目 打開
    的頭像 發表于 07-11 10:11 ?888次閱讀

    深度學習常用的Python

    深度學習作為人工智能的一個重要分支,通過模擬人類大腦中的神經網絡來解決復雜問題。Python作為一種流行的編程語言,憑借其簡潔的語法和豐富的庫支持,成為了深度學習研究和應用的首選工具。本文將深入探討
    的頭像 發表于 07-03 16:04 ?666次閱讀

    谷歌升級Bard AI聊天機器人為Gemini,新增Python代碼編輯功能

     此外,谷歌表示,接下來數個月內,Gemini Advanced 計劃會加入更多新功能,如支持更為詳盡的上下文信息、增強多模態交互性以及完善編程功能。據谷歌公開更新,付費用戶可用 Gemini 界面直接編輯和執行 Python 代碼,有助于快速驗證試驗
    的頭像 發表于 02-20 15:47 ?610次閱讀

    python中open函數的用法詳解

    python中open函數的用法詳解 Python中的open()函數用于打開文件。它接受文件名和模式作為參數,并返回一個文件對象。文件對象可用于讀取、寫入和管理文件。 open()函數的基本語法
    的頭像 發表于 01-30 15:31 ?2164次閱讀

    制造企業分支機構如何高效互聯?

    ? 隨著制造企業業務的不斷擴張,分布在不同地區的分支機構逐漸成為提高市場覆蓋和降低生產成本的重要手段。然而,分支機構的增多也帶來了管理和協調的挑戰。為了有效管理和協調各個分支機構的運營,建立一個高效
    的頭像 發表于 01-25 16:26 ?460次閱讀

    Python智能家居系統代碼介紹

    Python智能家居系統是一種基于Python編程語言開發的智能家居控制系統,在現代家庭中得到了越來越廣泛的應用。本文將詳細介紹Python智能家居系統的代碼實現,包括系統的結構與功能
    的頭像 發表于 01-25 09:46 ?1393次閱讀
    主站蜘蛛池模板: 青柠在线观看免费全集| 欧洲video60| 狠狠躁日日躁人人爽| 国产色欲一区二区精品久久呦| 鬼灭之刃花街篇免费樱花动漫 | 精品久久久久中文字幕| 亚洲精品一区三区三区在线观看| 午夜人妻理论片天堂影院| 玩两个少妇女邻居| 亚洲 无码 制服 日韩| 亚洲欧美日韩在线码不卡| 在线播放一区| 午夜神器18以下不能进免费| 亚洲精品无码葡京AV天堂| 樱花草在线影视WWW日本动漫| 51国产午夜精品免费视频| jyzzjyzzz视频国产在线观看 | 精品一区二区三区免费观看| 老鸭窝毛片| 手机看片国产免费| 琪琪色原网20岁以下热热色原网站| 秋霞伦理手机在线看片| 亚洲AV无码久久流水呻蜜桃久色| 亚洲伊人成综合人影院| asian极品呦女xx农村| 国产伦子沙发午休系列资源曝光| 久久热在线视频精品1| 日本zljzljzlj精品| 亚洲欧美国产综合在线| 99热这里只有是精品| 果冻传媒在线观看进入窗口| 欧美一区二区在线观看| 亚洲视频91| 国产 精品 亚洲 欧美 高清| 久久99国产精品二区不卡| 少妇人妻偷人精品视蜜桃| 最近更新2019中文字幕国语| 国产人妻人伦精品59HHH| 欧美一区二区激情视频| 在线欧美精品一区二区三区| 国产免费变态视频网址网站 |