一、Python函数核心意义:为什么要学函数基础?
Python函数是代码复用、逻辑封装的核心载体,也是新手从「线性代码编写」过渡到「模块化编程」的关键。无论是自动化脚本、数据分析还是Web开发,函数都能让代码更简洁、易维护——比如重复执行10次的数据分析逻辑,封装成函数后只需调用1行代码,而非复制粘贴10遍。
二、函数基础:定义与调用的3步核心操作
1. 函数定义:最基础的语法结构
Python函数通过def关键字定义,核心结构包含「函数名、参数、函数体、返回值」4个部分,零基础也能快速上手:
# 基础格式:def 函数名(参数): 函数体; return 返回值
def calculate_sum(a, b):"""计算两个数的和(函数文档字符串,可选但推荐)"""result = a + breturn result # 返回计算结果
关键说明:
def:固定关键字,必须以冒号:结尾;- 函数名:遵循小写+下划线命名规则(如
calculate_sum),避免与Python内置函数重名(如sum、len); - 参数:括号内的变量(如
a、b),是函数接收的输入; - 函数体:缩进(4个空格)的代码块,是函数的核心逻辑;
return:可选,用于返回结果,无return则默认返回None。
2. 函数调用:让函数「跑起来」
定义函数后需调用才能执行,调用格式为「函数名(参数值)」,示例如下:
# 调用上面定义的calculate_sum函数
total = calculate_sum(3, 5)
print(total) # 输出:8# 无返回值函数的调用
def print_hello():print("Hello Python函数!")print_hello() # 输出:Hello Python函数!
新手避坑:调用函数时参数数量必须与定义匹配(如定义2个参数却传1个,会报TypeError)。
3. 函数文档字符串:提升代码可读性
在函数开头用三引号""" """编写说明,既是注释也是「函数说明书」,通过help()可查看:
# 查看函数文档
help(calculate_sum)
# 输出:
# Help on function calculate_sum in module __main__:
# calculate_sum(a, b)
# 计算两个数的和(函数文档字符串,可选但推荐)
三、参数传递:必选/默认/可变参数全解析
参数是函数的「输入接口」,新手需重点掌握3类常用参数,解决「传值不对」的核心问题。
1. 必选参数(位置参数)
最基础的参数类型,调用时必须按顺序传入,数量不能多也不能少:
# 定义必选参数函数
def get_info(name, age):print(f"姓名:{name},年龄:{age}")# 正确调用(按位置传参)
get_info("张三", 25) # 输出:姓名:张三,年龄:25# 错误调用(少传参数)
get_info("李四") # 报错:TypeError: get_info() missing 1 required positional argument: 'age'
2. 默认参数:给参数设「默认值」
调用时可省略的参数,适合「大部分场景固定值,少数场景需修改」的需求:
# 定义带默认参数的函数(默认城市为北京)
def get_user_info(name, age, city="北京"):print(f"姓名:{name},年龄:{age},城市:{city}")# 调用1:使用默认城市
get_user_info("王五", 30) # 输出:姓名:王五,年龄:30,城市:北京# 调用2:修改默认城市
get_user_info("赵六", 28, "上海") # 输出:姓名:赵六,年龄:28,城市:上海
注意:默认参数必须放在必选参数后面,否则会报语法错误。
3. 可变参数:接收任意数量的参数
当不确定参数数量时,用*args(接收任意数量位置参数)或**kwargs(接收任意数量关键字参数):
# 1. *args:接收多个位置参数(打包成元组)
def sum_many(*args):total = 0for num in args:total += numreturn totalprint(sum_many(1,2,3)) # 输出:6
print(sum_many(5,10,15,20)) # 输出:50# 2. **kwargs:接收多个关键字参数(打包成字典)
def print_info(**kwargs):for key, value in kwargs.items():print(f"{key}:{value}")print_info(name="孙七", age=35, job="工程师")
# 输出:
# name:孙七
# age:35
# job:工程师
四、返回值:函数的「输出结果」
return语句决定函数的输出,新手需掌握3个核心要点:
1. 单个返回值
def get_max_num(a, b):if a > b:return aelse:return bmax_num = get_max_num(9, 6)
print(max_num) # 输出:9
2. 多个返回值(实际返回元组)
def get_num_info(num):square = num * numcube = num * num * numreturn square, cube # 逗号分隔,返回元组s, c = get_num_info(3) # 解包接收
print(s, c) # 输出:9 27
3. 无返回值(默认返回None)
def print_warning():print("警告:参数格式错误!")result = print_warning()
print(result) # 输出:None
五、函数基础常见错误与解决
| 错误现象 | 根本原因 | 解决方法 |
|---|---|---|
TypeError: 'int' object is not callable |
函数名与变量名重名(如定义了sum=10,又调用sum()) | 修改变量名,避免与函数名/内置函数重名 |
IndentationError |
函数体未缩进或缩进不一致 | 统一用4个空格缩进,函数体必须在def下缩进 |
UnboundLocalError |
函数内修改全局变量未声明global |
修改全局变量前加global 变量名(如global count) |
| 参数传值顺序混乱 | 混合位置参数和关键字参数时顺序错 | 关键字参数必须放在位置参数后面(如func(1, 2, c=3)) |
六、函数基础实战案例:封装实用小功能
案例1:判断是否为闰年
def is_leap_year(year):"""判断年份是否为闰年"""if (year % 4 == 0 and year % 100 != 0) or (year % 400 == 0):return Trueelse:return Falseprint(is_leap_year(2024)) # 输出:True
print(is_leap_year(2025)) # 输出:False
案例2:计算列表平均值
def calculate_average(num_list):"""计算列表中数字的平均值"""if not num_list: # 处理空列表return 0total = sum(num_list)average = total / len(num_list)return round(average, 2) # 保留2位小数nums = [10, 20, 30, 40]
print(calculate_average(nums)) # 输出:25.0
print(calculate_average([])) # 输出:0