Python 如何制作函数生成器
我正在尝试做一个函数,它围绕着我的大学学位的其他函数。例如,我想调用Python 如何制作函数生成器,python,python-3.x,python-decorators,function-composition,Python,Python 3.x,Python Decorators,Function Composition,我正在尝试做一个函数,它围绕着我的大学学位的其他函数。例如,我想调用round\u sqrt=round(sqrt) 当我调用round_sqrt(5)时,它必须显示2,而不是2.23606797749979。我尝试的是: def rounding(funct): return round(funct) 但这不起作用 编辑:函数应该只有一个参数。例如 函数的开始应该是 def rounding(func): 因此,在这个函数中,funct函数需要四舍五入。 因此,当我调用舍入(abs
round\u sqrt=round(sqrt)
当我调用round_sqrt(5)
时,它必须显示2
,而不是2.23606797749979
。我尝试的是:
def rounding(funct):
return round(funct)
但这不起作用
编辑:函数应该只有一个参数。例如
函数的开始应该是
def rounding(func):
因此,在这个函数中,funct
函数需要四舍五入。
因此,当我调用
舍入(abs)(3.2)
时,它会显示3
您应该检查闭包:
def rounder(func):
def inner(*args, **kwargs):
return round(func(*args, **kwargs))
return inner
然后可以使用@
字符装饰函数:
@rounder
def adder(x, y):
return x + y
print(adder(1.1, 2.2))
输出3
补充:
对于您的特定示例,您可以编写
def round_sqrt(x):
return round(sqrt(x))
概括了这一点;他定义了一个函数,为您创建round\u sqrt
。如果函数已经定义,您只需将其作为参数传递给rounder
:
round_sqrt = rounder(sqrt)
当然,如果不想,您不需要定义round\u sqrt
rounder(sqrt)(3.2)
可以直接调用,但是如果希望多次使用它,而不是每次重新定义它,那么保护rounder
的返回值会更加有效
否则,decorator语法只是(使用Alex的示例)的缩写
正如我在评论中所说,这是一个实现组合的示例。从数学上讲,组合很简单,因为数学函数总是接受一个参数并返回一个参数。因此,两个函数
f
和g
的组合可以简单地定义为
def compose(f, g):
def h(x): # The name doesn't matter
return f(g(x))
return h
然后
(忽略了关于实现的各种实际问题,Python理论上甚至可以提供一个Unicode操作符∘代码>对于函数:round\u sqrt=round∘ 排序
。解释为什么不会发生这种情况超出了本答案的范围。)
不过,在Python中,函数要复杂得多。它们可以接受多个参数,可以接受任意数量的参数和任意关键字参数,虽然从技术上讲,每个参数都返回一个值,但该值可以是一个元组,可以被视为多个值或一个dict
。因此,您可能希望通过多种方式将g
的返回值传递给函数f
,这比简单的compose
函数更容易实现。函数组合在Python中本机不受支持。您可以根据需要使用装饰器。您可以根据显式定义新函数
或者您可以使用第三方库。例如,通过:
嘿,看,一个装修工!我什么都不懂。我想答案应该更简单think@phpkubrick什么?这是3行代码和一个函数头?你想要多简单一点?你说你在上大学,你能理解的,我听不懂**kwargs@phpkubrick我想这是下一步应该做的研究,因为它们在Python中被广泛使用,非常有用。您正在寻找函数组合。数学上,h=f∘ g
定义为h(x)=f(g(x))
。如果Python中有一个组合运算符,那就太好了,但实际问题需要您自己定义组合函数。玩组合是我很快爱上(然后讨厌,然后爱上,然后讨厌,然后…)的原因之一Haskell很容易,因为所有的东西都符合一个理论上合理的数学框架。Haskell很难,因为我们不习惯遵守上述框架您可以将问题留给他人帮助,也可以将其删除,但请不要删除所有内容。@AdamSmith听起来像是在撰写仇恨。爱。憎恨爱
不应该返回f(g(z))
是返回f(g(x))
吗?是的,我不知道z
从哪里来。在组合中使用lambda不是更干净吗?我发现def
可以使用时更清晰。
def compose(f, g):
def h(x): # The name doesn't matter
return f(g(x))
return h
round_sqrt = compose(round, sqrt)
from toolz import compose
def adder(x, y):
return x + y
round_adder = compose(round, adder)
round_adder(1.1, 2.2) # 3