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

          共 1678字,需瀏覽 4分鐘

           ·

          2021-06-27 03:09

          ↑↑↑關(guān)注后"星標"簡說Python

          人人都可以簡單入門Python、爬蟲、數(shù)據(jù)分析
           簡說Python推薦 
          來源:數(shù)據(jù)大宇宙
          作者:卡門的兒子

          前言

          大家好,我是老表

          根據(jù)不同的條件進行不同的計算或操作,是很常見的需求。Python 有 if 語句可以實現(xiàn)。但是一旦分支很多,多個 if 就是使你眼花繚亂。

          我們有許多技巧(套路)來簡化這一過程。我會一連幾篇文章,從簡單到復(fù)雜,教你如何理解和應(yīng)用這些技巧。

          這里,你可以學(xué)到很多 Python 知識點的應(yīng)用:

          1. 字典

          2. 枚舉

          3. 裝飾器


          動態(tài)調(diào)用不同的函數(shù)

          先看數(shù)據(jù):

          • 列[計算方式],決定了列[調(diào)整]的計算結(jié)果

          每一種計算方式如下:

          聰明的方法,為每一種計算單獨定義了函數(shù):

          但是,該怎么調(diào)用這些函數(shù)呢?

          "很簡單呀,判斷,然后調(diào)用":

          • 行9:為了防止出現(xiàn)遺漏的計算方式

          這看起來不錯,但是,每新增一種方式,就要在這里追加一個判斷,一旦分支很多,這里的代碼就會非常冗長:

          為什么我一直讓每一塊代碼盡可能簡短?

          因為我們每次處理一個獨立小問題會比處理大問題要高效得多,大問題意味著涉及很多小問題。同時解決多個小問題,會讓我們的大腦短路。


          單獨聲明映射關(guān)系

          如果我們可以這樣子定義計算方式與函數(shù)的關(guān)系,那就很舒服了:

          "這看著有點眼熟,不就是字典嗎?"

          對,字典就是用來表達這種一對一關(guān)系的最佳結(jié)構(gòu)。

          你可以把字典當(dāng)作是一個過目不忘(死記硬背)的記憶高手,只要他過一遍數(shù)據(jù)之后,你給他一個 key 值,他能馬上找出對應(yīng)的 value 值給你。

          于是,我們可以把計算方式與定義的每個函數(shù)給他記憶:

          接下來,真正處理每一行數(shù)據(jù)的時候,只需要讓他(字典)取出函數(shù),然后調(diào)用即可:

          • 行2-4:特別要注意,字典的 value 我們只是給了函數(shù)名字,千萬別在后面加括號,括號是表示執(zhí)行函數(shù)?,F(xiàn)在我們不需要執(zhí)行函數(shù)呢

          • 調(diào)用的時候,別忘記給函數(shù)傳入需要計算的指標

          • 不僅代碼簡單了,如果你有留意左下角的運行時間,你會發(fā)現(xiàn)這種方式比之前的方式提速了

          現(xiàn)在我們的代碼挺不錯,如果數(shù)據(jù)中出現(xiàn)了新的計算方式,但我們忘記加入字典,那么代碼運行就會報錯:

          • 行4:注釋掉,相當(dāng)于我們忘記定義計算方式C

          • 可以看到錯誤信息,能讓我們馬上聯(lián)想到原因

          "一舉兩得,太完美了!"

          但是,如果你跟我學(xué)習(xí) pandas ,就會知道,pandas 中盡可能避免自己遍歷處理數(shù)據(jù)。

          pandas 的簡潔程度與計算效率不是我們自己遍歷處理可以比得過。


          pandas 處理方式真的就完美?

          這個例子中,每一種的計算方式的區(qū)別僅僅在于后面的系數(shù):

          這種情況下,其實我們可以先批量把每一行對應(yīng)的系數(shù)取出來,然后直接計算:

          • 注意執(zhí)行時間,又提速了

          別以為這只是 pandas 把 for 遍歷給你寫了而已,他是基于 numpy 的,而numpy處理時都是基于 c++ 的調(diào)用,性能非??焖?/p>

          這種方式其實也有他的缺點:

          1. Series.map 方法的確做了字典取值做的事情,但是在他找不到key時,是不會報錯的。我們需要后續(xù)通過判斷 nan 來檢查

          2. 有時候計算邏輯沒有這么簡單,比如需要看銷量是否超過同地區(qū)的平均值做出不同的計算分支。這時候使用 pandas 的方式就會感覺邏輯被分散(下一節(jié)我們來看看這種情況下的處理)

          "那么,之前的字典聲明方式,是不是就是這種場景下最通用的方式?"


          思考題

          用字典聲明對應(yīng)關(guān)系其實已經(jīng)非常好了,但是如果能在定義函數(shù)的地方上直接標記對應(yīng)關(guān)系,那么也挺好:

          • 不再需要定義字典關(guān)系了

          怎么可以做到這種效果呢?有興趣的小伙伴不妨試試。

          --END--



          掃碼即可加我微信

          老表朋友圈經(jīng)常有贈書/紅包福利活動


          學(xué)習(xí)更多:
          整理了我開始分享學(xué)習(xí)筆記到現(xiàn)在超過250篇優(yōu)質(zhì)文章,涵蓋數(shù)據(jù)分析、爬蟲、機器學(xué)習(xí)等方面,別再說不知道該從哪開始,實戰(zhàn)哪里找了

          優(yōu)秀的讀者都知道,“點贊”傳統(tǒng)美德不能丟 

          瀏覽 51
          點贊
          評論
          收藏
          分享

          手機掃一掃分享

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

          手機掃一掃分享

          分享
          舉報
          <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>
                  色欲成人网 | 奇米888四色成人影视色区 | 丰满女人做爱视频 | 日韩精品在线免费观看 | 任我操视频在线 |