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递归默认的递归次数上限
  • 注意:设置仅本次有效,程序一关就失效了。
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. 函数的参数和返回值都是函数类型,那么这样定义的函数还是高阶函数;
  • 特点:函数的参数或者返回值都是一个函数类型
  • 提示:函数的参数和返回值都可以是一个函数类型
# 一、函数的参数要接收的是一个函数类型,那么这样的函数就是高阶函数
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()
  • 功能:对列表的每一个函数进行函数操作,详情可以在本文搜索“列表解析式和生成表达式(列表推导式)”中的“建议”。
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鬼义II虎神

打赏5C币,作者可获得4C币

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值