中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python高階函數functools模塊如何使用

發布時間:2023-05-10 17:50:09 來源:億速云 閱讀:241 作者:iii 欄目:開發技術

本篇內容主要講解“python高階函數functools模塊如何使用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學習“python高階函數functools模塊如何使用”吧!

functools模塊提供了一些常用的高階函數(處理其他可調用對象/函數的特殊函數;以函數作為輸入參數,返回也是函數)。

functools模塊

functools模塊中的高階函數可基于已有函數定義新的函數:

  • cmp_to_key,

  • total_ordering,

  • reduce,

  • partial,

  • update_wrapper

  • wraps

reduce

reduce(function, iterable[, initializer])對一個可迭代數據集合中的所有數據進行累積。

  • function:接受兩個參數的函數;

  • sequence:可迭代對象(tuple/list/dict/str);

  • initial:可選初始值;

# 累加
reduce(lambda x,y:x+y, [1,2,3,4]) # 10

# 逆序字符串
reduce(lambda x,y:y+x, 'abcdefg') # 'gfedcba'

partial/partialmethod

partial用于"凍結"函數的部分參數,返回一個參數更少、使用更簡單的函數對象。使用時,只需傳入未凍結的參數即可。partialmethod用于處理類方法。

functools.partial(func[, *args][, **keywords])返回一個新的partial對象:

  • func:一個可調用的對象或函數;

  • args:要凍結的位置參數;

  • keywords:要凍結的關鍵字參數。

def add(a, b, note="add"):
    result = a + b
    print(f"{note} result: {result}")
    return result

add3 = functools.partial(add, 3)
add5 = functools.partial(add, 5, note="partialed")

print(add3(1)) # add result: 4
print(add3(2, note="partial3")) # partial3 result: 5
print(add5(3)) # partialed result: 8

partialmethod用于類中的方法

class Cell(object):
    def __init__(self):
        self._alive = False

    @property
    def alive(self):
        return self._alive

    def set_state(self, state):
        self._alive = bool(state)

    set_alive = functools.partialmethod(set_state, True)
    set_dead = functools.partialmethod(set_state, False)

c = Cell()
print(c.alive)  # False

c.set_alive()
print(c.alive)  # True

wraps/update_wrapper

functools.update_wrapper(wrapper, wrapped [, assigned] [, updated])更新一個包裹(wrapper)函數,使其看起來更像被包裹(wrapped)的函數(即把 被封裝函數的__name__、__module__、__doc__和 __dict__都復制到封裝函數去。wraps是通過partial與update_wrapper實現的。

通常,經由被裝飾(decorator)的函數會表現為另外一個函數了(函數名、說明等都變為了裝飾器的);通過wraps函數可以消除裝飾器的這些副作用。

def wrapper_decorator(func):
    @functools.wraps(func) # 若是去掉此wraps,則被裝飾的函數名稱與說明都變為此函數的
    def wrapper(*args, **kwargs):
        """doc of decorator"""
        print('in wrapper_decorator...')
        return func(*args, **kwargs)

    return wrapper

@wrapper_decorator
def example():
    """doc of example"""
    print('in example function')

example()
# in wrapper_decorator...
# in example function
print(example.__name__, "; ", example.__doc__) # example ;  doc of example

singledispatch/singledispatchmethod

singledispatch將普通函數轉換為泛型函數,而singledispatchmethod(3.8引入)將類方法轉換為泛型函數:

  • 泛型函數:是指由多個函數(針對不同類型的實現)組成的函數,調用時由分派算法決定使用哪個實現;

  • Single dispatch:一種泛型函數分派形式,基于第一個參數的類型來決定;

dispatch使用:

  • singledispatch裝飾dispatch的基函數base_fun(即,注冊object類型);

  • 注冊后續分發函數使用裝飾器@{base_fun}.register({type}),注冊每種需要特殊處理的類型;

  • 分發函數名稱無關緊要,_是個不錯的選擇;

  • 可以疊放多個register裝飾器,讓同一個函數支持多種類型;

# 缺省匹配類型,注冊object類型(與后續注冊類型都不匹配時使用)
@functools.singledispatch
def show_dispatch(obj):
    print(obj, type(obj), "dispatcher")

# 匹配str字符串
@show_dispatch.register(str)
def _(text):
    print(text, type(text), "str")

# 匹配int
@show_dispatch.register(int)
def _(n):
    print(n, type(n), "int")

# 匹配元祖或者字典
@show_dispatch.register(tuple)
@show_dispatch.register(dict)
def _(tup_dic):
    print(tup_dic, type(tup_dic), "tuple/dict")

### 打印注冊的類型:
# dict_keys([<class 'object'>, <class 'str'>, <class 'int'>, <class 'dict'>, <class 'tuple'>])
print(show_dispatch.registry.keys())

show_dispatch(1)
show_dispatch("xx")
show_dispatch([1])
show_dispatch((1, 2, 3))
show_dispatch({"a": "b"})
# 1 <class 'int'> int
# xx <class 'str'> str
# [1] <class 'list'> dispatcher
# (1, 2, 3) <class 'tuple'> tuple/dict
# {'a': 'b'} <class 'dict'> tuple/dict

cmp_to_key

cmp_to_key()用來自定義排序規則,可將比較函數(comparison function)轉化為關鍵字函數(key function):

  • 比較函數:接受兩個參數,比較這兩個參數,并返回0、1或-1;

  • 關鍵字函數:接受一個參數,返回其對應的可比較對象;

test = [1, 3, 5, 2, 4]
test.sort(key=functools.cmp_to_key(lambda x, y: 1 if x < y else -1))
print(test) # [5, 4, 3, 2, 1]

total_ordering

是一個類裝飾器,用于自動實現類的比較運算;類定義一個或者多個比較排序方法,類裝飾器將會補充其余的比較方法。

被修飾的類必須至少定義 __lt__(), __le__(),__gt__(),__ge__()中的一個,以及__eq__()方法。

如,只需定義lt與eq方法,即可實現所有比較:

@functools.total_ordering
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def __lt__(self, other):
        if isinstance(other, Person):
            return self.age < other.age
        else:
            raise AttributeError("Incorrect attribute!")

    def __eq__(self, other):
        if isinstance(other, Person):
            return self.age == other.age
        else:
            raise AttributeError("Incorrect attribute!")

mike = Person("mike", 20)
tom = Person("tom", 10)

print(mike < tom)
print(mike <= tom)
print(mike > tom)
print(mike >= tom)
print(mike == tom)

到此,相信大家對“python高階函數functools模塊如何使用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

东宁县| 武清区| 大竹县| 寿光市| 兴和县| 吴忠市| 永定县| 岗巴县| 武强县| 伊金霍洛旗| 柳州市| 云林县| 遂川县| 云梦县| 泰顺县| 桂阳县| 襄城县| 商丘市| 宝清县| 萝北县| 迁安市| 景宁| 瓮安县| 平利县| 茂名市| 沅陵县| 枞阳县| 阿鲁科尔沁旗| 弋阳县| 中卫市| 青州市| 皋兰县| 灵璧县| 山丹县| 吴桥县| 洪雅县| 伊通| 北碚区| 静宁县| 容城县| 白朗县|