Python 中的高阶函数

时间:2021-07-05 10:32:36

标签: python python-3.x closures

我正在学习 Python 中的高阶函数。 我想了解参数如何从内部函数传递到外部函数。

假设我们有一个函数可以计算另一个函数运行了多少次。

def counter(fn, counters):
    print("Creating Outer Function - counter")
    cnt = 0
    def inner(*args, **kwargs):
        print("Creating Inner Function")
        nonlocal cnt
        cnt +=1
        counters[fn.__name__] = cnt
        return fn(*args, **kwargs)
    return inner

c = dict() # This is a dictionary that contains functions and count how many times they ran.

def add_num(a, b):
    return a+b

counted_add = counter(add_num, c)

counted_add(10, 20) # THIS PART I DON'T UNDERSTAND!!!

上面代码的最后一行我不明白……外部函数是如何理解10和20是内部函数的参数的?

2 个答案:

答案 0 :(得分:1)

如果你看清楚代码,外层函数counter返回的是内层函数inner

return inner末尾的counter(fn, counters)

<块引用>
def counter(fn, counters):
    print("Creating Outer Function - counter")
    cnt = 0
    def inner(*args, **kwargs):
        print("Creating Inner Function")
        nonlocal cnt
        cnt +=1
        counters[fn.__name__] = cnt
        return fn(*args, **kwargs)
    return inner ## HERE

返回的内部函数被分配给 counted_add

<块引用>

counted_add = counter(add_num, c)

现在 counted_add 只不过是 inner 函数内的 counter 函数

调用counted_add(10, 20)相当于调用inner(10, 20)

我强烈建议您访问 python visualizer 以更好地了解流程

干杯!

答案 1 :(得分:1)

Great explanation of high order functions

上面的链接完美地解释了一切。我推荐它,因为我过去曾使用它来了解它是如何工作的。

counted_add = counter(add_num, c)

counted_add(10, 20)

我可以解释的最基本的方法是:您“命名”函数计数器并将名称设置为 counted_add。这就是为什么您可以使用 counted_add(10, 20) 调用该函数的原因。如果这有任何意义 :D 我不擅长解释。

相关问题