Discuss / Python / 一个问题?

一个问题?

Topic source

为什么lambda函数作为返回函数的时候不是

def build(x, y):
    return lambda x,y: x * x + y * y


f=bulid(1,2)

f()

TypeError: <lambda>() missing 2 required positional arguments: 'x' and 'y'

反而这个时候 可以这样用了

>>> f(2,5)
29

求解答!

廖雪峰

#2 Created at ... [Delete] [Delete and Lock User]

你的lambda函数lambda x, y: x * x + y * y

相当于:

def f(x, y):
    return x * x + y * y

逝去的9211

#3 Created at ... [Delete] [Delete and Lock User]

应该是作用域的问题

Mrtwitter

#4 Created at ... [Delete] [Delete and Lock User]

你这样子就可以了,把那个lambda的x,y去掉

>>> def build(x,y):
    return lambda : x*x + y*y

>>> f = build(1,2)
>>> f()
5
def build(x, y):
    def g(x, y):
        return x * x + y * y
    return g
>>> f = build(1,2)
>>> f
<function <lambda> at 0x7fa2c73ed668>

当我们调用build时,返回的并不是结果,而是g函数

>>> f(1,2)
5

调用函数f时,才真正计算的结果

不知道这样理解对不对,求大神指教.

廖雪峰

#6 Created at ... [Delete] [Delete and Lock User]

这样定义:

def build(x, y):
    def g():
        return x * x + y * y
    return g

返回的函数在调用时不需要参数,因为def g()根本就没定义参数:

f = build(1, 2)
f()

这样定义:

def build():
    def g(x, y):
        return x * x + y * y
    return g

返回的函数在调用时必须要参数,因为def g(x,y)定义了两个参数:

f = build()
f(1, 2)

函数调用需不需要参数是定义的时候就确定的!

艾菁艾毅

#7 Created at ... [Delete] [Delete and Lock User]

是相当于局部变量将全局变量屏蔽了的效果吗?

北野秋哥

#8 Created at ... [Delete] [Delete and Lock User]

老师这么写容易引发误会,build函数有两个参数,a和b,只有传入两个参数调用build函数才会返回lambda函数,返回的lambda函数也需要两个参数来计算最终返回值.前两个参数,和后两个参数是不相干的,都写成x,y容易误导初学者!!

楼上的大兄弟说的很好

build函数写成这样,应该就懂了

def build(x,y):
    return lambda a,b: a*a+b*b

这里的x,y没有没实际使用,只是需要两个参数

f = build(3,4) 
f(1,2)

结果是5

f = build('a','b')
f(1,2)

结果也是5。

就想廖老师说的

def build(x,y):
    return lambda: x*x+y*y

相当于

def build(x,y):
    def g():
        return x*x+y*y
    return g

这样实际上是使用了 build函数的两个参数x,y,函数内不管嵌套了多少函数,都是可以使用x,y。

磊宝仔

#10 Created at ... [Delete] [Delete and Lock User]

如果是这样的话 def build(x,y): return lambda a,b: aa+bb

build函数根本就不需要传参数了,直接 def build(): return lambda a,b: aa+bb

返回一个需要两个参数的匿名函数


  • 1

Reply