1

在我课程的一个培训部分中,我收到了以下问题:

编写一个函数,该函数make_multiplier(factor)返回一个函数,该函数接受一个参数 x 并且应该返回因子 * x。

例如:

f=make_multiplier(10)
f(1)
10
f(2)
20

我完全不知道从哪里开始。我翻阅了所有笔记,找不到任何有用的东西。

有人可以给我一个提示或指出我需要做什么的正确方向吗?

4

5 回答 5

4

这是一个返回函数的函数:

def foo():
    def bar():
        return 42

    return bar

你可以这样称呼它:

foo()() # 42
# or
baz = foo()
baz() # 42

有你的提示。

于 2012-12-23T15:17:19.917 回答
3

很简单,只需嵌套你的函数:

def make_multiplier(x):
    def multiplier(y):
        return x * y
    return multiplier

x嵌套函数会自动从其周围范围内查找未知变量(在这种情况下),使用x调用外部函数时的值。这里要记住的是,函数也只是对象,你可以将它们存储在一个变量中,就像你可以使用其他 python 对象一样,并推迟调用它们。

这给出了:

>>> def make_multiplier(x):
...     def multiplier(y):
...         return x * y
...     return multiplier
... 
>>> f = make_multiplier(10)
>>> f(1)
10
>>> f(2)
20
>>> g = make_multiplier(5)
>>> g(1)
5
>>> f(3)
30

请注意如何g为 赋予不同的值x,该值与xin的值无关f

您也可以使用 lambda;lambda 只是仅限于一个表达式的匿名函数;到这里就够了:

def make_multiplier(x):
    return lambda y: x * y

另一种替代技术是绑定x到关键字参数,这意味着您可以根据需要覆盖它:

def make_multiplier(x):
    def multiply(y, x=x):
         return x * y
    return multiply

或 lambda 版本:

def make_multiplier(x):
    return lambda y, x=x: x * y

然后将一两个参数传递给返回的可调用对象:

>>> f = make_multiplier(10)
>>> f(5)
50
>>> f(5, 3)
15
于 2012-12-23T15:17:08.987 回答
0

除了Matt BallMartijn Pieters闭包方法(在这种特殊情况下这是正确的答案)之外,还有另外两种在 Python 中值得认识的形式。

第一个是使用 lambda 匿名函数:

>>> f=lambda x: x*10
>>> f(1)
10
>>> f(2)
20

第二个是写一个类:

class Multiplyby:
    def __init__(self,x):
        self.x=x

    def __call__(self,y):
        return self.x*y

fx10=Multiplyby(10)
fx5=Multiplyby(5)


for y in [1,2,3]:
    print y, fx10(y), fx5(y)

印刷:

1 10 5
2 20 10
3 30 15
于 2012-12-23T18:34:17.080 回答
0

使用 lambda:

>>> make_multiplier = lambda n: lambda x: x * n
>>> make_multiplier(10)(5)
50

10000000 个循环,3 个中最好的:每个循环 0.189 微秒

使用标准库:

import functools
import operator

f = lambda n: functools.partial(operator.mul, n)

10000000 个循环,3 个中最好的:每个循环 0.148 微秒

于 2012-12-23T22:32:05.113 回答
0

我不推荐这个,我只是展示了无意义自由风格的可能性:

>>> from functools import partial
>>> from operator import mul
>>> make_multiplier = partial(partial, mul)
>>> f = make_multiplier(10)
>>> f(1)
10
>>> f(2)
20
于 2012-12-24T00:04:06.660 回答