函数
函数是把一段代码打包成一个可复用的单元。写好之后,只要调用函数名就能执行那段代码,还能传入不同的参数得到不同的结果。
定义函数
用 def 关键字定义:
def greet():
"""输出问候语"""
print("Hello, AITC!")
greet()
函数名后面的括号里可以写参数:
def greet(name):
"""根据名字输出问候语"""
print(f"你好,{name}!")
greet("Alice")
# 你好,Alice!
参数
位置参数
按顺序传参:
def describe_member(name, role):
print(f"{name} 是 {role} 组的成员")
describe_member("Alice", "算法")
# Alice 是 算法 组的成员
顺序不能乱,否则意思就变了:
describe_member("算法", "Alice") # 算法 是 Alice 组的成员 ❌
关键字参数
显式指定参数名,顺序无所谓:
describe_member(role="前端", name="Bob")
# Bob 是 前端 组的成员
默认值
给参数设置默认值,调用时可以省略:
def describe_member(name, role="未分配"):
print(f"{name} 是 {role} 组的成员")
describe_member("Alice") # Alice 是 未分配 组的成员
describe_member("Bob", "后端") # Bob 是 后端 组的成员
注意: 有默认值的参数要放在没默认值参数的后面。
返回值
函数可以用 return 把结果传回去:
def add(a, b):
return a + b
result = add(3, 5)
print(result) # 8
返回多个值(实际是返回元组):
def get_stats(scores):
return min(scores), max(scores), sum(scores) / len(scores)
low, high, avg = get_stats([78, 85, 92, 67])
print(f"最低: {low}, 最高: {high}, 平均: {avg:.1f}")
传递列表
把列表传给函数,函数内部修改会影响原列表:
def add_skill(skills, new_skill):
skills.append(new_skill)
my_skills = ["Python", "Rust"]
add_skill(my_skills, "Go")
print(my_skills) # ['Python', 'Rust', 'Go']
如果不想修改原列表,可以传一份副本:
add_skill(my_skills[:], "C++") # 传入副本
print(my_skills) # 原列表没变
传递任意数量的参数
任意数量的位置参数
用 *args 接收任意多个参数:
def show_skills(name, *skills):
print(f"{name} 会的技术:")
for skill in skills:
print(f" - {skill}")
show_skills("Alice", "Python", "PyTorch", "Docker")
任意数量的关键字参数
用 **kwargs 接收任意多个关键字参数:
def build_profile(name, **info):
profile = {"name": name}
profile.update(info)
return profile
user = build_profile("Alice", major="CS", year=3)
print(user)
# {'name': 'Alice', 'major': 'CS', 'year': 3}
把函数存进模块
把函数写在单独的 .py 文件里,需要时导入:
# utils.py
def greet(name):
print(f"你好,{name}")
def add(a, b):
return a + b
# main.py
from utils import greet, add
greet("Alice")
print(add(2, 3))
也可以导入整个模块:
import utils
utils.greet("Bob")
或者给模块起别名:
import utils as u
u.greet("Carol")
函数编写规范
- 函数名用小写+下划线:
calculate_score而不是calculateScore - 每个函数配一个文档字符串(docstring),说明它做什么
- 函数功能尽量单一,一个函数只做一件事
- 参数不要太多,超过 3 个可以考虑用字典封装