Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.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 咖喱lambda表达式是如何工作的?_Python_Lambda_Currying - Fatal编程技术网

Python 咖喱lambda表达式是如何工作的?

Python 咖喱lambda表达式是如何工作的?,python,lambda,currying,Python,Lambda,Currying,我不知道代码是如何执行的。这是一道练习题 (lambda x: x(x))(lambda y:4) 输出是4,但我不知道代码如何运行。我认为步骤如下: 定义了lambda(x) 执行lambda(x) 返回x(λ(y)) 定义了lambda(y) 返回4 x(4) 我知道步骤6是错误的。不要考虑“lambda已定义”。lambda是一个值,如4。你没有“定义”一个4——它只是。计算lambda时,只需将其(已计算的)参数替换到其主体中(必要时添加括号)。像重写问题一样工作 (lambda x:

我不知道代码是如何执行的。这是一道练习题

(lambda x: x(x))(lambda y:4)
输出是4,但我不知道代码如何运行。我认为步骤如下:

  • 定义了lambda(x)
  • 执行lambda(x)
  • 返回x(λ(y))
  • 定义了lambda(y)
  • 返回4
  • x(4)
  • 我知道步骤6是错误的。

    不要考虑“lambda已定义”。lambda是一个值,如
    4
    。你没有“定义”一个
    4
    ——它只是。计算lambda时,只需将其(已计算的)参数替换到其主体中(必要时添加括号)。像重写问题一样工作

    (lambda x: x(x))(lambda y:4)
    # rewrite all `x` in `x(x)` to `lambda y:4` (two appearances):
    (lambda y:4)(lambda y:4)
    # rewrite all `y` in `4` to `lambda y:4` (zero appearances):
    4
    

    lambda
    表达式的工作原理与未命名函数(匿名函数)类似。工作原理如下:

    lambda (1): (2)
    
    (1) 是参数

    (2) 回归

    见:

    使用lambda表达式:

    square = lambda x: x**2
    
    >>> square(2)
    4
    
    但是想想它的用途,也许你只想使用一个函数几次,为什么要存储它呢?创建一个匿名函数!怎么用?运行lambda函数:

    >>> (lambda x: x**2)(2)
    4
    
    看到了吗?没那么难。让我们一起思考

    (lambda x: x(x))(lambda y:4)
    

    lambda y:4
    被传递给我们的
    lambda x
    函数,现在x=(lambda y:4)(疯狂的事情!)。x(x)等于(λy:4)((λy:4))。看!我们得到了第一个“y”的参数,它是(λy:4)!然后执行第一个函数,并返回4。第二个呢?它不运行,也不需要运行!如果执行x(x(x)),第二个函数将运行,但第三个函数不会运行。

    这是一个棘手的问题

    lambda是匿名函数。让我们定义它们来帮助您了解正在发生的事情

    # (lambda x: x(x))
    def func_1(func):
        return func(func)
    
    # (lambda y: 4)
    def func_2(y):
        return 4
    
    >>> func_1(func_2)  # Equivalent to (lambda x: x(x))(lambda y:4)
    4
    
    第二个函数只是一个可调用函数,它返回常量值4,而与
    y
    的值无关,因此
    func_2(10)
    func_2(0)
    都返回4


    第一个函数是一个可调用函数,其本身作为函数的单个参数(
    x(x)
    )。我们刚刚看到第二个函数是一个可调用函数,它将返回常量值4,而不管输入参数是什么,因此
    func_2(func_2)
    只返回4。

    最左边的lambda是否先运行?如果正确的lambda会成为第一个lambda的输入“x”吗?在python中(以及在许多其他编程语言中,以及它来自的数学中),语法
    f(x,y,z)
    将使用参数
    x,y,z
    计算函数
    f
    。lambda实际上是一个函数。因此,在
    (lambda x:x)(lambda y:y)
    中,
    lambda x:x
    是要评估的函数<代码>λy;y是要传递到函数中的参数(成为本地参数
    x
    )。如果Python有一个奇怪的函数语法,比如
    (x,y,z)f
    ,那么它将是相反的。这有意义吗?我想我最感兴趣的是它不会产生错误。说func_2(func_2)生成func_2(4),然后func_2(4)生成4对吗。下面的评论说第二个lambda没有打印,这对我来说没有意义。最左边的lambda运行第一个a返回一个可调用的,该可调用的将一个可调用的作为其唯一参数(人们知道它接受一个可调用的,因为你可以看到它通过
    x(x)调用自己)
    。尝试单独运行它,它将返回类似于
    的内容。然后使用第二个lambda callable作为唯一参数调用此函数,不管提供的参数是什么,它只返回4。
    # (lambda x: x(x))
    def func_1(func):
        return func(func)
    
    # (lambda y: 4)
    def func_2(y):
        return 4
    
    >>> func_1(func_2)  # Equivalent to (lambda x: x(x))(lambda y:4)
    4