我正在try 做一个函数,它围绕着我的大学学位的其他函数.例如,我想打电话给round_sqrt = round(sqrt)
def rounding(funct):
return round(funct)
但这不管用.
编辑:函数应该只有一个参数.例如
def rounding(func):
所以在这个函数中,funct
函数需要四舍五入.
我正在try 做一个函数,它围绕着我的大学学位的其他函数.例如,我想打电话给round_sqrt = round(sqrt)
def rounding(funct):
return round(funct)
但这不管用.
编辑:函数应该只有一个参数.例如
def rounding(func):
所以在这个函数中,funct
函数需要四舍五入.
对于你的具体例子,你可以写
def round_sqrt(x):
return round(sqrt(x))
Alex's answer概括了这一点;他为你定义了一个函数.如果函数已经定义,只需将其作为参数传递给rounder
:
round_sqrt = rounder(sqrt)
当然,如果你不想,你不需要定义round_sqrt
.rounder(sqrt)(3.2)
可以直接调用,不过如果您希望多次使用它,那么确保rounder
的返回值安全比每次重新定义它要高效得多.
否则,decorator语法只是(以Alex为例)的缩写
def adder(x, y):
return x + y
adder = rounder(adder)
正如我在 comments 中所说,这是实现组合的一个例子.从数学上讲,组合很简单,因为数学函数总是接受一个参数并返回一个参数.因此,两个函数f
和g
的组合始终可以简单地定义为
def compose(f, g):
def h(x): # The name doesn't matter
return f(g(x))
return h
然后
round_sqrt = compose(round, sqrt)
(忽略关于实现的各种实际问题,Python理论上甚至可以为函数round_sqrt = round ∘ sort
提供Unicode运算符∘
.解释why这不会发生超出了本答案的范围.)
不过,在Python中,函数要复杂得多.它们可以接受多个参数,可以接受任意数量的参数和任意关键字参数,虽然从技术上讲,每个参数都返回一个值,但该值可以是一个元组,被认为是多个值或dict
.因此,您可能希望通过多种方式将g
的返回值传递给函数f
,这比简单的compose
函数更容易实现.