Day 01——Task01:变量、运算符与数据类型
Day 02——Task02:条件与循环
Day 03——Task03:列表与元组(上)
Day 04——Task03:列表与元组(下)
Day 05——Task04:字符串与序列
Day 06——Task05:函数与Lambda表达式(上)
Day 07——Task05:函数与Lambda表达式(下)
Day 08——Task06:字典与集合
Day 09——Task07:文件与文件系统(上)
Day 10——Task07:文件与文件系统(下)
Day 11——Task08:异常处理
Day 12——Task09:else 与 with 语句
Day 13——Task10:类与对象(上)
Day 14——Task10:类与对象(下)
Day 15——Task11:魔法方法(上)
Day 16——Task11:魔法方法(下)
Day 17——Task12:模块
2. Lambda表达式
2.1. Lambda表达式介绍
匿名表达式—lambda
lambda 函数是一种快速定义单行的最小函数,是从Lisp借用来的,可以用在任何需要函数的地方。
lambda 是一个 匿名函数,不需要名字的函数,它更像一像是一个指令,通常只需要一行代码去做一件事情的函数,都可以用lambda定义它。 不需要函数名字,只需要函数功能的,就会用到它。
- 使用Python写一些执行脚本时,使用lambda可以省去定义函数的过程,让代码更加精筒。
- 对于一些抽象的,不会别在的地方再复用的函数,有时候给函数起个名字也是个难题,使用lambda不需要考虑命名的问题。只用到一次,执行一次函数效果的函数,可以选择简洁一点的lambda
- 使用lambda在某些时候让代码更容易理解。
- lambda 函数拥有自己的命名空间,且不能访问自己参数列表之外或全局命名空间里的参数。
lambda argument_list: expression
lambda
- 定义匿名函数的关键词。argument_list
- 函数参数,它们可以是位置参数、默认参数、关键字参数,和正规函数里的参数类型一样。:
- 冒号,在函数参数和表达式中间要加个冒号。expression
- 函数表达式,输入函数参数,输出一些值。
sumary = lambda arg1, arg2: arg1 + arg2
print(sumary(10, 20))
# 30
func = lambda *args: sum(args)
print(func(1, 2, 3, 4, 5))
# 15
2.2. 匿名函数 VS 正规函数
lbd_sqr = lambda x: x ** 2
print(lbd_sqr)
# <function <lambda> at 0x000000BABB6AC1E0>
print(lbd_sqr(9))
# 81
def sqr(x):
return x ** 2
print(sqr)
# <function sqr at 0x000000BABD3A4400>
print(sqr(9))
# 81
- 误用情况:如果用
lambda
函数只是为了赋值给一个变量,用def
的正规函数。 lbd_sqr
的返回值是以 标识的函数,而sqr
的返回时是以sqr
为标识的函数,明显后者一看就知道该函数是「计算平方」用的。
2.3. Lambda 表达式的应用
高阶函数 (high-order function) 在函数化编程 (functional programming) 很常见,主要有两种形式:
-
参数是函数 (filter, map)
-
返回值是函数 (closure)
下面,看看 map
, filter
的语法:
filter(function, iterable)
过滤序列,过滤掉不符合条件的元素,返回一个迭代器对象,如果要转换为列表,可以使用 list()
来转换。
odd = lambda x: x % 2 == 1
templist = filter(odd, [1, 2, 3, 4, 5, 6, 7, 8, 9])
print(list(templist)) # [1, 3, 5, 7, 9]
map(function, iterable, …)
根据提供的函数对指定序列做映射。
m1 = map(lambda x: x ** 2, [1, 2, 3, 4, 5])
print(list(m1)) # [1, 4, 9, 16, 25]
m2 = map(lambda x, y: x + y, [1, 3, 5, 7, 9], [2, 4, 6, 8, 10])
print(list(m2)) # [3, 7, 11, 15, 19]
除了 Python 这些内置函数,我们也可以自己定义高阶函数,如下:
def apply_to_list(fun, some_list):
return fun(some_list)
下面代码分别求出列表中所有元素的和、个数和均值。
lst = [1, 2, 3, 4, 5]
print(apply_to_list(sum, lst))
# 15
print(apply_to_list(len, lst))
# 5
print(apply_to_list(lambda x: sum(x) / len(x), lst))
# 3.0
参考资料: