Python基础函数定义与调用代码写法
def 关键字定义函数并声明执行逻辑,以及如何在后续代码中通过函数名配合圆括号 () 完成调用与传参。本文将围绕函数声明的语法要素、参数传递机制、返回值控制及实际调用步骤展开完整讲解。
一、函数的基本定义与调用语法
Python 使用 def(define 的缩写)作为定义函数的起始关键字。紧随其后的是函数名称、存放形参列表的圆括号 (),以及标志代码块开始的英文冒号 :。函数体必须整体保持缩进(通常为4个空格)。
定义函数只是在内存中注册了该逻辑段落,它本身不会主动执行。要执行函数体中的代码,必须在代码中显式写出函数名并附加括号进行“调用”。
# 1. 最基础的无参函数定义
def say_hello():
print("你好,欢迎学习Python基础函数!")
# 2. 函数调用
say_hello()
# 示例输出:
# 你好,欢迎学习Python基础函数!
如果省略了调用时末尾的括号 (),Python 不会执行函数代码,而是直接将函数对象本身作为引用返回。这是初学者在编码时最常见的疏漏之一。
二、参数传递:形参、实参与传参模式
在函数定义的小括号中声明的变量被称为形式参数(形参);而在调用函数时传入的具体数值或对象称为实际参数(实参)。Python 提供了灵活的参数绑定方式,常用形式包括位置参数、关键字参数与默认参数。
1. 位置参数与关键字参数
位置参数要求实参按照形参声明的相对次序依次代入。而关键字参数则允许在调用时明确写出形参名(形如 param_name=value),此时参数的位置顺序可以颠倒。
def build_profile(name, role, city):
print(f"姓名: {name} | 岗位: {role} | 城市: {city}")
# 按照位置传递:必须严格按顺序
build_profile("李雷", "后端研发", "上海")
# 按照关键字传递:顺序自由,意图明确
build_profile(city="杭州", name="韩梅梅", role="数据分析")
2. 默认参数
如果在定义函数时某个形参经常拥有固定取值,可以在定义时直接为其赋初值。调用者若不传入该项实参,函数将自动使用预设的默认值;若传入实参,则默认值被覆盖。
语法规则约束:带有默认值的参数必须位于没有默认值的参数后面,否则 Python 解释器在语法解析阶段会直接抛出 SyntaxError: non-default argument follows default argument 异常。
# country 带有默认值,必须排在无默认值的 name 之后
def register_user(name, country="中国"):
print(f"用户: {name}, 国籍: {country}")
register_user("王小明") # 采用默认国籍: 中国
register_user("Alice", country="英国") # 覆写默认值: 英国
三、函数返回值:return 语句的工作原理
函数不仅接收输入,往往还需要产出运算结果。Python 通过 return 语句将数据从函数内部传递回调用点。
1. return 的终止与传递特性
一旦执行到 return,函数会立即停止后续所有代码的运行,并将紧随其后的表达式结果作为返回值交出。如果在函数中没有显式书写 return,或者单独写了不带任何表达式的 return,Python 会隐式返回内置对象 None。
def check_positive(number):
if number <= 0:
return "非正数" # 条件满足时立即退出函数
# 若上面已 return,下面代码绝不会执行
return "正数"
res1 = check_positive(-5)
res2 = check_positive(8)
print(res1, res2) # 输出: 非正数 正数
2. 返回多个值与解包语法
Python 允许在 return 后使用逗号分隔多个表达式。从底层实现来看,Python 实际上是将这些数据打包成了一个元组(tuple)返回。调用者既可以用一个变量接收整个元组,也可以使用多变量解包语法分别接收各个数据项。
def calculate_stat(numbers):
total = sum(numbers)
count = len(numbers)
avg = total / count
return total, avg # 返回一个由两个元素组成的元组
# 方式 A:单变量接收元组
summary = calculate_stat([10, 20, 30])
print(summary) # 输出: (60, 20.0)
# 方式 B:多变量直接解包(更推荐的清晰写法)
total_sum, average = calculate_stat([10, 20, 30])
print(f"总和: {total_sum}, 平均值: {average}") # 输出: 总和: 60, 平均值: 20.0
四、函数调用完整生命周期的执行流程
理解函数调用的底层跳转机制,有助于排查变量作用域问题与递归执行逻辑。当解释器运行至函数调用语句时,执行流程会经历以下五个确定性步骤:
五、编写与调用函数的常见注意点
1. 默认参数切勿使用可变对象(如列表、字典)
Python 函数的默认参数在函数定义时仅被求值一次,而不是每次调用时重新创建。如果默认参数使用列表([])或字典({}),多次调用并向其追加数据时,该默认对象会在所有调用之间共享,从而引发难以察觉的数据污染。
# 错误写法:可变对象作为默认参数
def append_wrong(item, target_list=[]):
target_list.append(item)
return target_list
print(append_wrong(1)) # 输出: [1]
print(append_wrong(2)) # 意外输出: [1, 2],而不是预期的 [2]!
# 正确做法:默认值设为 None,在函数体内部判定并新建对象
def append_correct(item, target_list=None):
if target_list is None:
target_list = []
target_list.append(item)
return target_list
print(append_correct(1)) # 输出: [1]
print(append_correct(2)) # 输出: [2],相互独立
2. 局部变量与全局变量的作用域边界
在函数内部直接定义的变量属于局部变量(Local Scope),仅在该函数执行期间可见,函数外部无法直接访问。如果需要在函数内部修改全局变量的值,必须使用 global 关键字显式声明;但在常规业务开发中,应尽量通过“传参输入 + return 输出”保持函数的无副作用特性(纯函数)。
六、全文核心知识速查与检查清单
在完成函数编写与调试时,可通过以下清单核对代码的规范性:
| 检查维度 | 标准写法要求 | 常见报错 / 违规症状 |
|---|---|---|
| 函数声明 | def 函数名(形参): 结尾带冒号,函数体统一缩进 |
SyntaxError: invalid syntax(常因漏写冒号引起) |
| 函数调用 | 使用 func() 附加圆括号触发执行 |
仅输出 <function func at 0x...>,无执行结果 |
| 参数声明顺序 | 无默认值参数在前,默认参数在后 | SyntaxError: non-default argument follows default argument |
| 传参数量 | 位置实参数量与必需形参数量严格相等 | TypeError: missing required positional argument |
| 返回值控制 | 需要传递结果时显式写 return |
变量接收到 None |
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









