杰瑞科技汇

Python命令中default参数如何使用?

default 在 Python 中不是一个单独的命令,而是一个非常重要的关键字,它主要用于函数定义中,为参数提供一个默认值,这个特性极大地增强了函数的灵活性和易用性。

Python命令中default参数如何使用?-图1
(图片来源网络,侵删)

下面我将从几个方面为你详细解释 default 的用法和场景。

核心概念:带默认值的参数

当你定义一个函数时,可以为一个或多个参数指定默认值,这样,在调用这个函数时,你可以选择性地为这些参数传值。

  • 如果传值:函数会使用你传入的值。
  • 如果不传值:函数会使用在定义时指定的默认值。

语法格式:

def function_name(param1, param2=default_value):
    # 函数体
    ...

基本用法示例

这是一个最简单的例子,一个用于打印问候语的函数。

Python命令中default参数如何使用?-图2
(图片来源网络,侵删)
def greet(name, message="你好"):
    """打印一个个性化的问候语。
    Args:
        name (str): 要问候的人的名字。
        message (str): 问候语内容,默认为 "你好"。
    """
    print(f"{message}, {name}!")
# --- 调用函数 ---
# 1. 只提供必传参数 'name','message' 使用默认值
greet("张三")
# 输出: 你好, 张三!
# 2. 提供所有参数,'message' 使用传入的值
greet("李四", "早上好")
# 输出: 早上好, 李四!
# 3. 使用关键字参数传值,结果与上面相同
greet(message="晚上好", name="王五")
# 输出: 晚上好, 王五!

在这个例子中,message 就是一个带有默认值 "你好" 的参数,这使得 greet("张三") 这样的调用成为可能,非常方便。


默认参数的注意事项(非常重要!)

这是 Python 中最容易出错的地方,尤其是对于可变对象(如列表、字典、集合)。

⚠️ 警告:不要使用可变对象作为默认参数!

默认值是在函数定义时创建并赋值的,而不是在每次调用函数时,这意味着,如果你用一个可变对象(比如一个空列表 [])作为默认值,这个列表对象会在所有调用该函数且不提供该参数的实例之间共享

错误示例:

def add_to_list(item, my_list=[]):
    """向一个列表中添加一个元素。"""
    my_list.append(item)
    return my_list
# 第一次调用,不提供 my_list,它会使用默认的 []
list1 = add_to_list(1)
print(f"第一次调用结果: {list1}")
# 输出: 第一次调用结果: [1]
# 第二次调用,仍然不提供 my_list,它使用的还是那个已经被修改过的默认列表 []
list2 = add_to_list(2)
print(f"第二次调用结果: {list2}")
# 输出: 第二次调用结果: [1, 2]  <-- 注意!这里不是 [2]!
# 第三次调用,这次我们提供了一个新的列表
list3 = add_to_list(3, [10, 20])
print(f"第三次调用结果: {list3}")
# 输出: 第三次调用结果: [10, 20, 3]

为什么会这样? 因为 my_list=[] 只在函数被定义时执行一次,创建了一个列表对象,之后所有不传 my_list 的调用,都指向这个同一个列表对象。

✅ 正确的做法:使用 None 作为占位符

如果你需要一个可变对象的默认值,正确的做法是使用 None 作为默认值,然后在函数内部检查参数是否为 None,如果是,则创建一个新的可变对象。

修正后的正确示例:

def add_to_list_safe(item, my_list=None):
    """向一个列表中添加一个元素(安全版本)。"""
    if my_list is None:
        my_list = []  # 如果调用者没有提供列表,就创建一个新的空列表
    my_list.append(item)
    return my_list
# 第一次调用
list1 = add_to_list_safe(1)
print(f"第一次调用结果: {list1}")
# 输出: 第一次调用结果: [1]
# 第二次调用
list2 = add_to_list_safe(2)
print(f"第二次调用结果: {list2}")
# 输出: 第二次调用结果: [2]  <-- 现在结果正确了!
# 第三次调用,提供新列表
list3 = add_to_list_safe(3, [10, 20])
print(f"第三次调用结果: {list3}")
# 输出: 第三次调用结果: [10, 20, 3]

default 在其他上下文中的含义

虽然最常见的 default 是用在函数参数中,但它也出现在其他地方,含义略有不同。

a. dict.get(key, default=None)

字典的 .get() 方法是 default 的另一个重要应用场景,当你尝试获取一个字典中不存在的键时,使用 [] 会抛出 KeyError,而使用 .get() 方法可以返回一个指定的默认值,而不会报错。

student_grades = {"张三": 95, "李四": 88}
# 尝试获取一个不存在的键
grade_zhangsan = student_grades.get("张三")
print(f"张三的成绩: {grade_zhangsan}")
# 输出: 张三的成绩: 95
grade_wangwu = student_grades.get("王五")
print(f"王五的成绩: {grade_wangwu}")
# 输出: 王五的成绩: None
# 指定一个默认值
grade_wangwu_with_default = student_grades.get("王五", 0)
print(f"王五的成绩(默认为0): {grade_wangwu_with_default}")
# 输出: 王五的成绩(默认为0): 0

b. collections.defaultdict

collections.defaultdict 是一个特殊的字典子类,当你访问一个不存在的键时,它会自动调用你提供的“工厂函数”(如 list, int, set 等)来为这个键创建一个默认值,而不会抛出 KeyError

from collections import defaultdict
# 创建一个 defaultdict,当键不存在时,自动为其创建一个空列表
# lambda: [] 是一个返回空列表的匿名函数
fruit_counts = defaultdict(lambda: [])
fruit_counts["苹果"].append(10)
fruit_counts["香蕉"].append(20)
fruit_counts["苹果"].append(5)
# 访问一个不存在的键 "橙子",它会自动创建一个空列表
print(fruit_counts["橙子"])
# 输出: []
print(fruit_counts)
# 输出: defaultdict(<function <lambda> at 0x...>, {'苹果': [10, 5], '香蕉': [20], '橙子': []})

c. argparse 模块中的 default

在编写命令行工具时,argparse 模块用于解析命令行参数,在定义参数时,可以使用 default 关键字来为该参数设置一个默认值,如果用户在命令行中没有提供该参数,程序就会使用这个默认值。

# my_script.py
import argparse
parser = argparse.ArgumentParser(description="一个简单的命令行加法器。")
parser.add_argument("--num1", type=int, default=10, help="第一个数字 (默认: 10)")
parser.add_argument("--num2", type=int, default=20, help="第二个数字 (默认: 20)")
args = parser.parse_args()
result = args.num1 + args.num2
print(f"计算结果: {args.num1} + {args.num2} = {result}")
# --- 在命令行中运行 ---
# 情况1: 不提供任何参数
# > python my_script.py
# 输出: 计算结果: 10 + 20 = 30
# 情况2: 只提供一个参数
# > python my_script.py --num1 5
# 输出: 计算结果: 5 + 20 = 25
# 情况3: 提供所有参数
# > python my_script.py --num1 5 --num2 7
# 输出: 计算结果: 5 + 7 = 12

上下文 default 的作用 示例
函数参数 核心用法,为参数提供一个默认值,使函数调用更灵活。 def func(a, b=10): ...
字典方法 安全地获取键值,键不存在时返回指定值,避免 KeyError my_dict.get('key', 'default_value')
collections.defaultdict 访问不存在的键时,自动调用工厂函数创建默认值。 defaultdict(list)
argparse 为命令行参数设置默认值。 parser.add_argument('--name', default='Guest')

最重要的要点是记住:避免使用可变对象(如 [], )作为函数参数的默认值,而应该使用 None 作为占位符。

分享:
扫描分享到社交APP
上一篇
下一篇