在Python中,何时/为什么要返回函数?

2024-09-29 21:41:38 发布

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

我来自c

第一类函数的概念既有趣又令人兴奋。 然而,我正在努力寻找返回函数的实际用例

我看过构建函数返回打印光栅的例子

Hello = grating('Hello')

Hi = grating('Hi')

但为什么这比仅仅使用 grating('Hello')grating('Hi')

考虑:

def func_a():
    def func_b():
        do sonthing
        return somthing
     return func_b

当这更好时:

def func_b():
    do sonthing
    return somthing

def func_a():
     res = func_b()
     return (res)

有人能给我举一个现实世界中有用的例子吗? 谢谢


Tags: 函数概念helloreturndef光栅reshi
3条回答

假设您想要传递一个函数,该函数将根据参数选择函数:

def compare(a, b):
    ...

def anticompare(a, b):  # Compare but backwards
    ...

def get_comparator(reverse):
    if reverse: return anticompare
    else: return compare

def sort(arr, reverse=false):
    comparator = get_comparator(reverse)
    ...

显然,这是有点做作的,但它将选择比较器的逻辑与比较器函数本身分开

你的例子写得没有帮助。但在其他情况下,它是有用的,例如decorator(在函数和返回函数上调用的函数,用于修改为将来调用它们的函数的行为)和闭包。闭包情况可以是一种方便(例如,代码的其他部分不希望在每次调用中都传递10个参数,而其中8个参数始终是相同的值;这通常由functools.partial涵盖,但闭包也可以工作),或者它可以是一种缓存时间节约。对于后者的一个例子,想象一个愚蠢的函数,它测试一组小于某个界限的数中的哪一个是素数,方法是计算所有达到该界限的素数,然后过滤这些素数集中的输入

如果您将其写为:

def get_primes(*args):
     maxtotest = max(args)
     primes = sieve_of_eratosthenes(maxtotest)  # (expensive) Produce set of primes up to maxtotest
     return primes.intersection(args)

然后,每次通话你都要重新筛选埃拉托什尼,这就淹没了设置交叉口的成本。如果将其实现为闭包,则可以执行以下操作:

def make_get_primes(initialmax=1000):
    primes = sieve_of_eratosthenes(initialmax)  # (expensive) Produce set of primes up to maxtotest
    currentmax = initialmax
    def get_primes(*args):
        nonlocal currentmax
        maxtotest = max(args)
        if maxtotest > currentmax:
            primes.update(partial_sieve_of_eratosthenes(currentmax, maxtotest))  # (less expensive) Fill in additional primes not sieved
            currentmax = maxtotest 
        return primes.intersection(args)
    return get_primes

现在,如果您需要一段时间的测试仪,您可以执行以下操作:

get_primes = make_get_primes()

而且每次对get_primes的调用都很便宜(如果缓存的素数已经覆盖了您,则基本上是免费的,如果需要计算更多,则更便宜)

函数返回函数的一个完美示例是Python装饰器:

def foo(func):
    def bar():
        return func().upper()
    return bar

@foo
def hello_world():
    return "Hello World!"

print(hello_world())

修饰符是hello_world()函数声明上方的@foo符号。本质上,我们告诉解释器,每当它看到提到hello_world()时,实际上调用foo(hello_world()),因此,上面代码的输出是:

HELLO WORLD!

相关问题 更多 >

    热门问题