专栏导读
  • 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题,解放您的双手
  • 🏳️‍🌈 个人博客主页:请点击——> 个人的博客主页 求收藏
  • 🏳️‍🌈 Github主页:请点击——> Github主页 求Star⭐
  • 🏳️‍🌈 知乎主页:请点击——> 知乎主页 求关注
  • 🏳️‍🌈 CSDN博客主页:请点击——> CSDN的博客主页 求关注
  • 👍 该系列文章专栏:请点击——>Python办公自动化专栏 求订阅
  • 🕷 此外还有爬虫专栏:请点击——>Python爬虫基础专栏 求订阅
  • 📕 此外还有python基础专栏:请点击——>Python基础学习专栏 求订阅
  • 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏
  • ❤️ 欢迎各位佬关注! ❤️

Python 函数参数全攻略:从入门到精通

在编程的世界里,函数(Function)就像是一个精密加工的工厂:你投入原材料(输入),经过内部的机器运转(处理),最后产出成品(输出)。

而在 Python 中,参数(Arguments/Parameters) 就是这些原材料。掌握了参数的使用,你就掌握了控制函数行为的钥匙,能够编写出更灵活、更强大且易于维护的代码。

本文将带你系统地拆解 Python 函数参数的奥秘,从最基础的用法到进阶技巧,助你彻底攻克这一知识点。


1. 前置知识 (Prerequisites)

在开始之前,请确保你已经具备以下基础:

  • 已安装 Python 环境(推荐 Python 3.6+)。
  • 了解如何定义一个最简单的函数(使用 def 关键字)。
  • 理解变量的基本赋值概念。

2. 核心概念:形参与实参

在深入具体用法前,我们需要厘清两个经常混用的术语:

  • 形参 (Parameters):在定义函数时括号内的变量名。它们是占位符。
  • 实参 (Arguments):在调用函数时实际传入的值。它们是真实的数据。
def greet(name):  # name 是形参
    print(f"Hello, {name}!")

greet("Alice")    # "Alice" 是实参

3. Python 参数详解 (Step-by-Step Guide)

Python 提供了多种传递参数的方式,使得函数调用极其灵活。我们将由浅入深一一讲解。

3.1 位置参数 (Positional Arguments)

这是最常见、最基础的参数形式。Python 按照参数在括号中出现的顺序,将实参一一对应赋值给形参。

规则:数量必须一致,顺序必须正确。

def describe_pet(animal_type, pet_name):
    """显示宠物的信息"""
    print(f"我有一只{animal_type}。")
    print(f"它的名字叫{pet_name}。")

# 正确调用:顺序对应
describe_pet('仓鼠', '哈利')
# 输出:
# 我有一只仓鼠。
# 它的名字叫哈利。

# 错误调用:顺序颠倒会导致逻辑错误
describe_pet('哈利', '仓鼠') 
# 输出: 我有一只哈利... (逻辑不通)

3.2 关键字参数 (Keyword Arguments)

为了避免记不住参数顺序带来的麻烦,我们可以使用“键=值”的格式直接指定参数。

规则:一旦指定了参数名,顺序就不重要了。

# 使用关键字参数调用,顺序可以打乱
describe_pet(pet_name='哈利', animal_type='仓鼠')

3.3 默认参数 (Default Arguments)

有些参数在大部分情况下都是同一个值。我们可以为这些参数设定一个默认值。如果调用时没有传入该参数,Python 就会使用默认值。

规则必选参数(无默认值)必须放在默认参数之前

def connect_database(host, port=3306):
    """模拟数据库连接"""
    print(f"正在连接到 {host}:{port} ...")

# 情况1:只传必选参数,使用默认端口
connect_database("192.168.1.1") 
# 输出: 正在连接到 192.168.1.1:3306 ...

# 情况2:传入新值,覆盖默认端口
connect_database("192.168.1.1", 5432)
# 输出: 正在连接到 192.168.1.1:5432 ...

3.4 可变参数 (Variable-length Arguments)

有时候,我们无法预知用户会传入多少个参数(例如:计算任意个数字的和)。Python 提供了两种强大的机制。

A. *args:接收任意数量的位置参数

Python 会将多余的位置参数打包成一个 元组 (Tuple)。通常命名为 args,但前面的星号 * 才是关键。

def make_pizza(size, *toppings):
    """概述要制作的比萨"""
    print(f"\n准备制作一个 {size} 寸的比萨,配料如下:")
    for topping in toppings:
        print(f"- {topping}")

# 可以传入任意数量的配料
make_pizza(12, '蘑菇', '青椒', '双倍芝士')
B. **kwargs:接收任意数量的关键字参数

Python 会将多余的关键字参数打包成一个 字典 (Dictionary)。通常命名为 kwargs,前面的双星号 ** 是关键。

def build_profile(first, last, **user_info):
    """创建一个字典,其中包含我们知道的有关用户的一切"""
    user_info['first_name'] = first
    user_info['last_name'] = last
    return user_info

user_profile = build_profile('Albert', 'Einstein',
                             location='Princeton',
                             field='Physics')

print(user_profile)
# 输出: {'location': 'Princeton', 'field': 'Physics', 'first_name': 'Albert', 'last_name': 'Einstein'}

4. 常见陷阱与最佳实践 (Common Pitfalls)

即使是经验丰富的开发者,有时也会在参数问题上栽跟头。以下是新手必须注意的“雷区”。

陷阱 1:使用可变对象作为默认参数 (最经典的坑)

永远不要使用列表、字典等可变对象作为默认参数值。

错误示范:

def add_item(item, list_param=[]):
    list_param.append(item)
    return list_param

print(add_item('A')) # 期望: ['A'] -> 实际: ['A']
print(add_item('B')) # 期望: ['B'] -> 实际: ['A', 'B']  <-- 竟然保留了上次的结果!

原因:Python 函数的默认参数在函数定义时只计算一次,而不是每次调用时重新计算。所有调用都共享同一个列表对象。

正确做法: 使用 None 作为默认值,在函数内部进行判断。

def add_item(item, list_param=None):
    if list_param is None:
        list_param = []
    list_param.append(item)
    return list_param

陷阱 2:参数定义的顺序

如果你在一个函数中混合使用了以上所有类型的参数,必须严格遵守以下顺序,否则会报错:

  1. 位置参数 (常规参数)
  2. 默认参数
  3. *args (可变位置参数)
  4. **kwargs (可变关键字参数)

注:在 Python 3 中,*args 和默认参数的位置有时可以互换(形成命名关键字参数),但对于初学者,建议死记上述顺序以避免混淆。


5. 总结与资源 (Conclusion & Resources)

核心知识点回顾

  • 位置参数:按顺序入座,最死板但最常用。
  • 关键字参数:指名道姓,清晰易读。
  • 默认参数:提供备选方案,简化调用。
  • *args:打包多余的位置参数为元组。
  • **kwargs:打包多余的关键字参数为字典。
  • 切记:默认参数不要用空列表 []

下一步做什么?

掌握了函数的参数,你就具备了编写通用代码库的能力。建议尝试编写一个简单的命令行工具(CLI),利用 *args**kwargs 来处理用户输入的各种复杂指令。

推荐阅读:


希望这篇指南能帮助你彻底理解 Python 函数参数。Happy Coding!

结尾
  • 希望对初学者有帮助;致力于办公自动化的小小程序员一枚
  • 希望能得到大家的【❤️一个免费关注❤️】感谢!
  • 求个 🤞 关注 🤞 +❤️ 喜欢 ❤️ +👍 收藏 👍
  • 此外还有办公自动化专栏,欢迎大家订阅:Python办公自动化专栏
  • 此外还有爬虫专栏,欢迎大家订阅:Python爬虫基础专栏
  • 此外还有Python基础专栏,欢迎大家订阅:Python基础学习专栏

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐