函数
递归函数
- 定义:在函数内部调用函数自身的函数称为递归函数。
- 达到终止条件时,函数逐层结束运算,返回计算结果,要注意终止条件的构建,否则会出现无限递归,程序报错。
- 特点:能够非常简洁的解决复杂问题,每次函数调用时,函数参数会临时储存,相互没有影响。
# 例子:阶乘
def calc_num(num):
if num == 1:
# 如果计算1的阶乘,直接返回结果
return 1
else:
return num * calc_num(num-1)
result = calc_num(3)
print(result)
Python中递归的缺点:就是递归有上限控制,默认是1000次,实际997或者998次就已经不能再调用自己了,并报错。
设置Python递归默认的递归次数上限
- 注意:设置仅本次有效,程序一关就失效了。
import sys
# 获取默认的递归次数
result = sys.getrecursionlimit()
print(result)
# 修改默认的递归次数
sys.setrecursionlimit(1200)
递归函数的调用过程
匿名函数(lamdba)
- 定义:没有名字的函数可以称为匿名函数或者使用
lambda
关键字定义的函数也可以称为匿名函数,匿名函数也是函数,只是特殊的函数而已。 lambda
函数是一种快速定义单行的最小函数,是从Lisp
语言借来的,可以用在任何需要函数的地方。
特点:
- 可以简化函数的代码实现,匿名函数只能写一行代码;
- 匿名函数返回结果不需要使用
return
关键字; - 使用python写一些执行脚本时,使用
lambda
可以省去定义函数的过程,让代码更加精简; - 对于一些抽象的,不会在别的地方再重复使用的函数,有时候给函数起个名字也是个难题,使用
lambda
不需要考虑命名的问题; - 使用
lambda
在某些时候让代码更容易理解
使用方法:
- 用于简单的,能够在一行内表示的函数,表达式为返回值或者调用其他函数;
- 在Python里面可以使用变量保存了一个函数(匿名函数);
- 匿名函数只能实现简单的功能操作,表达式不能实现复杂的功能操作,比如: 不能循环,不能使用if语句。
语法格式
变量 = lambda<参数列表>: <表达式>
例
new_func = lambda num1, num2: num1 + num2
print(type(new_func)) # <class 'function'>
result = new_func(1, 2) # 执行匿名函数
print(result) # 3
匿名函数的应用场景
- 应用:匿名函数可以作为参数给另外一个函数去使用;
注意:
- 普通函数也可以作为参数给另外一个函数去使用;
- 函数接收一个函数类型的参数,那么传参的时候只写函数名即可,不需要加上小括号,加小括号表示执行。
def calc_num(new_func): # new_func表示要接收一个函数类型的参数
n1 = 1
n2 = 2
result = new_func(n1, n2)
print("计算的结果为:", result)
# 使用匿名函数作为参数给另外一个函数使用
calc_num(lambda x, y: x + y)
高阶函数
定义:
- 函数的参数是一个函数类型,那么这样定义的函数是高阶函数;
- 函数的返回值是一个函数类型,那么这样定义的函数也是高阶函数;
- 函数的参数和返回值都是函数类型,那么这样定义的函数还是高阶函数;
- 特点:函数的参数或者返回值都是一个函数类型
- 提示:函数的参数和返回值都可以是一个函数类型
# 一、函数的参数要接收的是一个函数类型,那么这样的函数就是高阶函数
def calc_num(new_func):
# new_func = 函数(lambda x, y: x - y)
num1 = 1
num2 = 2
result = new_func(num1, num2)
print(result)
def sum_num(num1, num2):
return num1 + num2
# sum_num这个函数作为参数,传递给calc_num这个函数去使用
calc_num(sum_num)
# 提示: 如果函数只使用一次,并且还要作为函数的参数使用
# 那么这样函数可以定义为匿名函数
calc_num(lambda x, y: x - y)
# 二、函数的返回值是一个函数类型
def show(): # (这个函数其实是装饰器,具体可以查看Python进阶学习笔记——装饰器)
# 在函数内部还可以再次定义一个函数,这样的函数可以称为函数嵌套
def inner():
print("内部函数")
# 返回值是函数类型
return inner
# 调用函数,只是返回内部函数
new_func = show()
print(type(new_func), new_func)
# <class 'function'> <function show.<locals>.inner at 0x0000027FD32A8510>
# 此时才相当于执行内部函数
new_func()
内置高阶函数
reduce()
归纳、减少、降低
- 功能:根据指定函数的功能,完成指定容器类型中每一个数据的相关计算。前两个数结果再与下一个数执行函数。
- 注意:
reduce()
接收的函数类型必须要有两个参数(不能多不能少)。
# 导入函数工具包
import functools
# 通过该函数,完成容器类型中的每一个数据的拼接操作
my_tuple = ('a', 'b', 'c')
def my_join(param1, param2):
result = param1 + param2
return result
result = functools.reduce(my_join, my_tuple)
print(result, type(result)) # abc <class 'str'>
# 用reduce()做阶梯加法的:1,2,3,4,5 1+2 3+3 6+4 10+5
from functools import reduce #reduce 函数在functools模块中
def f(x, y):
return x+y
reduce(f, [1,2,3,4,5,6])
# f函数就为了生成个参数,所以没有必要定义函数,可以直接改成匿名函数
f = lambda x,y : x+y #返回的是一个函数
reduce(f, [1,2,3,4,5,6])
filter()
过滤
- 功能:根据函数的功能对容器类型中的数据进行过滤操作,
True
获取,False
丢弃。
my_list = [1, 3, 0, 2, 4]
def max_value(value):
return value > 2
# 遍历容器类型中的每一个数据,把数据交给指定函数进行比较
# 判断是否获取传入的数据:True获取,False丢弃。
new_filter = filter(max_value, my_list)
print(new_filter) # <filter object at 0x000001C351C53278>
# 把filter类型转成列表类型即可,就能获取过滤的结果了
result = list(new_filter)
print(result) # [3, 4]
# max_value这种简单的函数可以直接使用匿名函数代替
new_filter = filter(lambda x: x > 2, my_list)
# 扩展:遍历my_list里面的每一个数据,把每一个字典数据交给匿名函数进行判断,
# 条件成立的保存,否则就过滤掉这个数据
my_list = [{"name": "张三", "age": 20}, {"name": "李四", "age": 22}]
new_filter = filter(lambda my_dict: my_dict["age"] > 20, my_list)
new_list = list(new_filter)
print(new_list) # [{'name': '李四', 'age': 22}]
map()
- 功能:对列表的每一个函数进行函数操作,详情可以在本文搜索“列表解析式和生成表达式(列表推导式)”中的“建议”。