匿名函数

在定义函数的时候,不想给函数起一个名字,或者一个函数有一个返回值并且只有一句代码时,这个时候就可以用 lambda 来定义一个匿名函数
定义: 变量名 = lambda [参数1,参数2..] :逻辑表达式

  • 参数:不需要用括号,通常以逗号分隔的变量表达式形式,也就是位置参数
  • 表达式:不能是代码块,不能包含多条语句,只有一条语句譬如 if…else…
  • 不需要使用 return 语句返回

image.png

参数不需要用括号,表达式可以写括号也可以不写

  • 常规参数 ```python result = lambda x, y : x + y # 变量接收结果

print(result) # 返回的是函数的内存地址 print(result(1, 2)) # 将变量作为函数名进行调用

  1. - **默认参数**
  2. ```python
  3. result = lambda a, b, c=100 : a + b + c
  4. print(result(10, 20))
  • 可变参数 ```python fn = lambda *args : args print(fn(1, 2, 3)) # 返回元组

fn1 = lambda **kwargs : kwargs print(fn1(name=’tom’, age=12)) # 返回字典


- **带判断的**
```python
fn = lambda a, b : a if a >b else b
print(fn(1, 2))
  • 列表数据按字典 key 的值排序 ```python students = [ {‘name’: ‘tom’, ‘age’: 20}, {‘name’: ‘rose’, ‘age’: 22}, {‘name’:’rose’, ‘age’: 23} ]

students.sort(key = lambda x: x[‘name’]) # 利用 lambda 函数进行遍历获取 key 的值,x 指的是字典 print(students)

> sort(key=None, reverse=False),key=None 指可以指定可迭代对象中的一个元素来进行排序



<a name="080c2"></a>
### 递归函数
一个函数在内部调用自己本身
<a name="CJdSL"></a>
#### 特性

- 必须是函数内部自己调用自己
- 必须有一个明确的递归结束条件,即为递归出口

<a name="T26hK"></a>
#### 应用场景

- 快速排序
- 遍历文件夹下面文件
- 阶乘
```python
def sum_nums(num):
    if num == 1:                               # 2. 必须有个出口(退出),即限制条件否则无限递归
        return 1
    return num + sum_nums(num-1)               # 1. 函数内部自己调用自己
result = sum_nums(3)
print(result)

QQ20200928-133117@2x.png

高阶函数

把函数作为参数传递,这样的函数称为高阶函数,高阶函数是函数式编程的体现。函数式编程大量使用函数,减少了代码的重复修改

内置函数

  • abs(),数字求绝对值
  • round(),数字四舍五入 ```python def sum_num(a, b, f): # 形参占位 return f(a) + f(b) result = sum_num(-1, 2, abs) # 将 函数名 以实参代入 print(result)

result = sum_num(-1, 2, round) # 只需要修改传递函数就可以改变整个函数作用 print(result)


<a name="hMFE1"></a>
#### 数据处理函数

- **filter(),过滤函数**

     filter(function, iterable),对容器中的元素进行过滤处理。**function 是个提供过滤条件的函数,返回布尔值。**iterable 是容器类型的数据。
```python
list1 = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

def func(x):
    return x % 2 == 0

result = filter(func, list1)                          # 将 list1 中的元素遍历逐一传递到 func 中执行过滤
print(result)                                         # 结果存在新的容器中
print(list(result))                                   # 将容器转换成列表

在调用 filter() 函数时,iterable 会被遍历,它的元素会被逐一传入 function() 函数中。function() 函数若返回 True,则元素被保留;若返回 False,则元素被过滤。最后遍历完成,已保留的元素被放到一个新的容器数据中。

  • map(),映射函数

    map(function, iterable),对容器中的元素进行映射或变换。function 是个提供变换规则的函数,返回变换后元素。iterable 是容器类型的数据。 ```python

    求列表中元素的 2 次方

list1 = [1, 2, 3, 4, 5]

def func(x): # 定义计算 2 次方函数 return x ** 2

result = map(func, list1) # 将 list1 中元素遍历逐一传入 func 中执行变换 res = list(result) # 将容器转换成列表 print(res)

> 在调用 map() 函数时,iterable 会被遍历,它的元素会被逐一传入 function() 函数中。在 function() 函数中对元素进行变换。最后遍历完成,变换后的元素被放到一个新的容器数据中。


- **reduce()**

     Python3.x 中 reduce() 已经被移到 functools 模块里,需要引入 functools 模块来调用 reduce() 函数 <br />     reduce(function, iterable),对容器中的元素进行累积。**function 必须有两个参数,返回累积的元素。**iterable 是容器类型的数据。
```python
# 计算列表序列中各个数字的累加和
import functools

list1 = [1, 2, 3, 4, 5]

def func(a, b):
    return a + b

result = functools.reduce(func, list1)
print(result)