跳到主要内容

函数

函数是把一段代码打包成一个可复用的单元。写好之后,只要调用函数名就能执行那段代码,还能传入不同的参数得到不同的结果。

定义函数

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 个可以考虑用字典封装