函数
递归函数
- 定义:在函数内部调用函数自身的函数称为递归函数。
- 达到终止条件时,函数逐层结束运算,返回计算结果,要注意终止条件的构建,不然会出现无限递归,程序报错。
- 特色:可以很是简洁的解决复杂问题,每次函数调用时,函数参数会临时储存,相互没有影响。
# 例子:阶乘 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
设置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)
高阶函数
定义:
- 函数的参数是一个函数类型,那么这样定义的函数是高阶函数;
- 函数的返回值是一个函数类型,那么这样定义的函数也是高阶函数;
- 函数的参数和返回值都是函数类型,那么这样定义的函数仍是高阶函数;
- 特色:函数的参数或者返回值都是一个函数类型
- 提示:函数的参数和返回值均可以是一个函数类型
# 1、函数的参数要接收的是一个函数类型,那么这样的函数就是高阶函数 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) # 2、函数的返回值是一个函数类型 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()
- 功能:对列表的每个函数进行函数操做,详情能够在本文搜索“列表解析式和生成表达式(列表推导式)”中的“建议”。