可以使用闭包来简化Python中的函数吗?

2024-04-26 00:01:46 发布

您现在位置:Python中文网/ 问答频道 /正文

想象一下,如果你想做一个闭包函数,决定它的内部函数做什么。在这个例子中,我们有一个内部函数,它决定一个数是否为偶数,但是生成器决定这个数0是否为偶数,就像有一场辩论一样。你知道吗

def generate_is_even(reject_zero):
    def is_even(x):
        return (x % 2 == 0 and x != 0) if reject_zero else x % 2 == 0
    return is_even

如果is\u even(x)已运行数百万次,则每次运行is\u even(x)时仍会检查reject\u zero!我的实际代码有许多类似的“选项”来创建一个运行数百万次的函数,为每个选项组合编写函数会很不方便。有没有一种方法可以防止这种低效,或者Python的一些实现可以简化这种情况?你知道吗


Tags: and函数returnifisdef选项generate
2条回答

考虑将所有选项缓存在一个列表中,生成的函数只迭代所选的函数

def generate_is_even(**kwargs):
    options = {'reject_zero': lambda x: x != 0}
    enabled = [options[o] for o in options if o in kwargs and kwargs[o]]
    def is_even(x):
        return all([fn(x) for fn in enabled]) and x % 2 == 0
    return is_even

那你可以用

is_even_nozero = generate_is_even(reject_zero=True)
is_even_nozero(0) # gives False
is_even = generate_is_even()
is_even(0) # gives True

如果您需要添加选项,那么将其添加到选项dict,您可以使用enew_option=Trueis generate\u is \u even函数来启用它

您似乎在寻找类似C中宏的东西。不幸的是,Python没有被编译(对于纯粹主义者来说,与C的编译方式不同),而且我没有看到满足您需要的直接解决方案。你知道吗

不过,您可以在运行时开始时设置所有参数,并在此时根据参数的值选择函数。例如,函数生成器类似于:

def generate_is_even(reject_zero):
    def is_even_true(x):
        return (x % 2 == 0 and x != 0)
    def is_even_false(x):
        return x % 2 == 0
    return (is_even_true if reject_zero else is_even_false)

def setup(reject_zero, arg2, arg3):
    is_even = generate_is_even(reject_zero)

这种方法的缺点是必须为处理此类参数的每个函数编写一个生成器。在您现在的例子中,这不是一个大问题,因为只有两个版本的函数,它们不是很长。你知道吗

你需要问问自己什么时候这样做有用。在您的情况下,只有一个布尔比较,这并不是真正的资源消耗,但是在某些情况下,以前生成函数可能是值得的。你知道吗

相关问题 更多 >