Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何制作函数生成器_Python_Python 3.x_Python Decorators_Function Composition - Fatal编程技术网

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

补充:

  • 您可以在闭包中使用,这样就不会丢失有关原始函数的信息(例如docstring、函数名)
  • 通过谷歌搜索这些术语,您可以找到大量关于闭包(例如)和装饰器(例如)的学习资源

  • 对于您的特定示例,您可以编写

    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