<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>

          如何簡化大量的 if…elif…else 代碼?

          共 2980字,需瀏覽 6分鐘

           ·

          2022-01-11 15:03

          ↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能

          后臺回復(fù)【大禮包】送你Python自學(xué)大禮包

          大家好,我是龍哥!

          花下貓語:在日常代碼中,我們總是會面對大量 if...elif...else 條件分支選擇的問題。說實話,我在多數(shù)情況下首推就是老老實實地寫 if...elif,并且設(shè)法把每個分支下的內(nèi)容抽取成獨立的函數(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}')

          運行效果如下圖所示:

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

          那么,這個裝飾器value_dispatch是怎么實現(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

          運行效果如下圖所示:

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

          參考文獻(xiàn)

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

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


          推薦閱讀

          1. 徹底干掉了 Windows 的 cmd,爽!

          2. 再見了Python爬蟲,商業(yè)分析已成氣候!

          3. CentOS 將于年底終止!

          4. 最近給公司擼了一個可視化大屏。



          瀏覽 21
          點贊
          評論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報
          評論
          圖片
          表情
          推薦
          點贊
          評論
          收藏
          分享

          手機(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>
                  国产精品永久久久久久久WWW | 草逼国产| 亚洲欧美日韩一区二区 | 大香蕉人人操 | 人人干人人摸人人草 |