1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        Python “偏函數(shù)” 用法全方位解析

        共 2035字,需瀏覽 5分鐘

         ·

        2020-06-30 23:20

        08ed8f38ec1cd60b65ff7d05555c1cc3.webp

        作者:張生榮?

        來源:zhangshengrong.com/p/O3aA7r2kX4

        Python的functools模塊中有一種函數(shù)叫“偏函數(shù)”,自從接觸它以來,發(fā)現(xiàn)確實(shí)是一個很有用且簡單的函數(shù),相信你看完這篇文章,你也有相見恨晚的感覺。

        我們都知道,函數(shù)入?yún)⒖梢栽O(shè)置默認(rèn)值來簡化函數(shù)調(diào)用,而偏函數(shù)的作用就是將入?yún)⑦M(jìn)行默認(rèn)填充,降低函數(shù)使用的難度。

        如int()函數(shù),可以將字符型轉(zhuǎn)換為整型,且默認(rèn)的都是以十進(jìn)制形式來轉(zhuǎn)換,那為什么一定是十進(jìn)制呢?如果想用以二進(jìn)制的形式轉(zhuǎn)換呢?其實(shí)我們可以看一下int函數(shù)它本身的定義偏函數(shù),一個讓你相見恨晚的實(shí)用函數(shù)

        c2cee8c4696dcfe7db523aac438d28d8.webp

        可以看到int有兩種用法,可以傳一個位置參數(shù),還可以多傳一個關(guān)鍵字參數(shù)base,也就是基于什么格式轉(zhuǎn)換,默認(rèn)不傳base參數(shù)是以十進(jìn)制轉(zhuǎn)換。所以,用二進(jìn)制形式轉(zhuǎn)換的話只要base=2即可(見下方代碼)

        value?=?int('10000')
        print(value)??#?10000

        value?=?int('10000',?base=2)
        print(value)??#?16

        如果每次轉(zhuǎn)換的字符串的時候都要輸入base參數(shù),顯得很麻煩,因此偏函數(shù)的作用就體現(xiàn)出來了,可以使用functools.partial()函數(shù)來重新定義

        from?functools?import?partial

        int2?=?partial(int,?base=2)
        res?=?int2('10000')
        print(res)???#?16

        到這里,你應(yīng)該已經(jīng)感覺到了偏函數(shù)的一點(diǎn)點(diǎn)魅力吧,那我們再從多個角度進(jìn)一步看透它。

        自定義函數(shù)的使用

        def?add(a,?b,?c):
        ??print('a=',a,'b=',b,'c=',c)
        ??return?a?+?b?+?c

        add10?=?partial(add,?10)
        res?=?add10(1,?2)???#?a=?10?b=?1?c=?2

        如上代碼中,partial(add, 10)入?yún)⒉]有指定哪個關(guān)鍵字參數(shù),函數(shù)卻默認(rèn)的將這個值傳給了第一個參數(shù)a,那就說明,當(dāng)沒有指定默認(rèn)參數(shù)時,默認(rèn)賦值給第一個參數(shù),余下參數(shù)按位置參數(shù)賦值。

        當(dāng)入?yún)榭勺儏?shù)時

        def?sum(*args):
        ??s?=?0
        ??for?n?in?args:
        ????s?+=?n
        ??return?s

        sum10?=?partial(sum,?10)
        print(sum10(1))??#?11
        print(sum10())???#?10

        按上述理解,沒有指定默認(rèn)參數(shù)時,默認(rèn)賦給第一個參數(shù),那么第一個參數(shù)永遠(yuǎn)是10,后面再傳入?yún)⒌脑捑蛷牡诙€參數(shù)開始計(jì)算,因此會實(shí)現(xiàn)10 + 1 = 11 的結(jié)果。同樣,如果不繼續(xù)傳參的話,只有默認(rèn)的10,所以結(jié)果就是10

        當(dāng)入?yún)榭勺冴P(guān)鍵字參數(shù)時

        D?=?{'value1':10,?'value2':20}
        V?=?{'Default':100}
        def?show(**kw):
        ??for?k?in?kw:
        ????print(k,?kw.get(k))

        showDef?=?partial(show,?**V)
        showDef(**D)
        #?Default?100
        #?value1?10
        #?value2?20

        同理,此時入?yún)⒂捎谑强勺儏?shù),因此默認(rèn)是第一個傳入,先打印Default關(guān)鍵字,這里關(guān)注一下函數(shù)的寫法,可變關(guān)鍵字參數(shù)要寫成(**V)

        當(dāng)入?yún)橄拗频年P(guān)鍵字參數(shù)時

        def?student(name,?*?,?age,?city):
        ??print('name:',name,?'age:',age,?'city:',city)

        studentAge?=?partial(student,?age=20)
        studentAge('Tom','Beijing')
        #?TypeError:?student()?takes?1?positional?argument?but?2?positional?arguments?(and?1?keyword-only?argument)?were?given

        我們知道,當(dāng)用*號分隔開,表示后面的關(guān)鍵字參數(shù)是必傳的,因此對于默認(rèn)參數(shù)也是同樣適用,即當(dāng)參數(shù)為必傳時,偏函數(shù)也需要對每個關(guān)鍵字參數(shù)設(shè)置默認(rèn)值。因此修改后為

        studentAge?=?partial(student,?age=20,?city='Beijing')
        studentAge('Tom')?#?name:?Tom?age:?20?city:?Beijing

        綜上,偏函數(shù)可以將目標(biāo)函數(shù)的部分參數(shù)固化后,重新定義為新的函數(shù),降低了編碼的復(fù)雜度,尤其是當(dāng)參數(shù)很多的時候,或者只用到其中某些參數(shù)的場景下時,效果更為顯著。

        到這里,你是否有了相見恨晚的感覺呢?簡單函數(shù)小技巧,非常實(shí)用的偏函數(shù)用法就介紹完了.

        題圖:pexels,CC0 授權(quán)。

        好文章,我在看??

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

        手機(jī)掃一掃分享

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

        手機(jī)掃一掃分享

        分享
        舉報(bào)
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            邻居少妇张开腿让我爽一夜作文 | 少妇被粗大内捧猛烈进出视频 | 日月俱乐部裸体裸体歌舞 | 国产免费AV片在线无码免费看 | 理伦三韩国一二三区免费 | 歪歪韩漫 | 日本免费无码 | 久久三级 | 国产老熟女高潮毛片A片仙踪林 | 大亂交无碼大亂交HD |