【问题标题】:call 2 functions in a function [duplicate]在一个函数中调用2个函数[重复]
【发布时间】:2017-03-06 08:42:54
【问题描述】:

问题如下:

编写一个函数 compose,它接受两个函数作为参数,我们称它们为 Fa 和 Fb,并返回一个函数 Fres,这意味着来自另一个函数的输出数据是第一个函数的 indata,例如: Fres(x) = Fa(Fb(x))。 运行示例:

>>> def multiply_five(n):
... return n * 5
...
>>> def add_ten(x):
... return x + 10
...
>>> composition = compose(multiply_five, add_ten)
>>> composition(3)
65
>>> another_composition = compose(add_ten, multiply_five)
>>> another_composition(3)
25

据我了解,如果我发送 3,则函数 compose 将占用 3+10 = 13 之后将该结果发送到乘法函数中,它将执行:13*5 女巫是 65。 这是我目前写的代码:

def multiply_five(n):
    return n*5

def add_ten(x):
    return x+10

def compose(func1, func2):
    def comp(arg):
        return func2(arg)
    return func1(comp(arg))

我得到编译错误,我尝试了一些不同的方法:

Traceback (most recent call last):
  File "<pyshell#3>", line 1, in <module>
    composition = compose(multiply_five, add_ten)
  File "C:\Users\Jim\Desktop\tdp002\5h.py", line 10, in compose
    return func1(comp(arg))
NameError: name 'arg' is not defined

【问题讨论】:

  • arg 如错误状态所示,当时尚未定义。它应该是什么? func1? func2?一些数据结构或其他包含两者的对象?
  • hmm 仍然得到 : args is not defined
  • 为什么不只是def compose(func1, func2, n): return func1(func2(n))?
  • @Ev.Kounis 因为compose 只接受两个函数作为它的参数,它必须返回组合函数。
  • @PM2Ring 哦,我明白了。我错过了这个问题。

标签: python function python-3.x


【解决方案1】:

您还不想打电话给func1 或func2;您只想返回一个将同时调用它们的函数。

def compose(func1, func2):
    def _(*args, **kw):
        return func1(func2(*args, **kw))
    return _

您也可以只使用lambda 表达式来创建组合函数。

def compose(func1, func2):
    return lambda *args, **kw: func1(func2(*args, **kw))

【讨论】:

  • 我得到 *kw 作为无效语法,kw 代表什么?
  • kw 只是一个任意名称;我有一个错字,忘记了第二个*。
  • lambda 函数效果更好,正如作业所说,但我仍然不明白 **kw 是什么?
  • 好的,我明白了,非常感谢!
  • 是的,这只是泛化到任何可能的函数func2 就它所期望的参数而言。唯一的限制是func1 必须采用单个参数,即func2 返回的任何参数。泛化组合以允许为 func1 提供多个参数和/或关键字参数是 Python 没有内置函数组合的一个原因(IMO)。
【解决方案2】:

试试这个:

def compose(func1, func2):
    def comp(arg):
        return func1(func2(arg))
    return comp

【讨论】:

    猜你喜欢
    • 2017-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 1970-01-01
    • 2016-09-20
    • 1970-01-01
    • 2016-04-22
    相关资源
    最近更新 更多