重新修订 6 - 8 章节
This commit is contained in:
63
Article/PythonBasis/python6/5.md
Normal file
63
Article/PythonBasis/python6/5.md
Normal file
@@ -0,0 +1,63 @@
|
||||
# 五、匿名函数 #
|
||||
|
||||
有没有想过定义一个很短的回调函数,但又不想用 `def` 的形式去写一个那么长的函数,那么有没有快捷方式呢?
|
||||
|
||||
答案是有的。
|
||||
|
||||
python 使用 lambda 来创建匿名函数,也就是不再使用 def 语句这样标准的形式定义一个函数。
|
||||
|
||||
匿名函数主要有以下特点:
|
||||
|
||||
* lambda 只是一个表达式,函数体比 def 简单很多。
|
||||
* lambda 的主体是一个表达式,而不是一个代码块。仅仅能在 lambda 表达式中封装有限的逻辑进去。
|
||||
* lambda 函数拥有自己的命名空间,且不能访问自有参数列表之外或全局命名空间里的参数。
|
||||
|
||||
**基本语法**
|
||||
|
||||
```python
|
||||
lambda [arg1 [,arg2,.....argn]]:expression
|
||||
```
|
||||
|
||||
示例:
|
||||
|
||||
```python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
sum = lambda num1 , num2 : num1 + num2;
|
||||
|
||||
print( sum( 1 , 2 ) )
|
||||
|
||||
```
|
||||
|
||||
输出的结果:
|
||||
|
||||
```txt
|
||||
3
|
||||
```
|
||||
|
||||
注意:**尽管 lambda 表达式允许你定义简单函数,但是它的使用是有限制的。 你只能指定单个表达式,它的值就是最后的返回值。也就是说不能包含其他的语言特性了, 包括多个语句、条件表达式、迭代以及异常处理等等。**
|
||||
|
||||
匿名函数中,有一个特别需要注意的问题,比如,把上面的例子改一下:
|
||||
|
||||
```python
|
||||
# -*- coding: UTF-8 -*-
|
||||
|
||||
num2 = 100
|
||||
sum1 = lambda num1 : num1 + num2 ;
|
||||
|
||||
num2 = 10000
|
||||
sum2 = lambda num1 : num1 + num2 ;
|
||||
|
||||
print( sum1( 1 ) )
|
||||
print( sum2( 1 ) )
|
||||
```
|
||||
|
||||
你会认为输出什么呢?第一个输出是 101,第二个是 10001,结果不是的,输出的结果是这样:
|
||||
|
||||
```txt
|
||||
10001
|
||||
10001
|
||||
```
|
||||
|
||||
**这主要在于 lambda 表达式中的 num2 是一个自由变量,在运行时绑定值,而不是定义时就绑定,这跟函数的默认值参数定义是不同的。所以建议还是遇到这种情况还是使用第一种解法。**
|
||||
|
||||
Reference in New Issue
Block a user