<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          Python小技巧!如何簡化大量的 if…elif…else 代碼?

          共 3587字,需瀏覽 8分鐘

           ·

          2021-12-11 05:32

          花下貓語:在日常代碼中,我們總是會面對大量 if...elif...else 條件分支選擇的問題。說實(shí)話,我在多數(shù)情況下首推就是老老實(shí)實(shí)地寫 if...elif,并且設(shè)法把每個分支下的內(nèi)容抽取成獨(dú)立的函數(shù)。結(jié)構(gòu)清晰,意圖明白,對于編寫和閱讀都是極大的便利。不過,在某些特殊的情況下,還可以使用其它更為優(yōu)雅的寫法,比如我們之前分享過的《不使用 if-elif 語句,如何優(yōu)雅地判斷某個數(shù)字所屬的等級?》,以及今天要分享的這篇文章,可以開闊一下代碼編寫思路。

          今天在 Github 閱讀EdgeDB[1]的代碼,發(fā)現(xiàn)它在處理大量if...elif...else判斷的時候,使用了一個非常巧妙的裝飾器。我們來看看這個方法具體是什么樣的。

          正好今天是雙十一,假設(shè)我們要做一個功能,根據(jù)用戶的等級判斷他可以獲得的折扣。常規(guī)的if ... elif...寫法是這樣的:

          def?get_discount(level):
          ????if?level?==?1:
          ????????"大量計算代碼"
          ????????discount?=?0.1
          ????elif?level?==?2:
          ????????"大量計算代碼"
          ????????discount?=?0.2
          ????elif?level?==?3:
          ????????discount?=?0.3
          ????elif?level?==?4:
          ????????discount?=?0.4
          ????elif?level?==?5:
          ????????discount?=?0.5
          ????elif?level?==?6:
          ????????discount?=?3?+?2?-?5?*?0.1
          ????else:
          ?????????return?'等級錯誤'
          ????return?discount

          大家都知道,這樣大量的if ... elif...代碼非常難看,也很難維護(hù)。并且每個 if 的內(nèi)部有很多代碼。這個函數(shù)就會被拉得非常長。

          有一些同學(xué)知道,可以使用字典來改寫這個太長的 if 判斷:

          def?parse_level_1():
          ????"大量計算代碼"
          ????discount?=?0.1
          ????return?discount

          def?parse_level_2():
          ????"大量計算代碼"
          ????discount?=?0.2
          ????return?discount

          def?parse_level_3():
          ????"大量計算代碼"
          ????discount?=?0.3
          ????return?discount

          def?parse_level_4():
          ????"大量計算代碼"
          ????discount?=?0.4
          ????return?discount

          def?parse_level_5():
          ????"大量計算代碼"
          ????discount?=?0.5
          ????return?discount

          def?parse_level_6():
          ????"大量計算代碼"
          ????discount?=?3?+?2?-?5?*?0.1
          ????return?discount

          discount_map?=?{
          ?1:?parse_level_1,
          ??2:?parse_level_2,
          ??3:?parse_level_3,
          ??4:?parse_level_4,
          ??5:?parse_level_5,
          ??6:?parse_level_6,
          }

          discount?=?discount_map.get(level,?'等級錯誤')

          但今天我學(xué)到的這個方法,比用字典更簡單。我們先來看它的效果:

          @value_dispatch
          def?get_discount(level):
          ????return?'等級錯誤'

          @get_discount.register(1)
          def?parse_level_1(level):
          ????"大量計算代碼"
          ????discount?=?0.1
          ????return?discount

          @get_discount.register(2)
          def?parse_level_2(level):
          ????"大量計算代碼"
          ????discount?=?0.2
          ????return?discount

          @get_discount.register(3)
          def?parse_level_3(level):
          ????"大量計算代碼"
          ????discount?=?0.3
          ????return?discount

          @get_discount.register(4)
          def?parse_level_4(level):
          ????"大量計算代碼"
          ????discount?=?0.4
          ????return?discount

          @get_discount.register(5)
          def?parse_level_5(level):
          ????"大量計算代碼"
          ????discount?=?0.5
          ????return?discount

          @get_discount.register(6)
          def?parse_level_1(level):
          ????"大量計算代碼"
          ????discount?=?3?+?2?-?5?*?0.1
          ????return?discount


          discount?=?get_discount(3)
          print(f'等級3的用戶,獲得的折扣是:{discount}')

          運(yùn)行效果如下圖所示:

          這樣寫,比用字典的方式更直觀,比直接用if ... elif...更簡潔。

          那么,這個裝飾器value_dispatch是怎么實(shí)現(xiàn)的呢?密碼就藏在這個開源項目EdgeDB源代碼[2]中,核心代碼只有20多行:

          并且,還能夠?qū)崿F(xiàn)或查詢。例如用戶等級為2或者3的時候,折扣都是0.2,那么代碼可以寫成:

          @get_discount.register(2)
          @get_discount.register(3)
          def?parse_level_2(level):
          ????"大量計算代碼"
          ????discount?=?0.2
          ????return?discount

          運(yùn)行效果如下圖所示:

          它這個代碼目前只能實(shí)現(xiàn)相等的查詢。但其實(shí)只要對這個代碼稍作修改,我們就能實(shí)現(xiàn)大于、小于、大于等于、小于等于、不等于、in等等判斷。如果大家有興趣的話,請在文章下面留言,我們明天就來說說怎么對這個代碼進(jìn)行改造,實(shí)現(xiàn)更多的邏輯判斷。

          參考文獻(xiàn)

          [1]?EdgeDB:?https://github.com/edgedb/edgedb

          [2] 源代碼:?https://github.com/edgedb/edgedb/blob/master/edb/common/value_dispatch.py






          推薦閱讀:

          入門:?最全的零基礎(chǔ)學(xué)Python的問題? |?零基礎(chǔ)學(xué)了8個月的Python??|?實(shí)戰(zhàn)項目?|學(xué)Python就是這條捷徑


          干貨:爬取豆瓣短評,電影《后來的我們》?|?38年NBA最佳球員分析?|? ?從萬眾期待到口碑撲街!唐探3令人失望? |?笑看新倚天屠龍記?|?燈謎答題王?|用Python做個海量小姐姐素描圖?|碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          趣味:彈球游戲? |?九宮格? |?漂亮的花?|?兩百行Python《天天酷跑》游戲!


          AI:?會做詩的機(jī)器人?|?給圖片上色?|?預(yù)測收入?|?碟中諜這么火,我用機(jī)器學(xué)習(xí)做個迷你推薦系統(tǒng)電影


          小工具:?Pdf轉(zhuǎn)Word,輕松搞定表格和水印!?|?一鍵把html網(wǎng)頁保存為pdf!|??再見PDF提取收費(fèi)!?|?用90行代碼打造最強(qiáng)PDF轉(zhuǎn)換器,word、PPT、excel、markdown、html一鍵轉(zhuǎn)換?|?制作一款釘釘?shù)蛢r機(jī)票提示器!?|60行代碼做了一個語音壁紙切換器天天看小姐姐!


          年度爆款文案


          點(diǎn)閱讀原文,看200個Python案例!

          瀏覽 88
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點(diǎn)贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  黄色成人三级 | 亚洲人xxxxc | 亚洲乱码国产乱码午夜 | 成人做爱视频网站免费 | 91色在线视频 |