大家好!欢迎来到 Python 基础语法第三课。今天我们重点攻克函数(Function)——它是 Python 编程的灵魂!学会函数,你就能把重复代码封装起来,让程序更简洁、更易维护、更优雅。
用一个生活比喻:
函数就像你家里的外卖小程序——你输入需求(参数),它帮你处理(函数体),最后送上美食(返回值)。用一次定义,随时随用!
1. 函数的基础:定义与调用
定义函数用关键字 def,后面跟函数名、小括号、冒号:
# 最简单的函数:什么都不干
def say_hello():
print("Hello, Python世界!")
# 调用函数(使用)
say_hello() # 输出:Hello, Python世界!
say_hello() # 可以调用无数次!
带参数的函数(传入数据)
def greet(name): # name 是参数(形参)
print(f"你好,{name}!欢迎学习Python~")
greet("小明") # 调用时传入实际值(实参) → 你好,小明!欢迎学习Python~
greet("小红") # 再次调用,传入不同值
多个参数
def introduce(name, age, city="北京"): # city 有默认值
print(f"我叫{name},今年{age}岁,来自{city}")
introduce("张三", 18) # → 我叫张三,今年18岁,来自北京(使用默认值)
introduce("李四", 20, "上海") # → 我叫李四,今年20岁,来自上海(覆盖默认值)
2. 参数类型详解(超级重要!)
Python 的参数超级灵活,一共五种常见用法:
| 类型 | 写法 | 说明 | 示例调用 |
|---|---|---|---|
| 位置参数 | def func(a, b) | 必须按顺序传入 | func(10, 20) |
| 关键字参数 | def func(a, b) | 调用时指定参数名,可乱序 | func(b=20, a=10) |
| 默认参数 | def func(a, b=100) | 有默认值,不传就用默认 | func(5) → b=100 |
| 可变位置参数 | def func(*args) | 接收任意个数位置参数,变成元组 | func(1,2,3,4,5) → args=(1,2,3,4,5) |
| 可变关键字参数 | def func(**kwargs) | 接收任意个数关键字参数,变成字典 | func(name=”王五”, age=22) → kwargs={‘name’:’王五’,’age’:22} |
实战组合使用(最常见写法):
def register(name, age, *hobbies, city="未知", **extra_info):
print(f"注册用户:{name},年龄:{age},城市:{city}")
if hobbies:
print("爱好:", hobbies)
if extra_info:
print("其他信息:", extra_info)
# 调用示例
register("小明", 18, "篮球", "编程", "吉他", city="广州", gender="男", score=95.5)
# 输出:
# 注册用户:小明,年龄:18,城市:广州
# 爱好: ('篮球', '编程', '吉他')
# 其他信息: {'gender': '男', 'score': 95.5}
参数顺序铁律(必须记住!):
def func(位置参数, *args, 默认参数, **kwargs):
顺序错了会报错!
3. 返回值(return)——函数的“外卖”
函数可以返回数据给调用者,用 return:
def add(a, b):
result = a + b
return result # 返回计算结果
sum_value = add(3, 7) # sum_value = 10
print(sum_value) # 10
返回多个值(其实是返回一个元组!)
def get_student_info():
return "赵六", 19, 98.5 # 实际上返回 ("赵六", 19, 98.5)
name, age, score = get_student_info() # 元组解包!超级好用
print(f"{name}今年{age}岁,成绩{score}分")
没有 return 或 return None:函数默认返回 None
def say_hi():
print("Hi~")
result = say_hi() # result = None
4. 作用域(Scope)——变量的“生存范围”
这是初学者最容易混淆的地方,用一个故事记住:
家里(全局)买了冰箱,客厅(函数内)也能用;
但你在客厅里买了个小冰箱(局部变量),出门就看不到了!
x = 100 # 全局变量,全程序都能访问
def test():
y = 200 # 局部变量,只在函数内有效
print("函数内x =", x) # 可以访问全局变量 → 100
print("函数内y =", y) # → 200
test()
print("函数外x =", x) # → 100
# print(y) # 报错!y 是局部变量,函数外访问不了
特殊情况:函数内修改全局变量
money = 1000
def spend(amount):
global money # 声明要修改全局变量
money -= amount
print(f"花了{amount}元,还剩{money}元")
spend(300) # 花了300元,还剩700元
print(money) # 700
非要修改外部变量?推荐用返回值方式(更安全)
def add_bonus(salary):
new_salary = salary + 1000
return new_salary # 不直接改外部,推荐!
my_salary = 5000
my_salary = add_bonus(my_salary)
print(my_salary) # 6000
5. 进阶小技巧
- 文档字符串(docstring)——给函数写说明
def multiply(a, b):
"""
计算两个数的乘积
参数:
a: 第一个数
b: 第二个数
返回值:
a 和 b 的乘积
"""
return a * b
print(multiply.__doc__) # 可以查看说明
- lambda 匿名函数——一行定义简单函数
# 普通函数
def square(x):
return x * x
# lambda 写法(等价)
square = lambda x: x * x
# 常配合 map、filter、sorted 使用
numbers = [1, 2, 3, 4, 5]
squares = list(map(lambda x: x**2, numbers)) # [1, 4, 9, 16, 25]
6. 总结对比表
| 概念 | 关键点 | 记忆口诀 |
|---|---|---|
| 定义函数 | def 函数名(参数): | def 开头,冒号别忘 |
| 参数 | 位置、关键字、默认、args、*kwargs | 顺序不能乱! |
| 返回值 | return 数据(可多个) | 不写 return 返回 None |
| 作用域 | 局部变量函数内有效,全局变量到处可用 | 客厅的东西出不了门 |
| global | 修改全局变量时声明 | 要改全局,先报备 |
结语
函数是 Python 最强大的工具之一!掌握了它,你就能:
- 消除重复代码
- 让程序结构清晰
- 轻松实现复杂逻辑
练习建议:
- 写一个计算圆面积的函数(参数:半径,返回:面积)
- 写一个支持任意数量数字求和的函数(用 *args)
- 写一个学生信息注册函数,接收姓名、年龄、选修课(可多门)和额外信息
下一课我们将学习 列表和元组——Python 的“善变女友”和“长情伴侣”,敬请期待!
加油!你离 Python 中级玩家只差一步了!🚀