## 1\. 匿名函数
大家来思考一个问题:
~~~
def my_add(a, b):
return a + b
my_add()
~~~
my\_add 函数需要2行定义, 能不能简化一下定义方式, 一行搞定! 当然可以, 我们可以把这种函数写成一个**匿名函数**.
* 匿名函数的概念
* 匿名函数语法格式
* 匿名函数和普通函数的区别
* 匿名函数的使用场景
### 1.1 语法格式
定义的函数没有名字,这样的函数叫做**匿名函数.**
我们先看下匿名函数的语法结构:
~~~
lambda [形参1], [形参2], ... : [单行表达式] 或 [函数调用]
~~~
使用匿名函数, 上面的函数我们就可以定义为单行的函数.
~~~
# 不带参数
my_fun = lambda : 10 + 20
# 带参数
my_add = lambda a, b: a + b
my_add()
~~~
### 1.2 和普通函数的区别
~~~
def my_function(start, end):
my_sum = 0
while start <= end:
my_sum += start
start += 1
return my_sum
~~~
1. 匿名函数中**不能使用 if 语句、while 循环、for 循环**, 只能编写单行的表达式,或函数调用, 普通函数都可以.
2. 匿名函数中返回结果**不需要使用 return**, 表达式的运行结果就是返回结果, 普通函数返回结果必须 return.
3. 匿名函数中也可以不返回结果. 例如:`lambda : print('hello world')`
### 1.3 应用场景
#### 1.3.1 定义简单的单行函数
~~~
def my_function(a, b):
return a + b
~~~
使用 lambda 定义格式如下:
~~~
my_function = lambda a, b: a + b
~~~
#### 1.3.2 作为函数的参数进行传递(重点、难点)
#### 1.3.2.1 为什么函数要作为另外函数的参数?
~~~
def my_function1():
a = 100
b = 200
result = a + b
print('result:', result)
def my_function2():
a = 100
b = 200
result = a - b
print('result:', result)
def my_function3():
a = 100
b = 200
result = a * b
print('result:', result)
~~~
上面函数定义的缺点是:
1. 函数名要定义多个, 使用起来不方便. 需要记忆, 那个函数完成什么事情.
2. 上面函数只定义了三种计算方式: a + b、a -b、a \* b, 如果用户希望 a 和 b 进行除法运算, 那么显然还需要再写函数.
解决目标: 1、提高函数的通用性 2、减少代码量
可以通过传递给 my\_function 一个函数来完成.
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
def caculate_rule(a, b):
return a / b
my_function(caculate_rule)
~~~
![](https://img.kancloud.cn/d3/8d/d38d800fe8ea767bf77dc3cf72a9921d_1704x504.png)
### 1.3.2.2. 匿名函数做为函数参数
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
def caculate_rule1(a, b):
return a / b
def caculate_rule2(a, b):
return a // b
def caculate_rule3(a, b):
return a % b
my_function(caculate_rule1)
my_function(caculate_rule2)
my_function(caculate_rule3)
~~~
我们为了调用 my\_function 函数要写很多规则, 整个文件中可能就有很多定义的函数代码, 问题是:
1. 这些函数只会用一次
2. 这些函数也比较简单
就没有必要 py 文件中出现这么多无用的代码. 如何改进:
~~~
def my_function(func):
a = 100
b = 200
# 把 cucalate_rule 当做函数来调用
result = func(a, b)
print('result:', result)
my_function(lambda a, b: a / b)
my_function(lambda a, b: a // b)
my_function(lambda a, b: a % b)
~~~
### 1.3.2.3. 总结
1. 函数可以做为参数传递给另外一个函数, 可以使得函数的实现更加通用.
2. 匿名函数也可以作为参数传递给另外一个函数, 对于只需要用到一次函数, 可以通过匿名函数减少代码量.
- 计算机组成原理和Python基础知识
- 计算机组成原理
- 编程语言和Python
- 开发第一个Python程序
- 注释
- 变量以及类型
- 标识符和关键字
- 输出
- 输入
- 运算符
- 数据类型转换
- 判断语句和循环语句
- 判断语句介绍
- if语句
- 比较、关系运算符
- if...else...语句格式
- if...elif...else语句格式
- if语句的嵌套
- if应用:猜拳游戏
- 循环语句介绍
- while循环
- while循环应用
- while循环的嵌套以及应用
- for循环
- break和continue
- 字符串、列表、元组、字典
- 字符串介绍
- 字符串输出
- 字符串输入
- 下标和切片
- 字符串常见操作
- 列表介绍
- 列表的循环遍历
- 列表的常见操作
- 列表的嵌套
- 元组
- 字典介绍
- 字典的常见操作1
- 字典的常见操作2
- 字典的遍历
- 集合(扩展)
- 公共方法
- 4.函数(一)
- 4.1.函数介绍
- 4.2.函数定义和调用
- 4.3.函数的文档说明
- 4.4.函数参数(一)
- 4.5.函数返回值(一)
- 4.6.函数的嵌套调用
- 4.7.函数应用:打印图形和数学计算
- 5.函数(二)
- 5.1.局部变量
- 5.2.全局变量
- 5.3.多函数程序的基本使用流程
- 5.4.函数返回值(二)
- 5.5.函数参数(二)
- 5.6.拆包、交换变量的值
- 5.7.引用(一)
- 5.8.可变、不可变类型
- 5.9.引用(二)
- 5.10.函数使用注意事项
- 6.强化练习
- 6.1.函数应用:学生管理系统
- 6.2.递归函数
- 6.3. 匿名函数
- 6.4.列表推导式
- 6.5.set、list、tuple
- 6.6.高阶函数: map reduce filter
- 7.文件操作,综合应用
- 7.1.文件操作介绍
- 7.2.文件的读写
- 7.3.应用1:制作文件的备份
- 7.4.文件的相关操作
- 7.5.应用:批量修改文件名
- 7.6.综合应用:学生管理系统(文件版)
- 8.面向对象(上)
- 8.1.认识面向对象编程
- 8.2.类和对象
- 8.3.定义类
- 8.4.创建对象
- 8.5.添加和获取对象的属性
- 8.6.在方法内通过self获取对象属性
- 8.7.魔法方法 - init()
- 8.8.魔法方法 - 有参数的__init__()方法
- 8.9.魔法方法 - str()方法
- 8.10.魔法方法 - del()方法
- 8.11.实操案例 - 烤土豆
- 9.面向对象(中)
- 9.1.实操案例 - 放家具
- 9.2.继承的概念
- 9.3.单继承
- 9.4.多继承
- 9.5.子类重写父类的同名属性和方法
- 9.6.子类调用父类同名属性和方法
- 9.7.多层继承
- 9.8.通过super()来调用父类的方法
- 10.面向对象(下)
- 10.1.私有属性和私有方法
- 10.2.修改私有属性的值
- 10.3.多态
- 10.4.类属性和实例属性
- 10.5.静态方法和类方法
- 11.异常处理与模块初识
- 11.1.异常
- 11.2.捕获异常
- 11.3.异常的传递
- 11.4.抛出自定义的异常
- 11.5.获取异常完整信息的正确姿势
- 11.6.认识模块
- 11.7.开发模块
- 11.8.模块中的__all__(未完成)
- 11.9.python中的包(未完成)
- 12.课后加餐
- 12.1.基础应用 - 进销存管理系统(未完成)
- 12.2.基础应用 - 员工信息管理系统(未完成)
- 12.1.编码规范 - PEP8编码规范(未完成)