【摸鱼笔记】了解 FuncTools, 优雅应用高阶函数

functools 模块应用于高阶函数,即参数或返回值为其他函数的函数。 通常来说,此模块的功能适用于所有可调用对象。

partial

返回一个新的可调用对象,当被调用时可以像平常的函数一样传入 位置参数 和 关键字参数 来得到对应的返回结果。

import functools


def add1(a, /, overwrite_b):
    return a + overwrite_b


def add2(overwrite_a, b):
    return overwrite_a + b


def add3(overwrite_a, overwrite_b, c):
    return overwrite_a + overwrite_b + c


# 覆盖指定关键词参数
add1_1: functools.partial = functools.partial(add1, overwrite_b=1)
add1_2: functools.partial = functools.partial(add1, overwrite_b=2)

print(add1_1(10), add1_2(10))

# 覆盖第一个位置参数
add2_1: functools.partial = functools.partial(add2, 1)
add2_2: functools.partial = functools.partial(add2, 2)

print(add2_1(10), add2_2(10))

# 覆盖第一个和第二个位置参数
add3_1: functools.partial = functools.partial(add3, 1, 2)
add3_2: functools.partial = functools.partial(add3, 2, 3)

print(add3_1(10), add3_2(10))

reduce

与 python 内置的 reduce 函数功能类似;

将两个参数的 function 从左至右累计地应用到 iterable 的值;

例如,reduce (lambda x, y: x+y,[1, 2, 3, 4, 5]) 是计算 ((((1+2)+3)+4)+5) 的值。

如果传入了 initializer (可选),它会被放在参与计算的 iterable 的值之前,也就是计算的初始值。

import functools


# 加法计算
def add(x, y):
    return x + y


# 乘法计算
def multiplicative(x, y):
    return x * y


# 累加列表值
a = functools.reduce(add, [1, 2, 3, 4])
print(a)

# 累乘列表值
m = functools.reduce(multiplicative, [1, 2, 3, 4])
print(m)

# 携带初始值
a = functools.reduce(add, [1, 2, 3, 4], 1)
print(a)
# 携带初始值,列表为空
a = functools.reduce(add, [], 1)
print(a)

functools.cmp_to_key(func)

将 (旧式的) 比较函数转换为新式的 key function.

在类似于 sorted (), min (), max (), heapq.nlargest (), heapq.nsmallest (),itertools.groupby () 等函数的 key 参数中使用。

import functools


# 比较函数
def cmp(x, y):
    return x - y


a = [5, 1, 2, 2, 2, 3, 1, 4]

k = functools.cmp_to_key(cmp)

print(sorted(a, key=k))

functools.total_ordering

给定一个声明一个或多个全比较排序方法的类,这个类装饰器实现剩余的方法。

import functools


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

    def __lt__(self, other):
        return self.age < other.age

    def __eq__(self, other):
        return self.name == other.name


# 我们只需要定义 __eq__ 和 __lt__,total_ordering就会把其他的比较函数生成好。
Tower = Person('Tower', 1200)

John = Person('John', 12)

print(Tower > John)

functools.update_wrapper

更新一个 装饰器 以使其更像被该装饰器装饰的函数。

可选参数为指定被装饰的函数的哪些属性要赋值给 装饰器 的对应属性;

import functools


# 定义装饰器
def hi(func):
    def wrapper():
        """
        wrapper 的 doc
        """
        print("Hi geeks")
        func()

    # 更新装饰器,可以注释掉运行查看没有更新的执行结果
    # functools.update_wrapper 的功能
    # 使用 hello 的 __name__ 和 __doc__ 等属性覆盖 wrapper 的对应属性
    functools.update_wrapper(wrapper, func)

    return wrapper


@hi
def hello():
    """
    hello 的 __doc__
    """
    print("Hey Geeks")


print("hello.__name__", hello.__name__)
print("hello.__doc__", hello.__doc__)
help(hello)

print(hello())

functools.wraps

可用作一个装饰器,简化调用 update_wrapper 的过程;

import functools


# 定义装饰器
def hi(func):
    @functools.wraps(func)
    def wrapper():
        """
        wrapper 的 doc
        """
        print("Hi geeks")
        func()

    return wrapper


@hi
def hello():
    """
    hello 的 __doc__
    """
    print("Hey Geeks")


print("hello.__name__", hello.__name__)
print("hello.__doc__", hello.__doc__)
help(hello)

print(hello())
  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

The_Singing_Towers

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值