国产精品久久久aaaa,日日干夜夜操天天插,亚洲乱熟女香蕉一区二区三区少妇,99精品国产高清一区二区三区,国产成人精品一区二区色戒,久久久国产精品成人免费,亚洲精品毛片久久久久,99久久婷婷国产综合精品电影,国产一区二区三区任你鲁

0
  • 聊天消息
  • 系統消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發帖/加入社區
會員中心
創作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

python偏函數和泛型函數詳解

python爬蟲知識分享 ? 來源:python爬蟲知識分享 ? 作者:python爬蟲知識分享 ? 2022-03-03 16:43 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

python偏函數

假如一個函數定義了多個位置參數,那你每次調用時,都需要把這些個參數一個一個地傳遞進去。

比如下面這個函數,是用來計算 x的n次方 的。

def power(x, n):
    s = 1
    while n > 0:
        n = n - 1
        s = s * x
    return s

那我每次計算 x 的 n 次方,都要傳遞兩個參數

>>> power(2, 2)
4
>>> power(3, 2)
9

后來我發現,我很多時候都是計算平方值,很多會去計算三次方,四次方。

那有什么辦法可以偷個懶嗎?

答案是,有??梢允褂?偏函數

偏函數(Partial Function),可以將某個函數的常用參數進行固定,避免每次調用時都要指定。

使用偏函數,需要導入 functools.partial ,然后利用它創建一個新函數,新函數的 n 固定等2。

具體使用請看下面的示例

>>> from functools import partial
>>> power_2=partial(power, n=2)
>>> power_2(2)
4
>>> power_2(3)
9

python泛型函數

根據傳入參數類型的不同而調用不同的函數邏輯體,這種實現我們稱之為泛型。在 Python 中叫做 singledispatch

它使用方法極其簡單,只要被singledispatch 裝飾的函數,就是一個single-dispatch 的泛函數(generic functions)。

單分派:根據一個參數的類型,以不同方式執行相同的操作的行為。

多分派:可根據多個參數的類型選擇專門的函數的行為。

泛函數:多個函數綁在一起組合成一個泛函數。

這邊舉個簡單的例子。

from functools import singledispatch

@singledispatch
def age(obj):
    print('請傳入合法類型的參數!')

@age.register(int)
def _(age):
    print('我已經{}歲了。'.format(age))

@age.register(str)
def _(age):
    print('I am {} years old.'.format(age))


age(23)  # int
age('twenty three')  # str
age(['23'])  # list

執行結果

我已經23歲了。
I am twenty three years old.
請傳入合法類型的參數!

說起泛型,其實在 Python 本身的一些內建函數中并不少見,比如 len() , iter()copy.copy()pprint()

你可能會問,它有什么用呢?實際上真沒什么用,你不用它或者不認識它也完全不影響你編碼。

我這里舉個例子,你可以感受一下。

大家都知道,Python 中有許許多的數據類型,比如 str,list, dict, tuple 等,不同數據類型的拼接方式各不相同,所以我這里我寫了一個通用的函數,可以根據對應的數據類型對選擇對應的拼接方式拼接,而且不同數據類型我還應該提示無法拼接。以下是簡單的實現。

def check_type(func):
    def wrapper(*args):
        arg1, arg2 = args[:2]
        if type(arg1) != type(arg2):
            return '【錯誤】:參數類型不同,無法拼接!!'
        return func(*args)
    return wrapper


@singledispatch
def add(obj, new_obj):
    raise TypeError

@add.register(str)
@check_type
def _(obj, new_obj):
    obj += new_obj
    return obj


@add.register(list)
@check_type
def _(obj, new_obj):
    obj.extend(new_obj)
    return obj

@add.register(dict)
@check_type
def _(obj, new_obj):
    obj.update(new_obj)
    return obj

@add.register(tuple)
@check_type
def _(obj, new_obj):
    return (*obj, *new_obj)

print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))

# list 和 字符串 無法拼接
print(add([1,2,3], '4,5,6'))

輸出結果如下

hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【錯誤】:參數類型不同,無法拼接!!

如果不使用singledispatch 的話,你可能會寫出這樣的代碼。

def check_type(func):
    def wrapper(*args):
        arg1, arg2 = args[:2]
        if type(arg1) != type(arg2):
            return '【錯誤】:參數類型不同,無法拼接!!'
        return func(*args)
    return wrapper

@check_type
def add(obj, new_obj):
    if isinstance(obj, str) :
        obj += new_obj
        return obj

    if isinstance(obj, list) :
        obj.extend(new_obj)
        return obj

    if isinstance(obj, dict) :
        obj.update(new_obj)
        return obj

    if isinstance(obj, tuple) :
        return (*obj, *new_obj)

print(add('hello',', world'))
print(add([1,2,3], [4,5,6]))
print(add({'name': 'wangbm'}, {'age':25}))
print(add(('apple', 'huawei'), ('vivo', 'oppo')))

# list 和 字符串 無法拼接
print(add([1,2,3], '4,5,6'))

輸出如下

hello, world
[1, 2, 3, 4, 5, 6]
{'name': 'wangbm', 'age': 25}
('apple', 'huawei', 'vivo', 'oppo')
【錯誤】:參數類型不同,無法拼接!!

審核編輯:符乾江

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。 舉報投訴
  • 函數
    +關注

    關注

    3

    文章

    4417

    瀏覽量

    67499
  • python
    +關注

    關注

    57

    文章

    4876

    瀏覽量

    90022
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    函數信號發生器和任意波形信號發生器區別詳解

    函數發生器提供了一個預置列表,里面列出了它可以生成的波形或碼型。 在函數發生器中,用戶可以更改頻率、幅度和偏移等波形參數,還可添加簡單的失真。 任意波形發生器更為復雜,能夠仿真真實世界中的信號
    的頭像 發表于 02-09 16:24 ?139次閱讀
    <b class='flag-5'>函數</b>信號發生器和任意波形信號發生器區別<b class='flag-5'>詳解</b>

    指針與函數詳解

    1、指針函數指針函數,從名字上看它本質上是一個函數。指針函數:返回值類型是指針的函數函數聲明如
    發表于 01-23 06:02

    嵌入式開發常用函數速查表

    在嵌入式開發中,掌握常用函數的用法可以大大提高開發效率。無論是單片機初學者還是有一定經驗的工程師,熟悉函數庫和調用方式都是必備技能。今天,我們為大家整理一份嵌入式開發常用函數速查表,覆蓋GPIO
    的頭像 發表于 01-19 09:06 ?302次閱讀
    嵌入式開發常用<b class='flag-5'>函數</b>速查表

    ElfBoard嵌入式教育科普|Linux系統I/O接口:Open函數詳解

    1.函數概述open()是Linux/Unix內核提供的底層系統調用,核心功能是打開或創建文件。成功調用后,內核會返回一個整型的文件描述符作為該文件的句柄,后續的所有讀寫操作都基于此描述符進行。調用
    的頭像 發表于 12-29 11:41 ?1052次閱讀
    ElfBoard嵌入式教育科普|Linux系統I/O接口:Open<b class='flag-5'>函數</b><b class='flag-5'>詳解</b>

    西門子PLC中函數FC的使用方法

    函數函數塊作為模塊化編程的重要組成部分,在PLC 用戶程序中有著相當頻繁的應用。兩者在生成與使用的過程中都有一定的相似,且都不能單獨使用。而需要賦予特定的功能,由組織塊(OB)直接或者間接進行調用。
    的頭像 發表于 12-19 11:26 ?4204次閱讀
    西門子PLC中<b class='flag-5'>函數</b>FC的使用方法

    如何用函數指針調用函數

    給大家舉一個例子: int Func(int x);/*聲明一個函數*/ int (*p) (int x);/*定義一個函數指針*/ p = Func; /*將Func函數的首地址賦給指針變量
    發表于 12-11 06:26

    LUA例程-常用的回調函數使用說明

    詳細說明LUA腳本函數功能和對應的應用實例。對于LUA腳本編程有很大的幫助和提高技能。
    發表于 11-24 16:43 ?0次下載

    使用函數塊實現三相電機正反轉控制

    在使用西門子S1200PLC,所使用的軟件是博途軟件,在這個軟件里運用了塊的概念。比如我們常見的組織塊(OB)、函數塊(FB)、數據塊(DB)以及函數FC等。今天我們來具體交流一下這個函數塊(FB)的具體使用方法。
    的頭像 發表于 10-15 14:40 ?2710次閱讀
    使用<b class='flag-5'>函數</b>塊實現三相電機正反轉控制

    詳解hal_entry入口函數

    當使用RTOS時,程序從main函數開始進行線程調度;當沒有使用RTOS時,C語言程序的入口函數main函數調用了hal_entry函數。由于我們新建的工程是沒有選用RTOS的,因此,
    的頭像 發表于 07-25 15:34 ?1978次閱讀

    C語言中的內聯函數與宏

    在C編程中,內聯函數和宏都用于避免函數調用的開銷并編寫可復用的邏輯部分,但它們在工作方式和安全性方面存在顯著差異。
    的頭像 發表于 07-25 15:10 ?1904次閱讀
    C語言中的內聯<b class='flag-5'>函數</b>與宏

    MSP430常用內聯函數說明

    電子發燒友網站提供《MSP430常用內聯函數說明.docx》資料免費下載
    發表于 06-05 17:20 ?0次下載

    為什么不需要給回調函數傳遞參數

    回調函數是C語言里面一個重要機制。
    的頭像 發表于 04-15 10:11 ?834次閱讀

    函數指針的六個常見應用場景

    函數指針在嵌入式開發中有著廣泛的應用,它讓代碼更加靈活,減少冗余,提高可擴展性。很多時候,我們需要根據不同的情況動態調用不同的函數,而函數指針正是實現這一需求的重要工具。本文將介紹六個常見的
    的頭像 發表于 04-07 11:58 ?1473次閱讀
    <b class='flag-5'>函數</b>指針的六個常見應用場景

    詳解RTOS中的Hook函數

    Hook函數是RTOS中的一個關鍵特性,通過該函數,用戶可以增強對任務管理的控制,定義系統行為。
    的頭像 發表于 03-24 16:14 ?1077次閱讀

    解鎖TSMaster fifo函數:報文讀取的高效方法

    前言:TSMaster目前有兩種讀取報文的模式:回調函數模式和fifo模式。fifo函數是TSMaster近期新增的函數,本文將重點介紹fifo模塊。關于回調函數的使用方法可以參考幫助
    的頭像 發表于 03-14 20:04 ?1142次閱讀
    解鎖TSMaster fifo<b class='flag-5'>函數</b>:報文讀取的高效方法