Python lambda函数(匿名函数)、参数类型与递归全解析

2025-08-07 21:50

本文主要是介绍Python lambda函数(匿名函数)、参数类型与递归全解析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

《Pythonlambda函数(匿名函数)、参数类型与递归全解析》本文详解Python中lambda匿名函数、灵活参数类型和递归函数三大进阶特性,分别介绍其定义、应用场景及注意事项,助力编写简洁高效...

python 中,函数是代码组织的核心单元。除了基础定义与调用,lambda 匿名函数、灵活的参数类型以及递归函数等进阶特性,能极大提升代码的简洁性与灵活性。本文结合实例代码,详细讲解这些进阶知识点,帮助你写出更 Pythonic 的代码。

一、lambda 匿名函数:简洁的单行函数

lambda 函数(匿名函数)是一种简化的函数形式,适用于实现简单逻辑,其核心特点是 “一行代码完成一个功能”。

1. lambda 的定义与基本用法

lambda 函数的语法格式:
函数名 = lambda 形参列表: 表达式(函数体)

  • 函数体只能是单一表达式(不能是多行代码)
  • 若有返回值,无需显式写return(表达式结果即为返回值)
""android"
lambda函数(匿名函数):
        函数体只能是一句话
        函数体如果是return返回值,return必须省略
lambda定义:
        test=lambda 形参列表: 一句函数体
"""
# 普通函数:两数相加并打印
def test(a, b):
    print(a + b)
# 等价的lambda函数
test2 = lambda a, b: print(a + b)
test2(1, 2)  # 输出:3
# lambda函数返回布尔值(判断是否为偶数)
test3 = lambda a: a % 2 == 0
print(test3(8))  # 输出:True(8是偶数)
# 无参数的lambda函数
test4 = lambda: print(111)
test4()  # 输出:111

2. lambda 的经典应用:作为参数传递

lambda 函数常作为sorted()map()filter()等函数的参数,简化代码逻辑。例如对复杂列表排序:

# 列表包含多个字典,需按age和height排序
ls = [
    {'name': 'mary', 'age': '20', 'height': 175},
    {'name': 'tom', 'age': '15', 'height': 168},
    {'name': 'jack', 'age': '18', 'height': 183},
    {'name': 'rose', 'age': '15', 'height': 160},
]
# 使用lambda指定排序规则:先按age升序,再按height升序
sorted_ls = sorted(ls, key=lambda dic: (dic['age'], dic['height']), reverse=False)
print(sorted_ls)
# 输出结果中,age=15的元素按height从小到大排列(rose在前,tom在后)

此处 lambda 函数lambda dic: (dic['age'], dic['height'])作为key参数,定义了排序的依据,代码比单独定义函数更简洁。

3. 常见 lambda 练习题

结合基础运算场景,lambda 函数可快速实现简单逻辑:

'''
1. 使用匿名函数计算一个数的立方。
2. 定义一个匿名函数,判断一个数是否为偶数。
3. 定义一个匿名函数,返回三个参数的乘积。
'''
# 1. 计算立方
test1 = lambda x: x **3
print(test1(2))  # 输出:8(2=8)
# 2. 判断偶数
test2 = lambda x: x % 2 == 0
print(test2(6))  # 输出:True(6是偶数)
# 3. 三个参数乘积
test3 = lambda x, y, z: x * y * z
print(pythontest3(1, 2, 3))  # 输出:6(123=6)

二、函数参数类型:灵活传递的艺术

Python 函数的参数类型非常灵活,支持位置参数、关键字参数、默认值参数、不定参数等,满足不同场景的传参需求。

1. 位置参数与关键字参数

 位置参数 :按参数定义顺序传递,必须一一对应。
关键字参数 :通过param=val形式传递,无需考虑顺序;*后的参数必须用关键字传递。

# 函数定义:*后的参数c必须用关键字传递
def test1(a, b, *, c):
    print(a, b, c)
# 合法调用(前两个位置参数,c用关键字)
test1(1, 2, c=5)  # 输出:1 2 5
# 关键字参数可打乱顺序
test1(b=2, a=1, c=4)  # 输出:1 2 4

2. 默认值参数

参数可设置默认值,调用时若不传递则使用默认值(默认参数必须放在位置参数后)。

def test2(a, b=3):  # b的默认值为3
    print(a, b)
test2(1, 9)  # 传递b=9,输出:1 9
test2(1)     # 不传递b,使用默认值,输出:1 3

3. 不定参数:*args 与 **kwargs

当参数数量不确定时,可使用不定参数:

  • *args:收集所有位置参数,打包为元组。
  • **kwargs:收集所有关键字参数,打包为字典。
def test3(*args, **kwargs):
    print("位置参数打包为元组:", args)
    print("关键字参数打包为字典:", kwargs)
# 传递3个位置参数和2个关键字参数
test3(1, 2, 3, a=4, b=5)
# 输出:
# 位置参数打包为元组: (1, 2, 3)
# 关键字参数打包为字典: {'a': 4, 'b': 5}
# 不传递参数(也合法)
test3()
# 输出:
# 位置参数打包为元组: ()
# 关键字参数打包为字典: {}

4. 解包传递:从数据结构中提取参数

若参数存储在列表、元组、字典等结构中,可通过解包快速传递:

  • 列表 / 元组 / 集合:用*解包为位置参数。
  • 字典:用 **解包为关键字参数(键需与函数参数名一致)。
# 从列表和字典中解包参数
test3(*[10, 20, 30], **{'a': 1, 'b': 2})
# 等价于 test3(10, 20, 30, a=1, b=2)
# 输出:
# 位置参数打包为元组: (10, 20, 30)
# 关键字参数打包为字典: {'a': 1, 'b': 2}

三、递归函数:自己调用自己的艺术

递归是指函数内部调用自身的编程技巧,适用于有明确规律且可拆解为同类子问题的场景(如阶乘、数列计算)。

1. 递归的核心要素

python递归函数需明确两个关键点:
 出口条件 :当满足某条件时,返回确定值(终止递归,避免无限循环)。
规律(递归关系):将原问题拆解为规模更小的同类子问题。

注意:Python 默认递归深度不超过 1000 层,且递归效率较低,复杂场景建议用循环替代。

2. 递归实例解析

实例 1:阶乘计算(n! = n × (n-1) × ... × 1)

# 阶乘的递归实现
def jc(n):
    # 出口:n=1时,1! = 1
    if n == 1:
        return 1
    # 规律:n! = n  (n-1)!
    return n * jc(n - 1)
# 执行过程:
# jc(5) = 5  jc(4)
# jc(4) = 4  jc(3)
# jc(3) = 3  jc(2)
# jc(2) = 2  jc(1)
# jc(1) = 1
print(jc(5))  # 输出:120(5! = 120)

实例 2:斐波那契数列(1, 1, 2, 3, 5, 8...,第 n 项 = 前两项之和)

def feibo(n):
    # 出口:第1项和第2项均为1
    if n == 1 or n == 2:
        return 1
    # 规律:第n项 = 第n-1项 + 第n-2项
    return feibo(n - 1) + feibo(n - 2)
print(feibo(5))  # 输出:5(第5项为5)
# 执行过程:
# feibo(5) = feibo(4) + feibo(3)
# feibo(4) = feibo(3) + feibo(2) = 2 + 1 = 3
# feibo(3) = feibjso(2) + feibo(1) = 1 + 1 = 2

实例 3:自定义数列(f (0)=1, f (1)=4, f (n+2)=2×f (n+1)+f (n))

# 求f(10)的值
def f(n):
    # 出口:n=0返回1,n=1返回4
    if n == 0:
        return 1
    if n == 1:
        return 4
    # 规律:f(n) = 2f(n-1) + f(n-2)(由f(n+2)=2f(n+1)+f(n)推导)
    return 2 * f(n - 1) + f(n - 2)
print(f(5))  # 输出:673(计算过程:f(2)=9, f(3)=22, f(4)=53, f(5)=128?实际按递归推导正确值)

四、总结

本文讲解的三大函数进阶特性,适用场景各有侧重:
lambda 函数 :适编程合实现简单逻辑,尤其作为参数传递时可简化代码。
灵活参数类型 :位置参数、关键字参数、不定参数和解包,让传参更灵活,适应多变的输入场景。
递归函数:适合有明确规律的问题(如数列、树结构遍历),但需注意深度限制和效率问题。

到此这篇关于Python lambda函数(匿名函数)、参数类型与递归全解析的文章就介绍到这了,更多相关Python lambda函数内容请搜索China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!

这篇关于Python lambda函数(匿名函数)、参数类型与递归全解析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1155627

相关文章

Java中Redisson 的原理深度解析

《Java中Redisson的原理深度解析》Redisson是一个高性能的Redis客户端,它通过将Redis数据结构映射为Java对象和分布式对象,实现了在Java应用中方便地使用Redis,本文... 目录前言一、核心设计理念二、核心架构与通信层1. 基于 Netty 的异步非阻塞通信2. 编解码器三、

Java HashMap的底层实现原理深度解析

《JavaHashMap的底层实现原理深度解析》HashMap基于数组+链表+红黑树结构,通过哈希算法和扩容机制优化性能,负载因子与树化阈值平衡效率,是Java开发必备的高效数据结构,本文给大家介绍... 目录一、概述:HashMap的宏观结构二、核心数据结构解析1. 数组(桶数组)2. 链表节点(Node

Java 虚拟线程的创建与使用深度解析

《Java虚拟线程的创建与使用深度解析》虚拟线程是Java19中以预览特性形式引入,Java21起正式发布的轻量级线程,本文给大家介绍Java虚拟线程的创建与使用,感兴趣的朋友一起看看吧... 目录一、虚拟线程简介1.1 什么是虚拟线程?1.2 为什么需要虚拟线程?二、虚拟线程与平台线程对比代码对比示例:三

Python版本信息获取方法详解与实战

《Python版本信息获取方法详解与实战》在Python开发中,获取Python版本号是调试、兼容性检查和版本控制的重要基础操作,本文详细介绍了如何使用sys和platform模块获取Python的主... 目录1. python版本号获取基础2. 使用sys模块获取版本信息2.1 sys模块概述2.1.1

一文解析C#中的StringSplitOptions枚举

《一文解析C#中的StringSplitOptions枚举》StringSplitOptions是C#中的一个枚举类型,用于控制string.Split()方法分割字符串时的行为,核心作用是处理分割后... 目录C#的StringSplitOptions枚举1.StringSplitOptions枚举的常用

一文详解Python如何开发游戏

《一文详解Python如何开发游戏》Python是一种非常流行的编程语言,也可以用来开发游戏模组,:本文主要介绍Python如何开发游戏的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录一、python简介二、Python 开发 2D 游戏的优劣势优势缺点三、Python 开发 3D

Python函数作用域与闭包举例深度解析

《Python函数作用域与闭包举例深度解析》Python函数的作用域规则和闭包是编程中的关键概念,它们决定了变量的访问和生命周期,:本文主要介绍Python函数作用域与闭包的相关资料,文中通过代码... 目录1. 基础作用域访问示例1:访问全局变量示例2:访问外层函数变量2. 闭包基础示例3:简单闭包示例4

Python实现字典转字符串的五种方法

《Python实现字典转字符串的五种方法》本文介绍了在Python中如何将字典数据结构转换为字符串格式的多种方法,首先可以通过内置的str()函数进行简单转换;其次利用ison.dumps()函数能够... 目录1、使用json模块的dumps方法:2、使用str方法:3、使用循环和字符串拼接:4、使用字符

Python版本与package版本兼容性检查方法总结

《Python版本与package版本兼容性检查方法总结》:本文主要介绍Python版本与package版本兼容性检查方法的相关资料,文中提供四种检查方法,分别是pip查询、conda管理、PyP... 目录引言为什么会出现兼容性问题方法一:用 pip 官方命令查询可用版本方法二:conda 管理包环境方法

MyBatis延迟加载与多级缓存全解析

《MyBatis延迟加载与多级缓存全解析》文章介绍MyBatis的延迟加载与多级缓存机制,延迟加载按需加载关联数据提升性能,一级缓存会话级默认开启,二级缓存工厂级支持跨会话共享,增删改操作会清空对应缓... 目录MyBATis延迟加载策略一对多示例一对多示例MyBatis框架的缓存一级缓存二级缓存MyBat