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

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值