刻意练习Python基础 ——day 07:函数与Lambda表达式(下)

17天 —— Python基础刻意练习

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:模块
    



函数与Lambda表达式



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

参考资料:

©️2020 CSDN 皮肤主题: 游动-白 设计师:上身试试 返回首页