【Python学习】函数

张开发
2026/4/17 4:40:48 15 分钟阅读

分享文章

【Python学习】函数
目录一、函数的核心概念二、函数的基本语法自定义函数2.1 函数的定义格式2.2 最简单的函数示例无参数、无返回值2.3 带参数、有返回值的函数示例三、函数的参数详解重点3.1 位置参数必选参数3.2 关键字参数3.3 默认参数可选参数3.4 可变参数不定长参数3.4.1 *args接收位置可变参数3.4.2 **kwargs接收关键字可变参数3.4.3 可变参数的混合使用四、函数的返回值return4.1 返回值的基本使用4.2 返回多个值4.3 无返回值的情况五、函数的调用与嵌套5.1 函数的调用时机5.2 函数的嵌套调用5.3 函数的嵌套定义六、函数的进阶知识点6.1 匿名函数lambda函数6.2 函数的作用域6.3 递归函数6.4 常用内置函数七、函数的实战案例案例1封装函数判断一个数是否为质数案例2封装函数实现学生成绩统计计算平均分、最高分、最低分八、常见错误与注意事项九、总结一、函数的核心概念函数是Python中组织代码的核心方式本质是一段可重复调用、功能独立的代码块用于实现特定的逻辑或功能。使用函数可以减少代码冗余、提高代码可读性和可维护性同时实现代码的模块化拆分——将复杂任务拆解为多个简单的函数逐一实现降低开发难度。类比生活场景函数就像一台“加工机器”我们输入“原材料”参数机器执行固定的加工逻辑函数体最终输出“成品”返回值。例如计算两个数的和我们可以将“求和逻辑”封装成函数每次需要求和时直接调用该函数即可无需重复编写求和代码。Python中的函数分为两类内置函数Python自带可直接调用如print()、len()和自定义函数开发者根据需求自己编写的函数本教程重点讲解自定义函数的编写与使用。二、函数的基本语法自定义函数2.1 函数的定义格式Python中使用def关键字定义函数基本语法如下def 函数名(参数列表): 函数文档字符串可选用于说明函数功能、参数、返回值 # 函数体实现具体功能的代码缩进4个空格Python语法要求 代码语句 return 返回值可选各部分说明def定义函数的关键字必须放在函数名前面后面加空格。函数名遵循Python命名规范由字母、数字、下划线组成不能以数字开头不能使用Python关键字如if、for、def等建议命名简洁明了体现函数功能如sum_num、calculate_area。参数列表括号内的内容用于接收外部传入的数据可空无参数函数也可包含一个或多个参数多个参数用逗号分隔。函数文档字符串用三引号单引号、双引号均可包裹用于说明函数的功能、参数含义、返回值类型等可通过help(函数名)查看提升代码可读性非必需但强烈推荐。函数体函数的核心逻辑所有代码必须缩进默认4个空格缩进不一致会导致语法错误。return用于返回函数的执行结果返回值可省略省略时函数默认返回Nonereturn后面的代码不会执行即return是函数的“终止符”。2.2 最简单的函数示例无参数、无返回值需求定义一个函数打印“Hello, Python函数”# 定义无参数、无返回值的函数 def print_hello(): 打印问候语 print(Hello, Python函数) # 调用函数函数名 括号无参数则括号内空 print_hello() # 运行结果Hello, Python函数说明调用函数时必须写括号即使无参数否则不会执行函数只会打印函数对象的信息如function print_hello at 0x0000023F78E8A670。2.3 带参数、有返回值的函数示例需求定义一个函数接收两个整数参数返回它们的和。# 定义带参数、有返回值的函数 def sum_num(a, b): 计算两个整数的和 参数 a: 第一个整数 b: 第二个整数 返回值 两个整数的和int类型 result a b # 函数体计算和 return result # 返回计算结果 # 调用函数传入参数接收返回值 num1 10 num2 20 total sum_num(num1, num2) # 将函数返回值赋值给变量total print(f{num1} {num2} {total}) # 运行结果10 20 30说明调用函数时传入的参数数量、类型需与函数定义的参数列表匹配否则会报错返回值可直接使用或赋值给变量。三、函数的参数详解重点函数的参数是函数与外部交互的接口根据传入方式和作用可分为4种类型优先级位置参数 关键字参数 默认参数 可变参数。3.1 位置参数必选参数最基础的参数类型必须按照函数定义的顺序传入参数数量不能多也不能少否则会报错。# 定义位置参数函数计算长方形面积长、宽为必选参数 def calculate_area(length, width): 计算长方形面积 参数 length: 长方形的长int/float width: 长方形的宽int/float 返回值 长方形面积int/float return length * width # 正确调用按顺序传入长、宽 area1 calculate_area(5, 3) print(长方形面积1, area1) # 结果15 # 错误调用1参数数量不足少传1个 # area2 calculate_area(5) # 报错missing 1 required positional argument: width # 错误调用2参数顺序错误长和宽颠倒结果错误但不报错 area3 calculate_area(3, 5) print(长方形面积3, area3) # 结果15巧合正确实际逻辑错误注意位置参数的顺序至关重要传入时需严格匹配函数定义的参数顺序。3.2 关键字参数调用函数时通过“参数名值”的方式传入参数无需遵循位置顺序可提高代码可读性尤其适合参数较多的场景。# 复用上面的calculate_area函数 # 关键字参数调用不按顺序指定参数名 area4 calculate_area(width3, length5) print(长方形面积4, area4) # 结果15正确 # 混合调用位置参数在前关键字参数在后必须遵循此顺序 area5 calculate_area(5, width3) print(长方形面积5, area5) # 结果15正确 # 错误调用关键字参数在前位置参数在后 # area6 calculate_area(width3, 5) # 报错positional argument follows keyword argument规则关键字参数不能在位置参数前面否则Python无法识别参数对应的位置。3.3 默认参数可选参数定义函数时给参数指定一个默认值调用函数时若不传入该参数则使用默认值若传入则覆盖默认值。默认参数必须放在位置参数后面否则报错。# 定义带默认参数的函数计算长方形面积默认宽为2 def calculate_area(length, width2): 计算长方形面积默认宽为2 return length * width # 调用1不传入width使用默认值2 area7 calculate_area(5) print(长方形面积7, area7) # 结果5*210 # 调用2传入width覆盖默认值 area8 calculate_area(5, width4) print(长方形面积8, area8) # 结果5*420 # 错误定义默认参数放在位置参数前面 # def calculate_area(width2, length): # 报错non-default argument follows default argument注意默认参数的值只在函数定义时初始化一次若默认值是可变对象如列表、字典多次调用函数可能会出现意外结果后续进阶部分讲解。3.4 可变参数不定长参数当不确定传入的参数数量时使用可变参数分为两种*args接收任意数量的位置参数和**kwargs接收任意数量的关键字参数。3.4.1 *args接收位置可变参数*args会将传入的多个位置参数打包成一个元组函数内部可通过遍历元组获取每个参数的值。# 定义可变参数函数计算任意多个数的和 def sum_all(*args): 计算任意多个数的和args是元组类型 total 0 for num in args: total num return total # 调用传入任意数量的位置参数 print(sum_all(1, 2)) # 结果3 print(sum_all(1, 2, 3, 4)) # 结果10 print(sum_all()) # 结果0传入0个参数args为空元组 print(sum_all(5, 6, 7, 8, 9)) # 结果353.4.2 **kwargs接收关键字可变参数**kwargs会将传入的多个关键字参数打包成一个字典键是参数名值是参数值函数内部可通过字典操作获取参数。# 定义可变参数函数打印用户信息姓名、年龄、性别等数量不确定 def print_user_info(**kwargs): 打印用户信息kwargs是字典类型 for key, value in kwargs.items(): print(f{key}{value}) # 调用传入任意数量的关键字参数 print_user_info(name张三, age20, gender男) # 运行结果 # name张三 # age20 # gender男 print_user_info(name李四, city北京) # 运行结果 # name李四 # city北京3.4.3 可变参数的混合使用当函数同时包含位置参数、默认参数、*args、**kwargs时必须遵循以下顺序位置参数 默认参数 *args **kwargs。# 混合参数示例 def mix_params(a, b, c0, *args, **kwargs): 混合参数演示 print(位置参数a, a) print(位置参数b, b) print(默认参数c, c) print(可变位置参数args, args) print(可变关键字参数kwargs, kwargs) # 调用 mix_params(1, 2, 3, 4, 5, name张三, age20) # 运行结果 # 位置参数a 1 # 位置参数b 2 # 默认参数c 3 # 可变位置参数args (4, 5) # 可变关键字参数kwargs {name: 张三, age: 20}四、函数的返回值return4.1 返回值的基本使用return用于将函数的执行结果返回给调用者函数执行到return语句后会立即终止后续代码不会执行。def test_return(): print(执行return前的代码) return 我是返回值 # 执行到return函数终止 print(执行return后的代码) # 不会执行 result test_return() print(result) # 输出我是返回值4.2 返回多个值Python函数可以通过return返回多个值多个值用逗号分隔本质是返回一个元组可省略括号调用时可通过多个变量接收。# 返回多个值计算两个数的和与差 def sum_and_sub(a, b): sum_result a b sub_result a - b return sum_result, sub_result # 等价于 return (sum_result, sub_result) # 接收多个返回值 sum_val, sub_val sum_and_sub(10, 3) print(和, sum_val) # 输出13 print(差, sub_val) # 输出7 # 也可以用一个变量接收得到元组 result sum_and_sub(10, 3) print(result) # 输出(13, 7)4.3 无返回值的情况若函数没有return语句或return后面没有任何内容函数默认返回NoneNone是Python中的空值表示“没有值”。def no_return(): print(没有return语句) def return_none(): print(return后面没有内容) return result1 no_return() result2 return_none() print(result1) # 输出None print(result2) # 输出None五、函数的调用与嵌套5.1 函数的调用时机函数必须先定义后调用顺序不能颠倒否则会报错函数可以在其他函数内部调用也可以多次调用。# 错误先调用后定义 # test() # 报错name test is not defined # 正确先定义后调用 def test(): print(函数被调用了) # 多次调用 test() # 输出函数被调用了 test() # 输出函数被调用了5.2 函数的嵌套调用函数内部可以调用另一个函数称为嵌套调用嵌套的层数没有限制但不建议嵌套过深否则代码可读性差。# 定义函数A def func_a(): print(进入func_a) # 定义函数B内部调用func_a def func_b(): print(进入func_b) func_a() # 嵌套调用func_a print(离开func_b) # 调用func_b func_b() # 运行结果 # 进入func_b # 进入func_a # 离开func_b示例嵌套调用实现复杂逻辑——计算三个数的平均值先求和再求平均# 定义求和函数 def sum_three(a, b, c): return a b c # 定义求平均值函数嵌套调用sum_three def average_three(a, b, c): total sum_three(a, b, c) # 嵌套调用 return total / 3 # 调用 avg average_three(10, 20, 30) print(平均值, avg) # 输出20.05.3 函数的嵌套定义函数内部可以定义另一个函数内部函数内部函数只能在外部函数内部调用外部无法直接调用。# 定义外部函数 def outer_func(): print(进入外部函数) # 定义内部函数嵌套定义 def inner_func(): print(进入内部函数) # 内部函数只能在外部函数内部调用 inner_func() print(离开外部函数) # 调用外部函数 outer_func() # 运行结果 # 进入外部函数 # 进入内部函数 # 离开外部函数 # 错误外部直接调用内部函数 # inner_func() # 报错name inner_func is not defined六、函数的进阶知识点6.1 匿名函数lambda函数匿名函数是一种简化的函数没有函数名仅适用于实现简单的逻辑一行代码可完成语法lambda 参数列表: 表达式。特点匿名函数只能有一个表达式表达式的结果就是函数的返回值无需写return不能包含复杂的代码块如循环、条件判断的多行逻辑。# 用lambda定义匿名函数计算两个数的和 sum_lambda lambda a, b: a b # 等价于def sum_lambda(a,b): return ab # 调用匿名函数 print(sum_lambda(3, 5)) # 输出8 # 匿名函数常用于临时使用如作为sorted()、map()等函数的参数 # 示例对列表中的元组按元组的第二个元素排序 list1 [(1, 3), (4, 1), (2, 5)] # sorted()的key参数接收一个函数用lambda简化 sorted_list sorted(list1, keylambda x: x[1]) print(sorted_list) # 输出[(4, 1), (1, 3), (2, 5)]6.2 函数的作用域作用域指变量的可访问范围Python中变量的作用域分为4种从内到外依次是局部作用域L函数内部定义的变量仅在函数内部可访问函数执行结束后局部变量会被销毁。嵌套作用域E嵌套函数中内部函数可访问外部函数定义的变量非全局变量。全局作用域G函数外部定义的变量可在整个模块当前Python文件中访问。内置作用域BPython自带的变量和函数如print、len、int可在任何地方访问。规则就近原则——变量访问时优先在当前作用域查找找不到再向上一级作用域查找直到内置作用域若都找不到则报错。# 全局变量 global_var 我是全局变量 def outer(): # 嵌套作用域变量 outer_var 我是外部函数变量 def inner(): # 局部变量 inner_var 我是内部函数变量 # 访问变量就近原则 print(inner_var) # 访问局部变量 print(outer_var) # 访问嵌套作用域变量 print(global_var) # 访问全局变量 inner() # 调用外部函数 outer() # 错误外部无法访问局部变量 # print(inner_var) # 报错name inner_var is not defined补充使用global关键字可在函数内部修改全局变量使用nonlocal关键字可在内部函数中修改外部函数的变量。6.3 递归函数递归函数指函数自己调用自己用于解决可拆解为“相同子问题”的复杂问题如阶乘、斐波那契数列。递归的两个核心条件基线条件终止条件当满足该条件时函数停止递归否则会陷入无限递归导致栈溢出。递归条件函数调用自己且每次调用时问题规模缩小向基线条件靠近。# 示例1递归计算n的阶乘n! n × (n-1) × ... × 10! 1 def factorial(n): # 基线条件n0或n1时阶乘为1 if n 0 or n 1: return 1 # 递归条件n! n × (n-1)! return n * factorial(n-1) # 调用 print(factorial(5)) # 输出1205×4×3×2×1 print(factorial(0)) # 输出1 # 示例2递归计算斐波那契数列第n项 第n-1项 第n-2项前两项为1 def fibonacci(n): # 基线条件n1或n2时值为1 if n 1 or n 2: return 1 # 递归条件 return fibonacci(n-1) fibonacci(n-2) # 调用计算第10项斐波那契数 print(fibonacci(10)) # 输出55注意递归函数的效率较低多次重复调用且递归深度有限Python默认递归深度约1000层超过会报错复杂场景可改用循环实现。6.4 常用内置函数Python自带大量内置函数可直接调用无需定义常用的有函数名功能示例print()打印内容print(Hello) → Hellolen()获取对象长度字符串、列表等len([1,2,3]) → 3max()获取序列中的最大值max([1,5,3]) → 5min()获取序列中的最小值min([1,5,3]) → 1sum()计算序列中元素的和sum([1,2,3]) → 6int()将其他类型转换为整数int(123) → 123str()将其他类型转换为字符串str(123) → 123sorted()对序列进行排序返回新列表sorted([3,1,2]) → [1,2,3]七、函数的实战案例案例1封装函数判断一个数是否为质数def is_prime(num): 判断一个正整数是否为质数 参数 num: 正整数 返回值 True是质数False不是质数 # 边界条件小于2的数不是质数 if num 2: return False # 遍历2到num的平方根判断是否能整除 for i in range(2, int(num**0.5) 1): if num % i 0: return False return True # 调用函数判断多个数 nums [7, 12, 17, 20, 23] for n in nums: print(f{n}是{质数 if is_prime(n) else 非质数}) # 运行结果 # 7是质数 # 12是非质数 # 17是质数 # 20是非质数 # 23是质数案例2封装函数实现学生成绩统计计算平均分、最高分、最低分def score_statistics(scores): 统计学生成绩 参数 scores: 包含学生成绩的列表int/float 返回值 平均分、最高分、最低分元组 # 边界条件列表为空时返回None if not scores: return None, None, None average sum(scores) / len(scores) max_score max(scores) min_score min(scores) return round(average, 2), max_score, min_score # round保留2位小数 # 调用函数 student_scores [85, 92, 78, 90, 88, 95] avg, max_s, min_s score_statistics(student_scores) print(f成绩统计结果) print(f平均分{avg}) print(f最高分{max_s}) print(f最低分{min_s}) # 运行结果 # 成绩统计结果 # 平均分88.0 # 最高分95 # 最低分78八、常见错误与注意事项缩进错误函数体必须缩进默认4个空格缩进不一致会导致语法错误这是初学者最常见的错误。参数不匹配调用函数时传入的参数数量、类型与函数定义不匹配会报错如少传、多传参数传入字符串却需要整数。变量作用域错误试图在函数外部访问局部变量或在内部函数中修改外部变量未使用nonlocal/global关键字。无限递归递归函数未设置正确的基线条件导致函数无限调用自己最终引发栈溢出错误RecursionError。默认参数使用可变对象默认参数若为列表、字典等可变对象多次调用函数会导致默认值被修改建议用None作为默认值在函数内部初始化可变对象。九、总结函数是Python模块化编程的核心掌握函数的定义、参数、返回值是基础进阶部分的匿名函数、递归、作用域等知识点能帮助你编写更简洁、高效的代码。学习函数的关键是多练习——先模仿示例编写简单函数再尝试封装复杂逻辑逐步掌握函数的灵活运用。后续可结合Python的模块、类等知识点进一步提升代码的组织性和复用性为编写大型程序打下基础。

更多文章