Python函数定义、参数传递与变量作用域详解

Luna
Luna
发布时间:2026-10-13 | 3人浏览过
原创

本文深入解析Python函数的定义方法、默认参数的使用技巧,以及按位置和名称传值的区别。重点讲解局部变量与全局变量的作用域规则,通过代码示例说明为何直接修改全局整数或字符串会引发UnboundLocalError,并指出列表等可变对象在函数内的修改行为,帮助开发者避免常见的作用域陷阱。

本文详细介绍Python中函数的定义机制及其变量作用域规则,旨在帮助读者深入理解函数编程的核心概念。

Python函数的定义与参数传递

定义函数

在定义函数时,可以为参数设置默认值。这样在调用函数时,如果未指定该参数,系统将自动使用默认值,从而提高函数的灵活性和易用性。


# 如果调用 cylinder_volume 函数时,不提供radius参数,那么radius的值为5
def cylinder_volume(height, radius=5):
  pi = 3.14159
  return height * pi * radius ** 2

向函数传递参数主要有两种方式:按位置传参和按名称传参。


cylinder_volume(10, 7) # 1539.3791
cylinder_volume(height=10, radius=7) # 1539.3791
cylinder_volume(radius=7, height=10) # 1539.3791

需要注意的是,第一种方式是常用的按位置传参,而第二种和第三种方式则是按名称传参,这两种方式在参数顺序上更为灵活。

定义函数[相关练习]

编写一个名为 population_density 的函数,该函数接收两个参数:population(人口数量)和 land_area(土地面积),并返回计算得出的人口密度值。

解决方案:


def population_density(population, land_area):
  return population / land_area
test1 = population_density(10, 1)
expected_result1 = 10
print("expected result: {}, actual result: {}".format(expected_result1, test1)) # expected result: 10, actual result: 10.0
test2 = population_density(864816, 121.4)
expected_result2 = 7123.6902801
print("expected result: {}, actual result: {}".format(expected_result2, test2)) # expected result: 7123.6902801, actual result: 7123.690280065897

编写一个名为 readable_timedelta 的函数,该函数接收一个整数参数 days,并返回一个描述该天数由多少周和多少天组成的字符串。例如,调用 readable_timedelta(10) 应返回“1 week(s) and 3 day(s).”。

解决方案:


def readable_timedelta(days):
  weeks = int(days / 7)
  day = days % 7
  return str(weeks) + ' week(s) and ' + str(day) + ' day(s).'
print(readable_timedelta(10)) # 1 week(s) and 3 day(s).

变量作用域与局部全局变量规则

函数中的变量作用域

  • 变量作用域决定了程序中哪些部分可以引用或使用该变量。
  • 在函数内部使用变量时,必须考虑其作用域。如果变量是在函数内部创建的,它仅能在该函数内部使用,无法从函数外部直接访问。

错误的示例:


# This will result in an error
def some_function():
  word = "hello"
print(word)

这意味着你可以为在不同函数内使用的不同变量使用相同的名称,正确的示例如下:


def some_function():
  word = "hello"
def another_function():
  word = "goodbye"

在函数外部定义的变量(全局变量)依然可以在函数内部被访问和读取。


word = "hello"
def some_function():
  print(word)
print(word)

最佳实践:建议将变量定义在所需的最小作用域内。虽然函数可以引用更大作用域内定义的变量,但通常不建议这样做,因为如果程序中变量众多,可能会导致变量命名冲突或逻辑混乱。

注意:Python 不允许函数直接修改不在其作用域内的变量(如全局整数或字符串)。执行下列代码,观察会发生什么。


egg_count = 0
def buy_eggs():
  egg_count += 12 # purchase a dozen eggs
buy_eggs()

此时会发生错误,导致 UnboundLocalError。当我们尝试在函数内更改或重新赋值一个函数外的变量(如整数或字符串)时,将遇到此错误。但是,这一原则仅适用于不可变类型(如整数和字符串);对于列表、字典、集合或类实例等可变对象,可以在子程序(子函数)中通过修改局部变量来间接修改全局变量的内容。

关于Python相关内容感兴趣的读者可查看本站专题:《Python函数使用技巧总结》、《Python面向对象程序设计入门与进阶教程》、《Python数据结构与算法教程》、《Python字符串操作技巧汇总》、《Python编码操作技巧总结》及《Python入门与进阶经典教程》

希望本文所述对大家Python程序设计有所帮助。

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表