人人都会AI编程

9.1 函数基础:定义、参数、返回值、作用域

更新时间:2026-07-12

函数是组织代码的基本单元。把一段逻辑封装成函数,有三个直接好处:避免重复代码让程序结构更清晰方便测试和复用。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 作为默认值,函数内部再初始化。
  • 尽量减少全局变量的使用,用参数和返回值来传递信息,会让代码更安全、更容易测试。