Python基础学习笔记——函数(4):递归函数、匿名函数、高阶函数

函数

递归函数

  • 定义:在函数内部调用函数自身的函数称为递归函数。
  • 达到终止条件时,函数逐层结束运算,返回计算结果,要注意终止条件的构建,不然会出现无限递归,程序报错。
  • 特色:可以很是简洁的解决复杂问题,每次函数调用时,函数参数会临时储存,相互没有影响。
# 例子:阶乘
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语言借来的,能够用在任何须要函数的地方。
特色:
  1. 能够简化函数的代码实现,匿名函数只能写一行代码;
  2. 匿名函数返回结果不须要使用return关键字;
  3. 使用python写一些执行脚本时,使用lambda能够省去定义函数的过程,让代码更加精简;
  4. 对于一些抽象的,不会在别的地方再重复使用的函数,有时候给函数起个名字也是个难题,使用lambda不须要考虑命名的问题;
  5. 使用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. 函数的参数是一个函数类型,那么这样定义的函数是高阶函数;
  2. 函数的返回值是一个函数类型,那么这样定义的函数也是高阶函数;
  3. 函数的参数和返回值都是函数类型,那么这样定义的函数仍是高阶函数;
  • 特色:函数的参数或者返回值都是一个函数类型
  • 提示:函数的参数和返回值均可以是一个函数类型
# 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()

  • 功能:对列表的每个函数进行函数操做,详情能够在本文搜索“列表解析式和生成表达式(列表推导式)”中的“建议”。
相关文章
相关标签/搜索