【问题标题】:calling python function [closed]调用python函数[关闭]
【发布时间】:2021-04-06 17:36:52
【问题描述】:

以下是在用户定义函数中使用 lambda 函数的示例:

def sample_func(a):       #1
    return lambda a:a*a

当它被调用时,

s=sample_func(2)          #2
print(s)

输出似乎是像<function sample_func.<locals>.<lambda> at 0000xx这样的函数地址

在上面赋值给变量s之后,下面

s(5)                      #3

返回 25。

这里是python lambda的新手,解释这个的正确方法是什么,解释器如何处理#2中的参数以及为什么在#2中没有返回4,谢谢你的帮助!

【问题讨论】:

  • sample_func 返回一个函数,所以s 是一个函数。像任何函数一样,如果你想使用它,你必须调用它。此外,lambda 函数只有一个参数,因此您必须使用参数调用它。请注意,此参数与sample_func(a) 中的a 完全无关,只是被忽略了。
  • lambda 是一个函数。 sample_func 返回一个 lambda 函数,因此 #2 为您提供该输出。您将该函数分配给s,然后在#3 中使用参数5 调用它。你的函数接受它并返回5*5。当您调用sample_func 时,#2 中的参数(2) 进入a,但没有对其进行任何处理。 lambda 函数中的 a 指的是 lambda 的 a 参数。你对什么感到困惑?
  • 谢谢@PranavHosangadi,是的,正如你提到的那样,2 goes into a, but nothing is done with it 需要如何解释
  • 如果您将 lambda 的参数命名为其他名称:例如,查看 return lambda x: a * x 时会得到什么。当您将其命名为 a 并且该范围内已经有一个名为 a 的变量时,lambda 的 a 隐藏了 sample_funca
  • 完美@PranavHosangadi,回答!谢谢!

标签: python function lambda


【解决方案1】:

所以这里有一点诡计,因为变量a 被多次使用。

首先,您在#2 中所做的是调用some_func,它返回一个函数对象。 lambda 是一个函数对象,在您的情况下,您将其分配给s。在 #3 中,您调用该函数并传入值 5。此时 s 基本上相当于:

def s(foo: int):
    return foo * foo

让我们仔细看看这个函数:

def sample_func(a):       #1
    return lambda a:a*a

当您调用sample_func() 时,它会返回一个函数对象。这个返回的函数接受一个参数a 并返回a*a。所以发生的事情是传递给sample_func() 的参数a 基本上从未使用过。如果您想知道为什么,这与 Scope 在 Python 中的工作方式有关。以下面这段代码作为一个更容易理解的例子:

1) def outer_function(foo: int):
2)     print("Currently in outer_function, and foo is " + foo)
3)     
4)     def inner_function(foo: int):
5)         print("Currently in inner_function and foo is " + foo)
6)     return inner_function

在上面的代码中,第 5 行的foo 变量引用了传递给inner_function()foo 参数,它没有引用回outer_functionfoo 参数。您可以将 inner_function() 视为您的 lambda。

希望这一切都有意义!

【讨论】:

  • 感谢@Zach Munro,内部和外部函数soo清楚地解释了变量范围,非常感谢,赞成!
【解决方案2】:

sample_func 是一个函数工厂,它返回函数(在本例中为 lambda 函数)。

所以sample_func的返回值本身就是一个函数。因此,当您将它存储在#2 中的变量中时,您将 lambda 函数存储在那里。相当于:

s = lambda x: x*x

然后当您调用函数 s(5) 时,它使用 x=5,并返回 55=25。同样,s(4),使用 x=4,并返回 44=16。

在更一般的意义上,lambda *args: return_value

在这种情况下,sammple_func 的参数 a 未被使用,因为我们在 lambda 中重新声明了它。

def sample_func(a):       #1
    return lambda a: a*a

相当于:

def sample_func(_):       #1
        return lambda a: a*a

如果您想在 lambda 中从 sample_func 访问 a,只需将 lambda 的参数称为其他名称:

def sample_func(a):
    return lambda x: a * x

现在,如果您运行代码,s(5) 将返回 10,等于 2 * 5

【讨论】:

  • 谢谢@miquelvir,你能解释一下s=sample_func(2) 中2的意义吗,因为只有在我们调用s(4)这个赋值之后,它才会返回16
  • 忘掉 lambda,你的函数基本上是 def s(x): return x*x,没有别的。所以,s(4) 当然会返回 16
  • 确定,完成!如果这解决了您的问题,请标记它
  • 谢谢@ThierryLathuille,#2 中的 2 发生了什么,解释器如何处理它?
  • 什么都没有。
猜你喜欢
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 2021-10-25
  • 2022-01-20
  • 2020-12-14
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
相关资源
最近更新 更多