我正在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 中所说,这是实现组合的一个例子.从数学上讲,组合很简单,因为数学函数总是接受一个参数并返回一个参数.因此,两个函数fg的组合始终可以简单地定义为

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函数更容易实现.

Python-3.x相关问答推荐

如何在Python Matplotlib中在x轴上放置点

如何翻转以列形式给出的日期间隔并提取多个重叠时段内每小时的音量?

将Trio与基于线程的事件侦听器混合使用

如何在选中项目时设置QTreeView中整行的 colored颜色 ?

PythonPandas 创建一个列并添加到DataFrame

如何在matplotlib中显示次要刻度标签

为什么不能用格式字符串 '-' 绘制点?

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

正则表达式:匹配字符串中的分隔符(字母和特殊字符)以形成新的子字符串

请求:RecursionError:超出最大递归深度

Python:如何在三个列表中找到共同值

'~'(波浪号)运算符在 Python 中的应用

Python 异步调试示例

为 True 相交两个布尔数组

混合全局/参数和名为top的函数的奇怪python行为

使用 urllib3 忽略证书验证

python中的订单字典索引

Django 教程 unicode 不起作用

如何从Pandas 中的字符串中提取前8个字符

有没有办法在多个线程中使用 asyncio.Queue ?