Python 函数详解(Python 3.x)
函数是 Python 中组织代码的基本单元,用于封装可重用的逻辑。与 Java 的 “方法” 类似,但 Python 函数更灵活,支持默认参数、关键字参数、可变参数等特性。本文将全面介绍 Python 函数的定义、参数类型、返回值及模块使用。
函数的基本定义与调用
使用 def 关键字定义函数,语法为:
def 函数名(参数列表):
函数体(缩进代码块)
[return 返回值]
无参数函数
不接收参数的函数,直接执行预设逻辑:
# 定义无参数函数
defsay_hello():
print("Hello, Python!")
# 调用函数(函数名后加括号)
say_hello() # 输出:Hello, Python!
带参数函数
接收输入参数,根据参数执行不同逻辑:
# 定义比较两个数的函数
defprint_max(a, b):
if a > b:
print(f"{a} 是最大值")
elif a == b:
print("两者相等")
else:
print(f"{b} 是最大值")
# 调用函数并传递参数
print_max(5, 7) # 输出:7 是最大值
print_max(3, 3) # 输出:两者相等
参数系统详解:5种参数类型
Python 的参数系统极其灵活,支持 5 种参数类型,可按任意组合使用。
1. 位置参数(Positional Arguments)
最基本的参数类型,调用时必须按定义顺序传递。
defintroduce(name, age, city):
print(f"{name}, {age}岁, 来自{city}")
# 必须按顺序传递
introduce("Alice", 20, "Beijing") # ✅
# introduce("Beijing", 20, "Alice") # ❌ 顺序错误,语义混乱
2. 默认值参数(Default Arguments)
为参数提供默认值,调用时可省略。
defgreet(name, greeting="Hello"):
print(f"{greeting}, {name}!")
greet("Alice") # Hello, Alice!
greet("Bob", "Hi") # Hi, Bob!
greet("Charlie", greeting="Hey") # 关键字参数方式
# ⚠️ 规则:默认值参数必须放在无默认值参数之后
# def func(a=1, b): # ❌ SyntaxError
# pass
3. 关键字参数(Keyword Arguments)
调用时通过 参数名=值 的方式传递,无需遵循位置顺序。
defdescribe_person(name, age, city):
print(f"{name}, {age}岁, 来自{city}")
# 关键字参数(顺序任意)
describe_person(age=20, name="Alice", city="Beijing")
# 混合使用(位置参数必须在关键字参数之前)
describe_person("Bob", city="Shanghai", age=22) # ✅
# describe_person(city="Shanghai", "Bob", age=22) # ❌ 位置参数不能在关键字之后
4. 可变位置参数(*args)
接收任意数量的位置参数,打包为元组。
defsum_numbers(*args):
"""计算任意多个数的和"""
print(f"接收到的参数: {args}") # 元组
return sum(args)
print(sum_numbers(1, 2, 3)) # 6
print(sum_numbers(10, 20, 30, 40)) # 100
print(sum_numbers()) # 0(空元组)
# 实用示例:日志函数
deflog(level, *messages):
for msg in messages:
print(f"[{level}] {msg}")
log("INFO", "用户登录", "IP: 192.168.1.1")
# [INFO] 用户登录
# [INFO] IP: 192.168.1.1
5. 可变关键字参数(**kwargs)
接收任意数量的关键字参数,打包为字典。
defprint_user_info(**kwargs):
"""打印用户信息(参数数量不定)"""
for key, value in kwargs.items():
print(f"{key}: {value}")
print_user_info(name="Alice", age=20, city="Beijing", hobby="reading")
# name: Alice
# age: 20
# city: Beijing
# hobby: reading
# 常用于函数包装
defwrapper(func, **kwargs):
print(f"使用参数: {kwargs}")
return func(**kwargs)
参数组合顺序
deffunc(位置参数, 默认值参数=值, *args, 关键字-only参数, **kwargs):
pass
# 完整示例
defcomprehensive_example(a, b=10, *args, c=20, **kwargs):
print(f"a={a}, b={b}")
print(f"*args: {args}")
print(f"c={c}")
print(f"**kwargs: {kwargs}")
# 调用
comprehensive_example(1, 2, 3, 4, 5, c=30, d=40, e=50)
# a=1, b=2
# *args: (3, 4, 5)
# c=30
# **kwargs: {'d': 40, 'e': 50}
函数的返回值
使用 return 语句返回函数执行结果,若未指定 return,函数默认返回 None。
基本返回值
# 定义返回单个值的函数
defadd(a, b):
return a + b
result = add(3, 5)
print(result) # 输出:8
返回多个值
Python 函数可通过元组间接返回多个值(本质是返回一个元组,自动解包):
defget_user():
name = "Alice"
age = 20
city = "Beijing"
return name, age, city # 等价于 return (name, age, city)
# 自动解包为多个变量
user_name, user_age, user_city = get_user()
print(user_name, user_age, user_city) # 输出:Alice 20 Beijing
函数与模块(Module)
模块是包含函数和变量的 .py 文件,用于代码复用(类似 Java 的包)。
导入模块
假设存在 my_module.py 文件,内容如下:
# my_module.py
defgreet(name):
returnf"Hello, {name}!"
defadd(a, b):
return a + b
PI = 3.14159
可通过以下方式导入模块中的内容:
| | |
|---|
import 模块名 | | my_module.greet("Alice") |
from 模块名 import 成员 | | from my_module import greet; greet("Alice") |
import 模块名 as 别名 | | import my_module as mm; mm.add(1, 2) |
from 模块名 import * | | greet("Alice") |
示例:使用模块
# 导入整个模块并起别名
import my_module as mm
print(mm.greet("Bob")) # 输出:Hello, Bob!
print(mm.add(2, 3)) # 输出:5
print(mm.PI) # 输出:3.14159
# 导入指定成员
from my_module import greet, PI
print(greet("Charlie")) # 输出:Hello, Charlie!
print(PI) # 输出:3.14159
安装与使用第三方模块
Python 生态有大量第三方模块,可通过 pip 安装(Python 3 建议用 pip3):
# 安装 requests 模块(用于网络请求)
pip3 install requests
使用第三方模块:
import requests
response = requests.get("https://www.baidu.com")
print(response.status_code) # 输出:200(表示请求成功)
函数的作用域
变量的作用域指其可访问的范围,Python 函数有两种主要作用域:
# 全局变量
global_var = "我是全局变量"
defmy_func():
# 局部变量
local_var = "我是局部变量"
print(local_var)
print(global_var) # 可访问全局变量
my_func()
print(global_var)
# print(local_var) # 报错:局部变量在函数外不可访问
修改全局变量:需用 global 声明:
count = 0
defincrement():
global count # 声明使用全局变量 count
count += 1
increment()
print(count) # 输出:1