最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

python基礎(chǔ)之單分派泛函數(shù)singledispatch

 更新時(shí)間:2023年08月14日 09:53:40   作者:易辰_  
這篇文章主要介紹了python基礎(chǔ)之單分派泛函數(shù)singledispatch問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

python單分派泛函數(shù)singledispatch

singledispatch 是標(biāo)準(zhǔn)庫(kù) functools 模塊的函數(shù)

可以把整體方案拆成多個(gè)模塊,甚至可以為你無法修改的類提供專門的函數(shù),使用 @singledispatch 裝飾的函數(shù)會(huì)變成泛函數(shù)

1、 singledispatch :標(biāo)記處理object類型的基函數(shù)

2、各個(gè)專門函數(shù)使用 @<<base_function>>.register(<<type>>) 裝飾

3、專門函數(shù)的名稱無關(guān)緊要, _ 是個(gè)不錯(cuò)的選擇,簡(jiǎn)單明了

4、為每個(gè)需要處理的類型注冊(cè)一個(gè)函數(shù)5、可以疊放多個(gè) register 裝飾器,讓同一個(gè)函數(shù)支持不同類型

函數(shù)中使用

我們來看一個(gè)例子了解下:

from functools import singledispatch
from collections import  abc
@singledispatch
def show(obj):
    print (obj, type(obj), "obj")
#參數(shù)字符串
@show.register(str)
def _(text):
    print (text, type(text), "str")
#參數(shù)int
@show.register(int)
def _(n):
    print (n, type(n), "int")
#參數(shù)元祖或者字典均可
@show.register(tuple)
@show.register(dict)
def _(tup_dic):
    print (tup_dic, type(tup_dic), "int")
show(1)
show("xx")
show([1])
show((1,2,3))
show({"a":"b"})

輸出如下:

1 <class 'int'> int
xx <class 'str'> str
[1] <class 'list'> obj
(1, 2, 3) <class 'tuple'> int
{'a': 'b'} <class 'dict'> int

好處是什么呢?類似于java的重載機(jī)制,可以在一個(gè)類中為同一個(gè)方法定義多個(gè)重載變體,比在一個(gè)函數(shù)中使用一長(zhǎng)串的 if/elif

對(duì)象中使用

我們來看一個(gè)對(duì)象的例子

from functools import singledispatch
class abs:
    def type(self,args):
        ""
class Person(abs):
    @singledispatch
    def type(self,args):
        super().type("",args)
        print("我可以接受%s類型的參數(shù)%s"%(type(args),args))
    @type.register(str)
    def _(text):
        print("str",text)
    @type.register(tuple)
    def _(text):
        print("tuple", text)
    @type.register(list)
    @type.register(dict)
    def _(text):
        print("list or dict", text)
Person.type("safly")
Person.type((1,2,3))
Person.type([1,2,3])
Person.type({"a":1})
Person.type(Person,True)

輸出如下:

str safly
tuple (1, 2, 3)
list or dict [1, 2, 3]
list or dict {'a': 1}
我可以接受<class 'bool'>類型的參數(shù)True

python的singledispatch裝飾器

最近一直在學(xué)習(xí)裝飾器的相關(guān)知識(shí),學(xué)習(xí)到了functools中的singledispatch裝飾器,記錄一下

1.Python中不需要使用函數(shù)重載的原因

Python中一般是不需要使用函數(shù)的重載的。一般的靜態(tài)語言例如C#是支持函數(shù)的重載的,為了就是多態(tài)以及代碼的重用。

例如我們現(xiàn)在想要實(shí)現(xiàn)一個(gè)函數(shù),它可以輸出輸入?yún)?shù)的類型,用C#函數(shù)的重載實(shí)現(xiàn)的代碼如下

static void GetType(string input)
{
?? ?Console.WriteLine("{0}是string類型", input);
}
static void GetType(int input)
{
?? ?Console.WriteLine("{0}是int類型", input);
}
static void GetType(string[] input)
{
?? ?Console.WriteLine("{0}是數(shù)組類型", input);
}
static void GetType(Dictionary<string,string> input)
{
?? ?Console.WriteLine("{0}是字典類型", input);
}

此時(shí)如果想使用Python實(shí)現(xiàn)則不需要使用函數(shù)的重載,因?yàn)镻ython本身就是動(dòng)態(tài)語言,不要在函數(shù)的參數(shù)中指定參數(shù)的類型,可以直接在函數(shù)體中判斷變量的類型并且執(zhí)行相應(yīng)的語句即可:

def print_type(obj):
? ? """輸出參數(shù)obj的類型"""
? ? if isinstance(obj, int):
? ? ? ? print(f"{obj}的類型是int")
? ? elif isinstance(obj, str):
? ? ? ? print(f"{obj}的類型是str")
? ? elif isinstance(obj, list):
? ? ? ? print(f"{obj}的類型是list")
? ? elif isinstance(obj, dict):
? ? ? ? print(f"{obj}的類型是dict")
? ? else:
? ? ? ? print(f"{obj}是其他類型")

2.Python中的泛函數(shù)以及singledispatch

上面簡(jiǎn)單的代碼雖然使用Python也實(shí)現(xiàn)了功能,但是如果功能再?gòu)?fù)雜一點(diǎn)則我們需要寫更多的if-elif語句,并且如果函數(shù)需要根據(jù)參數(shù)的類型來執(zhí)行對(duì)應(yīng)的子函數(shù)的話此時(shí)代碼會(huì)更臃腫,并且不利于功能的擴(kuò)展。

為此,在Python3.4以后在標(biāo)準(zhǔn)庫(kù)中functools中加入了singledispatch裝飾器。被singledispatch裝飾的函數(shù)稱為泛函數(shù),由此實(shí)現(xiàn)的也被稱為單分派泛函數(shù)。

其實(shí)在Python的標(biāo)準(zhǔn)庫(kù)中就存在泛函數(shù),例如len(),它就會(huì)根據(jù)傳入?yún)?shù)的類型去讀取相應(yīng)的C結(jié)構(gòu)體中對(duì)象的長(zhǎng)度。但是在Python3.4以前用戶是沒有辦法實(shí)現(xiàn)類似Pythonic的泛函數(shù)的。

并且有時(shí)候當(dāng)使用不是自己編寫的或者是無法修改的類的時(shí)候,我們需要向其中添加我們自定義的函數(shù),此時(shí)就很難做到。但是有了singledispatch之后就會(huì)變得很容易。

下面為使用泛函數(shù)實(shí)現(xiàn)上述代碼功能:

from functools import singledispatch
from collections import abc
import numbers
@singledispatch
def print_type_new(obj): ?
? ? pass
@print_type_new.register(numbers.Integral) ?
def _(n):?
? ? print(f"{n}的類型是Integral")
@print_type_new.register(str)
def _(text):
? ? print(f"{text}的類型是str")
@print_type_new.register(tuple)
@print_type_new.register(abc.MutableSequence)
def _(text):
? ? print(f"{text}的類型是Sequence")
@print_type_new.register(abc.Mapping)
def _(text):
? ? print(f"{text}的類型是Mapping")

使用singledispatch的時(shí)候,首先需要裝飾一個(gè)基函數(shù)f(一般參數(shù)類型為object),之后需要為各個(gè)專門的函數(shù)使用類似于@f.register(type)之類的裝飾器,并且要為每個(gè)需要特殊處理的類型注冊(cè)一個(gè)函數(shù),同時(shí)為了代碼的兼容性,該專門函數(shù)應(yīng)該盡可能的只處理抽象基類而不要處理具體實(shí)現(xiàn)(FluentPython P172)。

注意:

在Python如果需要根據(jù)傳入?yún)?shù)的類型來讓函數(shù)執(zhí)行不同的操作,則此時(shí)應(yīng)該將函數(shù)寫成泛函數(shù),即使用singledispatch裝飾器。

注意singledispatch并不是重載,因?yàn)橹剌d還有類似于參數(shù)類型相同,但是數(shù)量不同,這種類似的情況在Python中只需要使用可變參數(shù)*即可以解決。

singledispatch的引入本質(zhì)是為了讓用戶可以自定義泛函數(shù),以便可以處理在需要根據(jù)參數(shù)的類型做出相同操作的場(chǎng)合以及為第三方類添加自定義的函數(shù),這一切都是為了提高程序的可擴(kuò)展性。

總結(jié)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • Python如何使用標(biāo)準(zhǔn)庫(kù)tmpfile庫(kù)創(chuàng)建臨時(shí)文件

    Python如何使用標(biāo)準(zhǔn)庫(kù)tmpfile庫(kù)創(chuàng)建臨時(shí)文件

    這篇文章主要介紹了Python如何使用標(biāo)準(zhǔn)庫(kù)tmpfile庫(kù)創(chuàng)建臨時(shí)文件問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python字符串定義的三種方式

    python字符串定義的三種方式

    在Python中,字符串是一個(gè)非常重要的數(shù)據(jù)類型,可用來存儲(chǔ)和操作文本數(shù)據(jù),本文主要介紹了python字符串定義的三種方式,具有一定的參考價(jià)值,感興趣的可以了解一下
    2023-05-05
  • 三分鐘python搭建支付寶三方支付

    三分鐘python搭建支付寶三方支付

    本文主要介紹了三分鐘python搭建支付寶三方支付,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-12-12
  • py3nvml實(shí)現(xiàn)GPU相關(guān)信息讀取的案例分析

    py3nvml實(shí)現(xiàn)GPU相關(guān)信息讀取的案例分析

    這篇文章主要介紹了py3nvml實(shí)現(xiàn)GPU相關(guān)信息讀取,此時(shí)就可以考慮使用py3nvml這樣的工具,針對(duì)于GPU任務(wù)執(zhí)行的過程進(jìn)行細(xì)化的分析,有助于提升GPU的利用率和程序執(zhí)行的性能,需要的朋友可以參考下
    2022-01-01
  • python中torch.load中的map_location參數(shù)使用

    python中torch.load中的map_location參數(shù)使用

    在PyTorch中,torch.load()函數(shù)是用于加載保存模型或張量數(shù)據(jù)的重要工具,map_location參數(shù)為我們提供了極大的靈活性,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 如何在C++中調(diào)用Python

    如何在C++中調(diào)用Python

    雖然現(xiàn)在Python編程語言十分的火爆,但是實(shí)際上非要用一門語言去完成所有的任務(wù),并不是說不可以,而是不合適。在一些特定的、對(duì)于性能要求比較高的場(chǎng)景,還是需要用到傳統(tǒng)的C++來進(jìn)行編程的。本文將用C++的代碼去調(diào)用Python函數(shù)中實(shí)現(xiàn)的一些功能
    2021-05-05
  • Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸之線性回歸示例詳解

    Python數(shù)學(xué)建模StatsModels統(tǒng)計(jì)回歸之線性回歸示例詳解

    這篇文章主要為大家介紹了Python數(shù)學(xué)建模中StatsModels統(tǒng)計(jì)回歸之線性回歸的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-10-10
  • Python中表格插件Tabulate的用法小結(jié)

    Python中表格插件Tabulate的用法小結(jié)

    這篇文章主要介紹了Python中表格插件Tabulate的用法,Tabulate插件是一個(gè)功能強(qiáng)大、簡(jiǎn)單易用的數(shù)據(jù)可視化工具,它能夠滿足我們?cè)赑ython中進(jìn)行表格數(shù)據(jù)展示的各種需求,通過使用Tabulate插件,我們能夠輕松地生成美觀且易讀的表格,需要的朋友可以參考下
    2023-11-11
  • Python 腳本死鎖問題與解決方案

    Python 腳本死鎖問題與解決方案

    在腳本中,可以創(chuàng)建一個(gè)隊(duì)列來存儲(chǔ)子進(jìn)程的輸出,然后由主進(jìn)程從隊(duì)列中讀取輸出并進(jìn)行處理,這篇文章主要介紹了Python 腳本死鎖問題與解決方案,需要的朋友可以參考下
    2024-06-06
  • 利用Python統(tǒng)計(jì)每天敲了多少次鍵盤

    利用Python統(tǒng)計(jì)每天敲了多少次鍵盤

    每到年末各大App都會(huì)給你來一次年度總結(jié),最近突發(fā)奇想,鍵盤是每天必備的工具,為啥不給鍵盤也來個(gè)工作總結(jié),本文就來用Python統(tǒng)計(jì)一下每天敲了多少次鍵盤吧
    2024-04-04

最新評(píng)論

秦皇岛市| 黔江区| 石泉县| 临澧县| 海林市| 阳西县| 固原市| 石渠县| 临湘市| 清苑县| 民乐县| 乐山市| 临沭县| 宁强县| 繁昌县| 福海县| 太仆寺旗| 承德县| 六盘水市| 交口县| 钟祥市| 阿勒泰市| 邵东县| 嘉黎县| 寿宁县| 周口市| 万宁市| 丹凤县| 营山县| 广汉市| 新田县| 九江县| 厦门市| 锡林浩特市| 福安市| 通榆县| 汪清县| 锡林郭勒盟| 北川| 天等县| 克什克腾旗|