14_python基础—匿名函数lambda表达式

简介: 14_python基础—匿名函数lambda表达式

一、lambda 表达式


1.1 lambda的应用场景


如果一个函数有一个返回值,并且只有一句代码,可以使用 lambda简化。


1.2 lambda语法


lambda 参数列表 : 表达式


注意


lambda表达式的参数可有可无,函数的参数在lambda表达式中完全适用。

lambda表达式能接收任何数量的参数但只能返回一个表达式的值。


快速入门

# 函数
def fn1():
    return 100
print(fn1)
print(fn1())
# lambda(匿名函数)表达式
fn2 = lambda: 100
print(fn2)      # lambda 内存地址
# 100返回值 调用函数
print(fn2())


注意:直接打印lambda表达式,输出的是此lambda的内存地址


1.3 示例:计算a + b


1.3.1 函数实现


def add(a, b):
    return a + b
result = add(1, 2)
print(result)


思考:需求简单,是否代码多?


1.3.2 lambda实现


fn1 = lambda a, b: a + b
print(fn1(1, 2))


1.4 lambda的参数形式


1.4.1 无参数


fn1 = lambda: 100
print(fn1())


1.4.2 一个参数


fn1 = lambda a: a
print(fn1('hello world'))


1.4.3 默认参数(缺省参数)


fn1 = lambda a, b, c=100: a + b + c
print(fn1(10, 20))


1.4.4 可变参数:*args


fn1 = lambda *args: args
print(fn1(10, 20, 30))


注意:这里的可变参数传入到lambda之后,返回值为元组。


1.4.5 可变参数:**kwargs


接收不定长的关键字参数,返回一个字典


fn1 = lambda **kwargs: kwargs
print(fn1(name='python', age=20))


1.5 lambda的应用


1.5.1 带判断的lambda


fn1 = lambda a, b: a if a > b else b
print(fn1(1000, 500))


1.5.2 列表数据按字典key的值排序

students = [
    {'name': 'TOM', 'age': 20},
    {'name': 'ROSE', 'age': 19},
    {'name': 'Jack', 'age': 22}
]
# 按name值升序排列
students.sort(key=lambda x: x['name'])
print(students)
# 按name值降序排列
students.sort(key=lambda x: x['name'], reverse=True)
print(students)
# 按age值升序排列
students.sort(key=lambda x: x['age'])
print(students)


二、高阶函数


把函数作为参数传入,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程就是指这种高度抽象的编程范式。


2.1 体验高阶函数


在Python中,abs()函数可以完成对数字求绝对值计算。


abs(-10)  # 10


round()函数可以完成对数字的四舍五入计算。


round(1.2)  # 1
round(1.9)  # 2


需求:任意两个数字,按照指定要求整理数字后再进行求和计算。


  • 方法1


def add_num(a, b):
    return abs(a) + abs(b)
result = add_num(-1, 2)
print(result)  # 3


  • 方法2


def sum_num(a, b, f):
    return f(a) + f(b)
result = sum_num(-1, 2, abs)
print(result)  # 3



注意:两种方法对比之后,发现,方法2的代码会更加简洁,函数灵活性更高。


函数式编程大量使用函数,减少了代码的重复,因此程序比较短,开发速度较快。


2.2 内置高阶函数


2.2.1 map()


map(func, lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表(Python2)/迭代器(Python3)返回。


需求:计算list1序列中各个数字的2次方。

list1 = [1, 2, 3, 4, 5]
def func(x):
    return x ** 2
result = map(func, list1)
print(result)  # <map object at 0x0000013769653198>
print(list(result))  # [1, 4, 9, 16, 25]


2.2.2 reduce()


reduce(func,lst),其中func必须有两个参数。每次func计算的结果继续和序列的下一个元素做累积计算。


注意:reduce()传入的参数func必须接收2个参数。


需求:计算list1序列中各个数字的累加和。

import functools
list1 = [1, 2, 3, 4, 5]
def func(a, b):
    return a + b
result = functools.reduce(func, list1)
print(result)  # 15


2.2.3 filter()


filter(func, lst)函数用于过滤序列, 过滤掉不符合条件的元素, 返回一个 filter 对象。如果要转换为列表, 可以使用 list() 来转换。

list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
def func(x):
    return x % 2 == 0
result = filter(func, list1)
print(result)  # <filter object at 0x0000017AF9DC3198>
print(list(result))  # [2, 4, 6, 8, 10]


三、总结


  • 递归
  • 函数内部自己调用自己
  • 必须有出口
  • lambda
  • 语法


lambda 参数列表: 表达式


lambda的参数形式


  • 无参数


lambda: 表达式


  • 一个参数


lambda 参数: 表达式


  • 默认参数


lambda key=value: 表达式


  • 不定长位置参数


lambda *args: 表达式


  • 不定长关键字参数


lambda **kwargs: 表达式


  • 高阶函数
  • 作用:把函数作为参数传入,化简代码
  • 内置高阶函数
  • map()
  • reduce()
  • filter()
目录
相关文章
|
2月前
|
搜索推荐 Python
利用Python内置函数实现的冒泡排序算法
在上述代码中,`bubble_sort` 函数接受一个列表 `arr` 作为输入。通过两层循环,外层循环控制排序的轮数,内层循环用于比较相邻的元素并进行交换。如果前一个元素大于后一个元素,就将它们交换位置。
140 67
|
3天前
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
16 2
|
30天前
|
Python
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
Python中的函数是**一种命名的代码块,用于执行特定任务或计算
50 18
|
22天前
|
数据可视化 DataX Python
Seaborn 教程-绘图函数
Seaborn 教程-绘图函数
46 8
|
1月前
|
Python
Python中的函数
Python中的函数
44 8
|
2月前
|
监控 测试技术 数据库
Python中的装饰器:解锁函数增强的魔法####
本文深入探讨了Python语言中一个既强大又灵活的特性——装饰器(Decorator),它以一种优雅的方式实现了函数功能的扩展与增强。不同于传统的代码复用机制,装饰器通过高阶函数的形式,为开发者提供了在不修改原函数源代码的前提下,动态添加新功能的能力。我们将从装饰器的基本概念入手,逐步解析其工作原理,并通过一系列实例展示如何利用装饰器进行日志记录、性能测试、事务处理等常见任务,最终揭示装饰器在提升代码可读性、维护性和功能性方面的独特价值。 ####
|
2月前
|
缓存 前端开发 JavaScript
使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。
在我们快速发展的在线环境中,只需几秒钟加载的网站就能真正脱颖而出。您是否知道加载时间较快的网站的转化率比加载时间较长的网站高出三倍?
26 0
使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。
|
2月前
|
存储 JSON 网络安全
使用 EFS 在 AWS Lambda 上安装 Python 依赖项
使用 aws lambda 时,开发人员面临的常见挑战之一是管理大型 python 依赖项。
34 1
|
2月前
|
Python
Python中的`range`函数与负增长
在Python中,`range`函数用于生成整数序列,支持正向和负向增长。本文详细介绍了如何使用`range`生成负增长的整数序列,并提供了多个实际应用示例,如反向遍历列表、生成倒计时和计算递减等差数列的和。通过这些示例,读者可以更好地掌握`range`函数的使用方法。
54 5
|
3月前
|
Python
Python之函数详解
【10月更文挑战第12天】
Python之函数详解