函数是组织代码的基本单元。把一段逻辑封装成函数,有三个直接好处:避免重复代码、让程序结构更清晰、方便测试和复用。Python 的函数定义和使用都极其简单。
函数的定义
使用 def 关键字,后跟函数名、括号、冒号,函数体必须缩进。
def greet(name):
"""向指定的人打招呼(文档字符串)"""
print(f"你好,{name}!")
- 函数名:应使用小写字母和下划线,能清晰表达函数功能。
- 文档字符串:函数体第一行可以放一个多行字符串,用于说明函数用途。之后可以用
help(greet)或greet.doc查看。 - 缩进:Python 用缩进界定函数体的范围,通常用 4 个空格。缩进错误会直接导致
IndentationError。
参数传递
函数定义时的参数叫形参,调用时传入的叫实参。调用时必须提供所有必须的参数,否则会报错。
def add(a, b):
return a + b
result = add(3, 5) # 8
- 位置参数:按顺序匹配,
a得到 3,b得到 5。 - 关键字参数:调用时可以用名字指定,此时顺序无所谓:
add(b=5, a=3) # 同样返回 8
- 默认值参数:定义时给参数一个缺省值,调用时可以不传。
def power(base, exp=2):
return base ** exp
power(3) # 9,exp 默认是 2
power(3, 3) # 27
默认值参数要放在所有非默认参数之后,否则语法错误。
返回值
- 使用
return语句输出结果。一个函数可以有多个return,但执行到任何一个return函数就立即结束。 - 没有
return的函数,或只写了return而没有值,会隐式返回None。例如上面的greet函数实际上返回None。 - Python 可以“返回多个值”,其实是用逗号分隔,底层会打包成一个元组:
def min_max(numbers):
return min(numbers), max(numbers)
m, M = min_max([1, 2, 3]) # m=1, M=3,元组自动解包
作用域
变量在哪里定义,决定了它能被哪里访问。
- 局部变量:在函数内定义的变量,只在函数内部有效,函数执行结束后销毁。
def func():
x = 10 # 局部变量
print(x)
func()
print(x) # 报错 NameError: name 'x' is not defined
- 全局变量:在函数外、模块顶层定义的变量,所有函数都可以读取它。但如果要在函数内修改一个全局变量,必须用
global声明。
count = 0 # 全局变量
def increment():
global count # 告诉 Python:我要用那个全局的 count
count += 1
increment()
print(count) # 1
不写 global 就直接 count += 1 会报错 UnboundLocalError,因为 Python 会把它当成一个局部变量,但局部变量还没被赋值。
初学阶段需要记住的要点:
- 写函数时,先确定传入什么、返回什么,这就是函数的“契约”。
- 参数默认值只在定义时计算一次,所以绝对不要用可变对象(如空列表、空字典)作为默认值——这会导致多次调用共享同一个对象,出现难以排查的 bug。正确做法是用
None作为默认值,函数内部再初始化。 - 尽量减少全局变量的使用,用参数和返回值来传递信息,会让代码更安全、更容易测试。