一、语法部分
1. 有参
a = lambda x: x * x
print(a(2)) # 4
print(a) # <function <lambda> at 0x000001EF08062EA0>
- 其中 lambda 后 : 前定义的为形参 是调用lambda函数时所要传入的参数
2. 无参
a = lambda: 2
print(a()) # 2
3. 返回值
- 以上面的代码举例 其中 : 后面得出的结果就是返回值
二、理解
a = lambda x: x * x
print(a) # <function <lambda> at 0x000002EB97E02EA0>
print(id(a)) # 3210888621728
print(hex(id(a))) # 0x2eb97e02ea0
- 其中 直接打印a为打印此lambda对象 会显示为一个lambda的函数 在十六进制的内存地址处(通过id()方法对比得出)
- 相当于lambda就是一个函数 只不过目的是简化代码
重点
- 其中涉及到函数式编程的概念 意思见下面
和指令式编程相比,函数式编程强调函数的计算比指令的执行重要。
和过程化编程相比,函数式编程里函数的计算可随时调用。 - 意思就是 函数时编程注重函数的结果 不看重过程怎么样 我只需要你通过函数处理的数据不想知道你其中做到操作
- 但适用只要结果时用 相对于过程化的def定义的函数 重用性很低
三、 应用
en_num1 = tk.Entry(win, )
en_num1.pack()
en_num2 = tk.Entry(win, )
en_num2.pack()
data = lambda: [en_num1.get(), en_num2.get()]
def pri():
print(data())
tk.Button(win, text='hit me', command=pri).pack()
- 其中我截取了一个gui的代码片段
- 因为我需要动态的获取 我每次输入数字 点击按钮时都需要获取当前我输入的值为多少
- 然后我定义了一个名为data的lambda函数 返回一个包含输入框数据的数组 当我每次调用pri时 print()会每次打印data当前的值 因为如果函数不调用是不会执行的 只有当我点击按钮 print -> data 来获取data函数的返回值
关于Button中command传函数不加()原因
- 不加括号 command=pri
- 因为传入参数时 不加括号意思是传入一个对象 我们这里理解为一个地址 通过传入的地址 程序就能在此地址找到函数并且调用他
- 加括号 command=pri()
- 意思为我给你传入pri函数的返回值 但pri并没有返回值 相当于我传入了一个None 所以点击传入pri()的按钮会没有反应
- 如果需要使用加括号 比如以后想向调用函数中传参可以使用lambda
command=lambda: pri()