python functools partial,partialmethod使用

  • functools.partial使用

偏函數(Partial function)是修改函數簽名,通過將一個函數的部分參數預先綁定爲某些值,從而得到一個新的具有較少可變參數的函數;

"""
functools.partial
偏函數(Partial function)是通過將一個函數的部分參數預先綁定爲某些值,從而得到一個新的具有較少可變參數的函數
用法:
1.在 asyncio add_done_callback 中的使用
"""
import asyncio
import functools


async def do_some_work(x):
    print("waiting:", x)
    return "Done after {}s".format(x)


def callback(future, a, b):
    print("callback:", a, b, future.result())


def callback_no_param(future):
    print("callback_no_param:", future.result())


# 使用 functools.partial 讓 callback 添加2個參數
# add_done_callback 的參數是一個可調用函數,但是 又想 在 可調用函數 中添加參數,那就用 functools.partial
coroutine = do_some_work(2)
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(coroutine)
print(task1)
task1.add_done_callback(functools.partial(callback, a=22, b=33))
print(task1)
loop.run_until_complete(task1)

print('!' * 10)
# add_done_callback 調用callback 不添加參數
coroutine = do_some_work(3)
loop = asyncio.get_event_loop()
task1 = asyncio.ensure_future(coroutine)
print(task1)
task1.add_done_callback(callback_no_param)
print(task1)
loop.run_until_complete(task1)
"""
functools.partial
偏函數(Partial function)是通過將一個函數的部分參數預先綁定爲某些值,從而得到一個新的具有較少可變參數的函數
用法:
1.用於重構代碼;如下實例,一個函數有多個參數,如果 幾個參數值是固定的,可以提取出來,從而減少參數調用
"""
from functools import partial


def chat_with(who, where, topic):
    """
    和誰 在哪 聊 什麼話題
    :param who: 和誰聊天
    :param where: 在哪聊天
    :param topic: 聊什麼話題
    :return:
    """
    return f'hello,{who},do you have time, I want to chat with you about {topic} in the {where},Thanks!'


chat_with_lucy = partial(chat_with, 'lucy')
chat_with_tom = partial(chat_with, 'tom')
chat_with_jerry = partial(chat_with, 'jerry')
chat_with_parents = partial(chat_with, 'parents')

print(chat_with_lucy('home', 'lover'))
print(chat_with_tom('park', 'sea'))
print(chat_with_jerry('street', 'clothes'))

# 一個參數固定,其他參數不同,從而減少參數個數
print(chat_with_parents('school', 'math'))
print(chat_with_parents('tree', 'bird'))

# 可以指定參數,不用按照函數順序進行調用
chat_where = partial(chat_with, where='school')
print(chat_where(who='Tom', topic='Python'))

https://blog.csdn.net/Zjack_understands/article/details/80242946

https://baijiahao.baidu.com/s?id=1613459698249266824&wfr=spider&for=pc

 

  • partialmethod使用

和partial實現相同的功能,只是 partial在類方法中使用會報錯,而此函數用在類方法中;

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 = partialmethod(set_state, True)
    set_dead = partialmethod(set_state, False)

c = Cell()
c.alive # 結果爲:False

c.set_alive()
c.alive # 結果爲:True

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章