1. 什么是函数函数是 Python 中组织代码、实现代码复用的核心方式。它是一段具有特定功能的、可重复调用的代码块。通过函数我们可以把复杂的程序拆分成多个独立、易管理的小模块让代码更清晰、更易维护。在 Python 中使用def关键字来定义一个函数。函数的基本作用包括代码复用避免重复编写相同逻辑的代码。模块化设计将复杂问题拆解为多个小问题逐个解决。可读性提升通过函数名直观表达代码意图增强可读性。便于调试与测试独立函数可以单独测试降低排错难度。2. 函数的定义与调用2.1 基本语法def函数名(参数列表):文档字符串可选函数体return返回值# 可选2.2 最简单的函数defgreet():print(Hello, World!)# 调用函数greet()运行结果Hello, World!2.3 带参数的函数defgreet(name):print(fHello,{name}!)greet(Alice)运行结果Hello, Alice!2.4 带返回值的函数defadd(a,b):returnab resultadd(3,5)print(result)# 输出 83. 参数传递详解3.1 位置参数调用函数时按定义顺序依次传入参数defintroduce(name,age):print(f{name}is{age}years old.)introduce(Bob,25)3.2 关键字参数通过参数名指定传入值可以不按顺序introduce(age25,nameBob)3.3 默认参数为形参设置默认值调用时可省略defgreet(name,greetingHello):print(f{greeting},{name}!)greet(Alice)# 输出 Hello, Alice!greet(Bob,Hi)# 输出 Hi, Bob!注意默认参数必须放在非默认参数之后。3.4 可变参数*args用于接收任意数量的位置参数打包为元组defsum_all(*args):returnsum(args)print(sum_all(1,2,3))# 输出 6print(sum_all(1,2,3,4,5))# 输出 153.5 关键字可变参数**kwargs用于接收任意数量的关键字参数打包为字典defprint_info(**kwargs):forkey,valueinkwargs.items():print(f{key}:{value})print_info(nameAlice,age25,cityBeijing)运行结果name: Alice age: 25 city: Beijing3.6强制使用位置参数和关键字参数# /前使用位置参数*后使用关键字参数,/和*中间的可以用位置或者关键字参数需要保持一致不能在一种方式之间使用不同的方式deffun3(a,b,/,c,d,*,e,f):print(a,b,c,d,e,f)fun3(1,2,3,4,e5,f6)#正确fun3(1,2,3,d4,e5,f6)#正确fun3(1,2,c3,4,e5,f6)#错误3.7深拷贝、浅拷贝函数操作列表但不希望修改原列表的值list.copy()#浅拷贝copy.deepcopy(list)#深拷贝4. 返回值与作用域4.1 多个返回值Python 函数可以返回多个值实际是返回一个元组defget_min_max(numbers):returnmin(numbers),max(numbers)min_val,max_valget_min_max([3,1,4,1,5])print(min_val,max_val)# 输出 1 54.2 局部变量与全局变量global_var10# 全局变量defmy_func():local_var20# 局部变量print(global_var)# 可以访问全局变量print(local_var)my_func()# print(local_var) # 报错局部变量在函数外不可访问#全局变量sum0deffun5():globalsum#在局部作用域使用全局变量sum10fun5()print(sum)# 输出sum为10#局部变量defouter1():count0definner():nonlocalcount#声明使用的是非局部变量count10print(finner is{count})#输出10inner()print(fouter is{count})#输出10outer1()4.3 使用global修改全局变量counter0defincrement():globalcounter counter1increment()increment()print(counter)# 输出 24.4 闭包一个函数以内部函数作为返回值# 闭包defouter():print(outer)definner():print(inner)returninner outer()outer()()#outer返回的是inner函数如果想调用inner函数需要再加一个括号实现调用5. 匿名函数LambdaLambda 表达式用于创建简单的、单行的匿名函数# 语法lambda 参数: 表达式squarelambdax:x**2print(square(5))# 输出 25Lambda 常与map、filter、sorted等内置函数配合使用numbers[1,2,3,4,5]# 使用 map 对每个元素求平方 map对容器数据类型进行处理返回的是map类型需要进行转换squaredlist(map(lambdax:x**2,numbers))print(squared)# 输出 [1, 4, 9, 16, 25]# 使用 filter 筛选偶数对数据类型进行筛选返回的是filter对象需要进行转换evenslist(filter(lambdax:x%20,numbers))print(evens)# 输出 [2, 4]# 使用 sorted 按绝对值排序 sortedkey作为排序依据对容器数据类型进行排序points[(-2,3),(1,-4),(5,2)]sorted_pointssorted(points,keylambdap:abs(p[0])abs(p[1]))print(sorted_points)# 输出 [(1, -4), (-2, 3), (5, 2)]# reduce 将当前容器类型中的两个数据操作后再与其他数据进行相同的操作list1[1,2,3,4,5]print(reduce(lambdax,y:x*y,list1))#1*2*3*4*56. 递归函数递归是指函数调用自身。递归函数必须包含终止条件否则会无限循环导致栈溢出。6.1 经典示例计算阶乘deffactorial(n):ifn1:return1returnn*factorial(n-1)print(factorial(5))# 输出 1206.2 斐波那契数列deffibonacci(n):ifn1:returnnreturnfibonacci(n-1)fibonacci(n-2)foriinrange(10):print(fibonacci(i),end )# 输出 0 1 1 2 3 5 8 13 21 34提示递归代码简洁但效率可能较低对于大规模计算建议使用循环或动态规划。7. 装饰器装饰器是 Python 中一种强大的语法特性用于在不修改原函数代码的情况下为函数增加额外功能。7.1 基本装饰器defmy_decorator(func):defwrapper():print(函数执行前...)func()print(函数执行后...)returnwrappermy_decoratordefsay_hello():print(Hello!)say_hello()运行结果函数执行前... Hello! 函数执行后...7.2 带参数的装饰器defrepeat(times):defdecorator(func):defwrapper(*args,**kwargs):for_inrange(times):func(*args,**kwargs)returnwrapperreturndecoratorrepeat(3)defgreet(name):print(fHello,{name}!)greet(Alice)运行结果Hello, Alice! Hello, Alice! Hello, Alice!7.3 实用示例计算函数执行时间importtimedeftimer(func):defwrapper(*args,**kwargs):starttime.time()resultfunc(*args,**kwargs)endtime.time()print(f{func.__name__}执行耗时{end-start:.4f}秒)returnresultreturnwrappertimerdefslow_function():time.sleep(1)return完成print(slow_function())8. 常用内置函数Python 提供了大量实用的内置函数以下是一些高频使用的函数作用示例len()获取长度len(hello)→ 5type()获取类型type(123)→class intrange()生成整数序列list(range(5))→[0, 1, 2, 3, 4]enumerate()同时获取索引和值list(enumerate([a, b]))→[(0, a), (1, b)]zip()合并多个序列list(zip([1, 2], [a, b]))→[(1, a), (2, b)]sorted()排序sorted([3, 1, 2])→[1, 2, 3]sum()求和sum([1, 2, 3])→ 6max()/min()最大值 / 最小值max([1, 5, 3])→ 5map()对序列应用函数list(map(str, [1, 2]))→[1, 2]filter()过滤序列list(filter(lambda x: x 2, [1, 3, 2]))→[3]9. 实战案例学生成绩管理系统综合运用所学知识实现一个简单的学生成绩管理函数集# 学生成绩管理系统students{}defadd_student(name,score):添加学生成绩students[name]scoreprint(f已添加学生{name}成绩{score})defget_score(name):查询学生成绩ifnameinstudents:returnstudents[name]returnNonedefget_average():计算平均分ifnotstudents:return0returnsum(students.values())/len(students)defget_top_student():获取最高分学生ifnotstudents:returnNonetop_namemax(students,keystudents.get)returntop_name,students[top_name]defshow_all():显示所有学生成绩ifnotstudents:print(暂无学生数据)returnforname,scoreinsorted(students.items(),keylambdax:x[1],reverseTrue):print(f{name}:{score})# 测试add_student(Alice,92)add_student(Bob,85)add_student(Charlie,78)print(f平均分{get_average():.2f})print(f最高分学生{get_top_student()})show_all()运行结果已添加学生Alice成绩92 已添加学生Bob成绩85 已添加学生Charlie成绩78 平均分85.00 最高分学生(Alice, 92) Alice: 92 Bob: 85 Charlie: 7810. 常见错误与最佳实践10.1 常见错误错误类型示例说明未定义就调用my_func()但未定义函数必须先定义后调用参数数量不匹配定义 2 个参数调用时传 3 个位置参数数量必须一致忘记return函数内计算但未返回函数默认返回None修改全局变量未声明函数内直接counter 1需使用global声明默认参数使用可变对象def f(lst[])默认参数在定义时创建多次调用会共享10.2 最佳实践函数命名使用小写字母和下划线如calculate_average。单一职责一个函数只做一件事。添加文档字符串用三引号说明函数功能、参数和返回值。控制函数长度过长的函数应拆分为多个小函数。避免使用全局变量尽量通过参数传递数据。使用类型注解Python 3.5defadd(a:int,b:int)-int:返回两个整数的和returnab11. 总结本文从函数的基本概念出发系统讲解了 Python 函数的定义与调用、参数传递、返回值、作用域、Lambda 表达式、递归、装饰器以及常用内置函数并通过实战案例演示了函数的综合应用。掌握函数是学好 Python 的关键一步。建议读者动手实践每个示例并尝试将日常任务封装为函数逐步提升代码的组织能力和复用水平。