当前位置: 首页 > news >正文

DAY26 函数定义与参数

浙大疏锦行-CSDN博客
知识点回顾:
1.函数的定义
2.变量作用域:局部变量和全局变量
3.函数的参数类型:位置参数、默认参数、不定参数
4.传递参数的手段:关键词参数
5.传递参数的顺序:同时出现三种参数类型时

  1. 函数的定义

    • 使用 def 关键字来定义函数。
    • 函数名后面跟着圆括号 (),可以包含参数。
    • 函数体以冒号 : 开始,并且需要缩进。
    • 可以使用 return 语句从函数中返回值。
  2. 变量作用域:局部变量和全局变量

    • 局部变量 (Local Variables):在函数内部定义的变量,只能在函数内部访问。
    • 全局变量 (Global Variables):在函数外部定义的变量,可以在程序的任何地方访问(在函数内部如果需要修改全局变量,需要使用 global 关键字)。
  3. 函数的参数类型

    • 位置参数 (Positional Arguments):调用函数时,根据参数的位置顺序传递值。
    • 默认参数 (Default Arguments):定义函数时,可以为参数指定默认值。如果在调用函数时没有为该参数提供值,则使用默认值。
    • 不定参数 (Arbitrary Arguments)
      • *args用于接收任意数量的位置参数,这些参数在函数内部会被收集为一个元组 (tuple)。
      • **kwargs:用于接收任意数量的关键字参数,这些参数在函数内部会被收集为一个字典 (dictionary)。
  4. 传递参数的手段:关键词参数 (Keyword Arguments)

    • 调用函数时,可以通过 参数名=值 的形式指定参数的值,这样可以不用考虑参数的顺序。
  5. 传递参数的顺序:同时出现三种参数类型时

    • 当一个函数同时包含位置参数、*args**kwargs 时,它们的顺序通常是:标准位置参数,然后是 *args,最后是 **kwargs
    • 默认参数应该在普通位置参数之后,*args 之前。

作业:
题目1:计算圆的面积
●任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 = π * radius² (可以使用 math.pi 作为 π 的值)
●要求:函数接收一个位置参数 radius。计算半径为5、0、-1时候的面积
●注意点:可以采取try-except 使函数变得更加稳健,如果传入的半径为负数,函数应该返回 0 (或者可以考虑引发一个ValueError,但为了简单起见,先返回0)。

import mathdef calculate_circle_area(radius):"""计算圆的面积。参数:radius (float or int): 圆的半径。返回:float: 圆的面积。如果半径为负数或发生其他错误,则返回 0。"""# 这是一个 `try...except` 代码块。它的主要作用是尝试执行一段代码(`try` 部分),# 如果在执行过程中发生了错误(也叫“异常”),那么程序不会直接崩溃,# 而是会跳转到 `except` 部分去处理这个错误。这让我们的程序更加健壮。try:# --- 检查半径是否是数字类型 ---# `isinstance()` 是一个内置函数,用来检查一个对象(这里是 `radius`)是否是指定类型(这里是 `int` 或 `float`)的实例。# `int` 代表整数 (e.g., 5, 0, -1)# `float` 代表浮点数 (e.g., 2.5, 3.14)# `not isinstance(radius, (int, float))` 的意思是:如果 `radius` *不是* 一个整数 *也不是* 一个浮点数,那么...if not isinstance(radius, (int, float)):# `raise TypeError(...)` 这行代码会主动引发一个“类型错误”(TypeError)。# 当我们检测到传入的 `radius` 不是我们期望的数字类型时,# 我们就告诉 Python:“这里发生了一个类型错误,错误信息是'半径必须是一个数字。'”# 这样做的好处是,我们可以明确地指出错误的原因。raise TypeError("半径必须是一个数字。")# --- 检查半径是否为负数 ---# 这是一个简单的 `if` 条件判断语句。# `radius < 0` 的意思是:如果 `radius` 的值小于 0(即为负数),那么...if radius < 0:# `print(f"...")` 这是一种叫做 f-string (格式化字符串字面值) 的打印方式。# 它允许我们在字符串中直接嵌入变量的值。# `f"警告:半径 {radius} 是负数,面积将返回 0。"` 会把 `radius` 变量的实际值替换到 `{radius}` 的位置。# 例如,如果 `radius` 是 -1,它会打印出:"警告:半径 -1 是负数,面积将返回 0。"print(f"警告:半径 {radius} 是负数,面积将返回 0。")# `return 0` 语句会立即结束当前函数的执行,并把 0 作为函数的结果返回给调用者。# 根据题目要求,如果半径为负数,函数应该返回 0。return 0# --- 计算面积 ---# 如果代码执行到这里,说明 `radius` 是一个有效的非负数字。# `math.pi` 是 Python `math` 模块中预定义的圆周率 π (约等于 3.14159)。# `radius ** 2` 表示 `radius` 的平方 (radius * radius)。# 所以 `area = math.pi * (radius ** 2)` 就是在执行圆面积的计算公式:π * r²。# 计算结果会被存储在名为 `area` 的变量中。area = math.pi * (radius ** 2)# `return area` 语句会结束函数的执行,并将计算得到的 `area` 值返回给调用者。return area# --- 错误处理部分 ---# 如果在上面的 `try` 代码块中,`raise TypeError(...)` 被执行了,# 或者发生了其他类型的 `TypeError`,程序会跳转到这里。except TypeError as te:# `TypeError as te` 的意思是:捕获“类型错误”,并将这个错误对象赋值给变量 `te`。# 这样我们就可以在 `print` 语句中使用 `te` 来显示具体的错误信息。print(f"类型错误: {te}")# 同样,根据题目要求或为了程序的健壮性,发生错误时返回 0。return 0# `except Exception as e:` 这是一个更通用的错误捕获。# `Exception` 是几乎所有内置错误的基类。# 如果 `try` 代码块中发生了除了 `TypeError` 之外的其他任何类型的错误(比如我们没预料到的错误),# 这个 `except` 块就会被执行。except Exception as e: # 捕获其他可能的意外错误# `Exception as e` 的意思是:捕获任何类型的“异常”,并将这个异常对象赋值给变量 `e`。print(f"计算面积时发生错误: {e}")# 发生未知错误时,也返回 0,确保函数总有一个返回值。return 0# ---- 测试函数 ----# 包含一个无效输入的测试列表
radii_to_test = [5, 0, -1, "hello", 2.5]print("--- 开始测试 calculate_circle_area 函数 ---")
for r_val in radii_to_test:print(f"\n测试半径: {r_val}")calculated_area = calculate_circle_area(r_val)# 打印结果,并保留两位小数print(f"计算得到的面积: {calculated_area:.2f}" if isinstance(calculated_area, (int, float)) else f"计算得到的面积: {calculated_area}")print("-" * 30)# 题目要求的具体测试用例
print("\n--- 题目要求的特定测试用例 ---")radius_case_1 = 5
area_case_1 = calculate_circle_area(radius_case_1)
print(f"半径为 {radius_case_1} 的圆的面积是: {area_case_1:.2f}")radius_case_2 = 0
area_case_2 = calculate_circle_area(radius_case_2)
print(f"半径为 {radius_case_2} 的圆的面积是: {area_case_2:.2f}")radius_case_3 = -1
area_case_3 = calculate_circle_area(radius_case_3)
print(f"半径为 {radius_case_3} 的圆的面积是: {area_case_3:.2f}")

题目2:计算矩形的面积
●任务: 编写一个名为 calculate_rectangle_area 的函数,该函数接收矩形的长度 length 和宽度 width 作为参数,并返回矩形的面积。
●公式: 矩形面积 = length * width
●要求:函数接收两个位置参数 length 和 width。
○函数返回计算得到的面积。
○如果长度或宽度为负数,函数应该返回 0。

# --- 题目2:计算矩形的面积 ---
def calculate_rectangle_area(length, width):"""计算矩形的面积。参数:length (float or int): 矩形的长度。width (float or int): 矩形的宽度。返回:float or int: 矩形的面积。如果长度或宽度为负数,或者输入类型不正确,则返回 0。"""# 首先,检查传入的长度和宽度是否是有效的数字类型 (整数或浮点数)# isinstance() 函数用于判断一个对象是否是一个已知的类型。# 这里我们检查 length 和 width 是否是 int (整数) 或 float (浮点数) 类型。# (int, float) 是一个包含两种类型的元组,isinstance 会检查对象是否是元组中任何一种类型。if not isinstance(length, (int, float)) or not isinstance(width, (int, float)):# 如果 length 不是数字,或者 width 不是数字 (or 表示两者任一条件满足即可)# 'not' 对 isinstance 的结果取反。# 打印错误信息。f-string (f"...") 允许我们在字符串中直接嵌入变量的值。print(f"错误:长度 ({length}) 和宽度 ({width}) 都必须是数字类型。")# 返回 0,表示计算失败或输入无效return 0# 接下来,检查长度或宽度是否为负数# 使用 or 条件,只要其中一个为负数 (length < 0 或者 width < 0),条件就成立if length < 0 or width < 0:# 如果长度或宽度为负数,打印警告信息print(f"警告:长度 ({length}) 或宽度 ({width}) 为负数。面积将返回 0。")# 根据题目要求,返回 0return 0# 如果代码执行到这里,说明前面的检查都通过了:# 1. length 和 width 都是数字。# 2. length 和 width 都不是负数。# 现在可以安全地计算面积了。# 矩形面积 = 长度 * 宽度area = length * width# 使用 return 语句将计算得到的面积返回给调用函数的地方return area# --- 测试 calculate_rectangle_area 函数 ---
print("\n--- 开始测试 calculate_rectangle_area 函数 ---") # \n 是换行符,让输出更好看# 测试用例1: 正常的长度和宽度
rect_len1 = 10  # 定义一个变量存储长度
rect_wid1 = 5   # 定义一个变量存储宽度
# 调用函数,并将 rect_len1 和 rect_wid1 作为参数传递
area1 = calculate_rectangle_area(rect_len1, rect_wid1) 
# 打印结果
print(f"矩形:长度={rect_len1}, 宽度={rect_wid1}, 面积={area1}") # 预期输出: 50# 测试用例2: 长度为0 (有效的,面积应为0)
rect_len2 = 0
rect_wid2 = 5
area2 = calculate_rectangle_area(rect_len2, rect_wid2)
print(f"矩形:长度={rect_len2}, 宽度={rect_wid2}, 面积={area2}") # 预期输出: 0# 测试用例3: 宽度为负数 (应返回0并打印警告)
rect_len3 = 10
rect_wid3 = -2
area3 = calculate_rectangle_area(rect_len3, rect_wid3)
print(f"矩形:长度={rect_len3}, 宽度={rect_wid3}, 面积={area3}") # 预期输出: 0# 测试用例4: 长度为负数 (应返回0并打印警告)
rect_len4 = -4
rect_wid4 = 5
area4 = calculate_rectangle_area(rect_len4, rect_wid4)
print(f"矩形:长度={rect_len4}, 宽度={rect_wid4}, 面积={area4}") # 预期输出: 0# 测试用例5: 长度和宽度都为负数 (应返回0并打印警告)
rect_len5 = -3
rect_wid5 = -6
area5 = calculate_rectangle_area(rect_len5, rect_wid5)
print(f"矩形:长度={rect_len5}, 宽度={rect_wid5}, 面积={area5}") # 预期输出: 0# 测试用例6: 长度不是数字 (应返回0并打印错误)
rect_len6 = "abc" # 这是一个字符串,不是数字
rect_wid6 = 5
area6 = calculate_rectangle_area(rect_len6, rect_wid6)
print(f"矩形:长度='{rect_len6}', 宽度={rect_wid6}, 面积={area6}") # 注意字符串用引号括起来# 测试用例7: 宽度不是数字 (应返回0并打印错误)
rect_len7 = 10
rect_wid7 = "xyz" # 这是一个字符串
area7 = calculate_rectangle_area(rect_len7, rect_wid7)
print(f"矩形:长度={rect_len7}, 宽度='{rect_wid7}', 面积={area7}")print("--- calculate_rectangle_area 函数测试结束 ---")

try-except,把if的判断模块和执行模块分开了,数字类型的报错就和负数的不一样

*args用法,就直接放在name()括号中

题目3:计算任意数量数字的平均值
●任务: 编写一个名为 calculate_average 的函数,该函数可以接收任意数量的数字作为参数(引入可变位置参数 (*args)),并返回它们的平均值。
●要求:使用 *args 来接收所有传入的数字。
○如果没有任何数字传入,函数应该返回 0。
○函数返回计算得到的平均值。

# --- 题目3:计算任意数量数字的平均值 ---
def calculate_average(*args):"""计算任意数量数字的平均值。参数:*args: 任意数量的数字参数。这些参数会被收集到一个名为 args 的元组 (tuple) 中。返回:float: 数字的平均值。如果没有提供参数,则返回 0。如果提供的参数中包含非数字类型,则会尝试忽略它们并计算剩余数字的平均值,同时打印警告。如果所有参数都是非数字或没有有效数字,则返回 0。"""# 检查 *args 是否为空。# 当函数被调用时,所有通过位置传递的参数(没有显式名称的参数)# 都会被打包到名为 'args' 的元组 (tuple) 中。# 例如,如果调用 calculate_average(1, 2, 3),那么 args 的值就是 (1, 2, 3)。# 如果调用 calculate_average(),那么 args 的值就是空元组 ()。if not args:  # 'not args' 检查元组 args 是否为空。空元组在布尔上下文中被视为 False。# 如果没有传入任何数字,打印提示信息并根据题目要求返回 0print("提示:没有提供任何数字来计算平均值,返回 0。")return 0# 初始化用于存储数字总和的变量sum_of_numbers = 0# 初始化用于记录有效数字个数的变量count_of_numbers = 0# 遍历传入到 *args 中的每一个参数# for 循环会依次取出 args 元组中的每个元素,并将其赋值给变量 'number'for number in args:# 检查当前取出的 'number' 是否是数字类型 (整数 int 或浮点数 float)if isinstance(number, (int, float)):# 如果是数字,将其加到总和 sum_of_numbers 中sum_of_numbers += number  # 这行代码等同于: sum_of_numbers = sum_of_numbers + number# 同时,将有效数字的计数器 count_of_numbers 加 1count_of_numbers += 1   # 这行代码等同于: count_of_numbers = count_of_numbers + 1else:# 如果 'number' 不是数字类型,打印一条警告信息# type(number).__name__ 会获取变量 'number' 的具体类型名称 (例如 'str', 'list')print(f"警告:参数 '{number}' (类型: {type(number).__name__}) 不是数字,将被忽略。")# 在尝试进行除法运算(计算平均值)之前,必须确保我们至少有一个有效的数字# 否则,如果 count_of_numbers 是 0,执行 sum_of_numbers / count_of_numbers 会导致 ZeroDivisionErrorif count_of_numbers == 0:# 如果遍历完所有参数后,没有找到任何有效的数字# (例如,所有传入的参数都是字符串,或者虽然传入了参数但都被忽略了)print("提示:没有有效的数字可用于计算平均值,返回 0。")return 0# 计算平均值:总和除以数量average = sum_of_numbers / count_of_numbers# 返回计算得到的平均值return average# --- 测试 calculate_average 函数 ---
print("\n--- 开始测试 calculate_average 函数 ---")# 测试用例1: 传入多个数字
# 调用函数时,10, 20, 30, 40, 50 会被收集到 args 元组中: args = (10, 20, 30, 40, 50)
avg1 = calculate_average(10, 20, 30, 40, 50)
print(f"数字 (10, 20, 30, 40, 50) 的平均值是: {avg1}") # 预期输出: (10+20+30+40+50)/5 = 150/5 = 30.0# 测试用例2: 传入单个数字
# args = (15,)  注意,即使只有一个元素,元组也会有一个逗号
avg2 = calculate_average(15)
print(f"数字 (15) 的平均值是: {avg2}") # 预期输出: 15.0# 测试用例3: 不传入任何数字
# args = () # 空元组
avg3 = calculate_average() 
print(f"没有传入数字时的平均值是: {avg3}") # 预期输出: 0 (并打印提示)# 测试用例4: 传入包含非数字类型的参数
# args = (10, 20, "abc", 30, "xyz", 40.5)
# 函数会忽略 "abc" 和 "xyz"
avg4 = calculate_average(10, 20, "abc", 30, "xyz", 40.5)
# 有效数字是 10, 20, 30, 40.5。 总和 = 100.5, 数量 = 4. 平均值 = 100.5 / 4 = 25.125
print(f"数字 (10, 20, \"abc\", 30, \"xyz\", 40.5) 的有效平均值是: {avg4}") # (并打印警告)# 测试用例5: 所有参数都是非数字
# args = ("hello", "world", [1, 2])
# [1, 2] 是一个列表,也不是 int 或 float
avg5 = calculate_average("hello", "world", [1, 2])
print(f"参数 (\"hello\", \"world\", [1, 2]) 的平均值是: {avg5}") # 预期输出: 0 (并打印警告和提示)# 测试用例6: 传入浮点数
# args = (1.5, 2.5, 3.5)
avg6 = calculate_average(1.5, 2.5, 3.5)
print(f"数字 (1.5, 2.5, 3.5) 的平均值是: {avg6}") # 预期输出: (1.5+2.5+3.5)/3 = 7.5/3 = 2.5print("--- calculate_average 函数测试结束 ---")

— 开始测试 calculate_average 函数 —
数字 (10, 20, 30, 40, 50) 的平均值是: 30.0
数字 (15) 的平均值是: 15.0
提示:没有提供任何数字来计算平均值,返回 0。
没有传入数字时的平均值是: 0
警告:参数 ‘abc’ (类型: str) 不是数字,将被忽略。
警告:参数 ‘xyz’ (类型: str) 不是数字,将被忽略。
数字 (10, 20, “abc”, 30, “xyz”, 40.5) 的有效平均值是: 25.125
警告:参数 ‘hello’ (类型: str) 不是数字,将被忽略。
警告:参数 ‘world’ (类型: str) 不是数字,将被忽略。
警告:参数 ‘[1, 2]’ (类型: list) 不是数字,将被忽略。
提示:没有有效的数字可用于计算平均值,返回 0。
参数 (“hello”, “world”, [1, 2]) 的平均值是: 0
数字 (1.5, 2.5, 3.5) 的平均值是: 2.5
— calculate_average 函数测试结束 —

题目4:打印用户信息
●任务: 编写一个名为 print_user_info 的函数,该函数接收一个必需的参数 user_id,以及任意数量的额外用户信息(作为关键字参数)。
●要求:
○user_id 是一个必需的位置参数。
○使用 **kwargs 来接收额外的用户信息。
○函数打印出用户ID,然后逐行打印所有提供的额外信息(键和值)。
○函数不需要返回值

# --- 题目4:打印用户信息 ---
def print_user_info(user_id, **kwargs):"""打印用户的ID以及提供的其他任意关键字参数信息。参数:user_id (any): 用户的ID,这是一个必需的位置参数。它可以是任何数据类型 (例如整数、字符串等)。**kwargs: 任意数量的关键字参数。这些参数会被收集到一个名为 kwargs 的字典 (dictionary) 中。例如,如果调用 print_user_info(101, name="Alice", age=30),那么 kwargs 将是 {"name": "Alice", "age": 30}。返回:None: 这个函数不返回任何值 (它只是执行打印操作)。"""# 首先,打印用户的ID。# user_id 是一个必需的位置参数,调用此函数时必须提供。print(f"用户ID: {user_id}")# 检查 **kwargs 是否收集到了任何参数。# 当函数被调用时,所有以 `key=value` 形式传递的额外参数# 都会被打包到名为 'kwargs' 的字典 (dictionary) 中。# 例如,如果调用 print_user_info(1, name="Bob", location="USA"),# 那么 kwargs 的值就是 {"name": "Bob", "location": "USA"}。# 如果只调用 print_user_info(1),那么 kwargs 就是一个空字典 {}。if not kwargs:  # 'not kwargs' 检查字典 kwargs 是否为空。空字典在布尔上下文中被视为 False。# 如果 kwargs 字典为空 (即没有提供额外的关键字参数),打印一条提示信息。print("  没有提供额外的用户信息。")else:# 如果 kwargs 字典不为空,说明有额外的用户信息。print("  额外信息:")# 遍历 kwargs 字典中的每一项。# kwargs.items() 方法返回一个包含字典中所有 (键, 值) 对的视图对象。# 在 for 循环中,每个键值对会被解包到变量 'key' 和 'value' 中。for key, value in kwargs.items():# 打印每个额外信息的键 (key) 和对应的值 (value)。# 使用 f-string 进行格式化输出。# "    " (四个空格) 用于缩进,使输出更易读。print(f"    {key}: {value}")# 这个函数的主要目的是打印信息,而不是返回一个计算结果。# 因此,它不需要显式的 `return` 语句来返回值。# 如果一个函数没有显式的 `return` 语句,或者有一个不带任何值的 `return`,# 它会自动返回一个特殊的值 `None`。# --- 测试 print_user_info 函数 ---
print("\n--- 开始测试 print_user_info 函数 ---")# 测试用例1: 提供 user_id 和一些额外的关键字参数
print("测试用例 1:")
# 调用函数时,101 是 user_id。
# name="Alice", age=30, city="New York" 会被收集到 kwargs 中。
# kwargs = {"name": "Alice", "age": 30, "city": "New York"}
print_user_info(101, name="Alice", age=30, city="New York")
# 预期输出:
# 用户ID: 101
#   额外信息:
#     name: Alice
#     age: 30
#     city: New York# 测试用例2: 只提供必需的 user_id,没有额外的关键字参数
print("\n测试用例 2:")
# kwargs 将是一个空字典 {}
print_user_info("user_abc") # user_id 可以是字符串或其他类型
# 预期输出:
# 用户ID: user_abc
#   没有提供额外的用户信息。# 测试用例3: 提供 user_id 和不同类型的额外信息
print("\n测试用例 3:")
# kwargs 将包含 username, email, is_active, hobbies
print_user_info(999, username="johndoe", email="john.doe@example.com", is_active=True,  # 布尔值hobbies=["reading", "hiking"]) # 列表作为值
# 预期输出:
# 用户ID: 999
#   额外信息:
#     username: johndoe
#     email: john.doe@example.com
#     is_active: True
#     hobbies: ['reading', 'hiking']# 测试用例4: user_id 是整数,一个额外的关键字参数
print("\n测试用例 4:")
# kwargs = {"status": "Pending"}
print_user_info(1, status="Pending")
# 预期输出:
# 用户ID: 1
#   额外信息:
#     status: Pendingprint("--- print_user_info 函数测试结束 ---")

key属性名称,value:值
for key, value in kwargs.items():
# 打印每个额外信息的键 (key) 和对应的值 (value)。
# 使用 f-string 进行格式化输出。

题目5:格式化几何图形描述
●任务: 编写一个名为 describe_shape 的函数,该函数接收图形的名称 shape_name (必需),一个可选的 color (默认 “black”),以及任意数量的描述该图形尺寸的关键字参数 (例如 radius=5 对于圆,length=10, width=4 对于矩形)。
●要求:shape_name 是必需的位置参数。
○color 是一个可选参数,默认值为 “black”。
○使用 **kwargs 收集描述尺寸的参数。
○函数返回一个描述字符串,格式如下:
○“A [color] [shape_name] with dimensions: [dim1_name]=[dim1_value], [dim2_name]=[dim2_value], …”如果 **kwargs 为空,则尺寸部分为 “with no specific dimensions.”

# --- 题目5:格式化几何图形描述 ---
def describe_shape(shape_name, color="black", **dimensions_kwargs):"""生成一个描述几何图形及其尺寸的字符串。参数:shape_name (str): 图形的名称 (必需的位置参数)。color (str, optional): 图形的颜色。默认为 "black"。'optional' 表示这个参数是可选的。如果调用时不提供,则使用默认值。**dimensions_kwargs: 任意数量的关键字参数,用于描述图形的尺寸。例如: radius=5, length=10, width=4。这些参数会被收集到一个名为 dimensions_kwargs 的字典中。返回:str: 描述图形的字符串。"""# 开始构建描述字符串的第一部分。# 使用 f-string 来嵌入 shape_name 和 color 变量的值。# 例如: 如果 shape_name="circle" 且 color="red",这里会得到 "A red circle"description = f"A {color} {shape_name}"# 检查是否通过 **dimensions_kwargs 提供了任何尺寸信息。# dimensions_kwargs 是一个字典。如果调用函数时没有提供额外的关键字参数# (除了 shape_name,以及 color 如果被显式指定的话),# dimensions_kwargs 将会是一个空字典 {}。if not dimensions_kwargs:  # 'not dimensions_kwargs' 检查字典是否为空。# 如果 dimensions_kwargs 为空 (即没有提供尺寸参数),# 在主描述后追加 " with no specific dimensions."description += " with no specific dimensions."else:# 如果 dimensions_kwargs 不为空,说明提供了尺寸参数。# 首先追加 " with dimensions: " 到主描述。description += " with dimensions: "# 创建一个空列表,用于存储每个维度参数的 "key=value" 字符串形式。dimension_parts = []# 遍历 dimensions_kwargs 字典中的每一项 (键和值)。# .items() 方法返回字典中 (键, 值) 对的集合。# dim_name 将是参数名 (例如 "radius", "length"),# dim_value 将是参数值 (例如 5, 10)。for dim_name, dim_value in dimensions_kwargs.items():# 将每个维度格式化为 "dim_name=dim_value" 的字符串,# 例如 "radius=5" 或 "length=10"。# 然后将这个字符串添加到 dimension_parts 列表中。dimension_parts.append(f"{dim_name}={dim_value}")# 使用 ", " (逗号和空格) 作为分隔符,# 将 dimension_parts 列表中的所有字符串连接成一个单一的字符串。# 例如,如果 dimension_parts 是 ["radius=5", "sides=3"],# ", ".join(dimension_parts) 会得到 "radius=5, sides=3"。dimensions_string = ", ".join(dimension_parts)# 将连接好的维度字符串追加到主描述字符串的末尾。description += dimensions_string# 返回最终构建完成的描述字符串。return description# --- 测试 describe_shape 函数 ---
print("\n--- 开始测试 describe_shape 函数 ---")# 测试用例1: 圆形,指定颜色和半径
# shape_name="circle", color="red", dimensions_kwargs={"radius": 5}
desc1 = describe_shape("circle", color="red", radius=5)
print(f"测试1: {desc1}")
# 预期输出: A red circle with dimensions: radius=5# 测试用例2: 矩形,使用默认颜色 ("black"),指定长度和宽度
# shape_name="rectangle", color="black" (默认), dimensions_kwargs={"length": 10, "width": 4}
desc2 = describe_shape("rectangle", length=10, width=4)
print(f"测试2: {desc2}")
# 预期输出: A black rectangle with dimensions: length=10, width=4# 测试用例3: 三角形,只提供名称 (颜色使用默认,无尺寸)
# shape_name="triangle", color="black" (默认), dimensions_kwargs={} (空字典)
desc3 = describe_shape("triangle")
print(f"测试3: {desc3}")
# 预期输出: A black triangle with no specific dimensions.# 测试用例4: 正方形,指定颜色,无尺寸
# shape_name="square", color="blue", dimensions_kwargs={}
desc4 = describe_shape("square", color="blue")
print(f"测试4: {desc4}")
# 预期输出: A blue square with no specific dimensions.# 测试用例5: 自定义形状,多个维度参数
# shape_name="polygon", color="green", dimensions_kwargs={"sides": 6, "apothem": 2.5, "side_length": 3}
desc5 = describe_shape("polygon", color="green", sides=6, apothem=2.5, side_length=3)
print(f"测试5: {desc5}")
# 预期输出: A green polygon with dimensions: sides=6, apothem=2.5, side_length=3# 测试用例6: 形状名称包含空格,默认颜色
# shape_name="oval shape", color="black" (默认), dimensions_kwargs={"height": 10, "width": 5}
desc6 = describe_shape("oval shape", height=10, width=5)
print(f"测试6: {desc6}")
# 预期输出: A black oval shape with dimensions: height=10, width=5print("--- describe_shape 函数测试结束 ---")

位置参数即我的def定义时候和我是用的时候必须对应
默认参数,是在定义def是给参数赋值,若使用时不提及则默认使用

*args (任意数量的位置参数)
这里的 *toppings 会把 “珍珠”, “椰果”, “仙草” 这些参数收集到一个叫 toppings 的元组 (tuple) 里,就像一个小料清单。

**kwargs (任意数量的关键字参数)
size=“12寸”, crust=“薄底” 这些带有名字的参数收集到一个叫 details 的字典 (dictionary) 里,就像一个备注列表,每个备注都有标签和内容。

参数定义顺序
普通位置参数最先。
默认参数在普通位置参数之后,因为如果你想跳过默认参数直接给 *args 传值会很麻烦(虽然可以用关键字参数来指定前面的默认参数)。
*args 在默认参数之后,它会“吃掉”所有剩下的、没有名字的位置参数。
**kwargs 必须在最后,它会“吃掉”所有剩下的、有名字的关键字参数。

相关文章:

DAY26 函数定义与参数

浙大疏锦行-CSDN博客 知识点回顾&#xff1a; 1.函数的定义 2.变量作用域&#xff1a;局部变量和全局变量 3.函数的参数类型&#xff1a;位置参数、默认参数、不定参数 4.传递参数的手段&#xff1a;关键词参数 5.传递参数的顺序&#xff1a;同时出现三种参数类型时 函数的定义…...

系统安全及应用

目录 一、账号安全控制 1.基本安全措施 &#xff08;1&#xff09;系统账号清理 (2)密码安全控制 &#xff08;3&#xff09;历史命令&#xff0c;自动注销 2.用户提权和切换命令 2.1 su命令用法 2.2 sudo命令提权 2.3通过是sudo执行特权命令 二、系统引导和登录控制…...

微信小程序 地图 使用 射线法 判断目标点是否在多边形内部(可用于判断当前位置是否在某个区域内部)

目录 射线法原理简要逻辑代码 小程序代码调试基础库小程序配置地图数据地图多边形点与多边形关系 射线法 原理 使用射线法来判断&#xff0c;目标点是否在多边形内部 这里简单说下&#xff0c;具体细节可以看这篇文章 平面几何&#xff1a;判断点是否在多边形内&#xff08;…...

第三十七节:视频处理-视频读取与处理

引言:解码视觉世界的动态密码 在数字化浪潮席卷全球的今天,视频已成为信息传递的主要载体。从短视频平台的爆火到自动驾驶的视觉感知,视频处理技术正在重塑人类与数字世界的交互方式。本指南将深入探讨视频处理的核心技术,通过Python与OpenCV的实战演示,为您揭开动态影像…...

什么是 Flink Pattern

在 Apache Flink 中&#xff0c;Pattern 是 Flink CEP&#xff08;Complex Event Processing&#xff09;模块 的核心概念之一。它用于定义你希望从数据流中检测出的 事件序列模式&#xff08;Event Sequence Pattern&#xff09;。 &#x1f3af; 一、什么是 Flink Pattern&am…...

ADB基本操作和命令

1.ADB的含义 adb 命令是 Android 官方提供&#xff0c;调试 Android 系统的工具。 adb 全称为 Android Debug Bridge&#xff08;Android 调试桥&#xff09;&#xff0c;是 Android SDK 中提供的用于管理 Android 模拟器或真机的工具。 adb 是一种功能强大的命令行工具&#x…...

NSString的三种实现方式

oc里的NSString有三种实现方式&#xff0c;为_ _NSCFConstantString、__NSCFString、NSTaggedPointerString 1._ _NSCFConstantString(字面量字符串) 从字面意思上可以看出&#xff0c;_ _NSCFContantString可以理解为常量字符串&#xff0c;这种类型的字符串在编译期就确定了…...

2025年PMP 学习二十 第13章 项目相关方管理

第13章 项目相关方管理 序号过程过程组过程组1识别相关方启动2规划相关方管理规划3管理相关方参与与执行4监控相关方参与与监控 相关方管理&#xff0c;针对于团队之外的相关方的&#xff0c;核心目标是让对方为了支持项目&#xff0c;以达到项目目标。 文章目录 第13章 项目相…...

学习黑客Kerberos深入浅出:安全王国的门票系统

Kerberos深入浅出&#xff1a;安全王国的门票系统 &#x1f3ab; 作者: 海尔辛 | 发布时间: 2025-05-18 &#x1f511; 理解Kerberos&#xff1a;为什么它如此重要&#xff1f; Kerberos是现代网络环境中最广泛使用的身份验证协议之一&#xff0c;尤其在Windows Active Dire…...

蓝桥杯19681 01背包

问题描述 有 N 件物品和一个体积为 M 的背包。第 i 个物品的体积为 vi​&#xff0c;价值为 wi​。每件物品只能使用一次。 请问可以通过什么样的方式选择物品&#xff0c;使得物品总体积不超过 M 的情况下总价值最大&#xff0c;输出这个最大价值即可。 输入格式 第一行输…...

使用 Auto-Keras 进行自动化机器学习

使用 Auto-Keras 进行自动化机器学习 了解自动化机器学习以及如何使用 auto-keras 完成它。如今&#xff0c;机器学习并不是一个非常罕见的术语&#xff0c;因为像 DataCamp、Coursera、Udacity 等组织一直在努力提高他们的效率和灵活性&#xff0c;以便将机器学习的教育带给普…...

算法刷题Day9 5.18:leetcode定长滑动窗口3道题,结束定长滑动窗口,用时1h

12. 1852.每个子数组的数字种类数 1852. 每个子数组的数字种类数 - 力扣&#xff08;LeetCode&#xff09; 思想 找到nums 所有 长度为 k 的子数组中 不同 元素的数量。 返回一个数组 ans&#xff0c;其中 ans[i] 是对于每个索引 0 < i < n - k&#xff0c;nums[i..(i …...

Protect Your Digital Privacy: Obfuscate, Don’t Hide

Protect Your Digital Privacy: Obfuscate, Don’t Hide In today’s digital world, hiding completely online is nearly impossible. But you can protect yourself by deliberately obfuscating your personal information — making it harder for others to track, pro…...

Spark 的运行模式(--master) 和 部署方式(--deploy-mode)

Spark 的 运行模式&#xff08;--master&#xff09; 和 部署方式&#xff08;--deploy-mode&#xff09;&#xff0c;两者的核心区别在于 资源调度范围 和 Driver 进程的位置。 一、核心概念对比 维度--master&#xff08;运行模式&#xff09;--deploy-mode&#xff08;部署…...

从零开始实现大语言模型(十五):并行计算与分布式机器学习

1. 前言 并行计算与分布式机器学习是一种使用多机多卡加速大规模深度神经网络训练过程&#xff0c;以减少训练时间的方法。在工业界的训练大语言模型实践中&#xff0c;通常会使用并行计算与分布式机器学习方法来减少训练大语言模型所需的钟表时间。 本文介绍PyTorch中的一种…...

生产模式下react项目报错minified react error #130的问题

这天&#xff0c;线上突然出现了一个bug&#xff0c;某个页面打开空白&#xff0c;看控制台报错minified react error #130&#xff0c;在本地看却是正常的&#xff0c;百思不得其解。 后来发现是由于线上项目它的包更新过了&#xff0c;而我本地的包没有更新&#xff0c;所以我…...

本地无损放大软件-realesrgan-gui

—————【下 载 地 址】——————— 【​本章下载一】&#xff1a;https://drive.uc.cn/s/84516041df174 【​本章下载二】&#xff1a;https://pan.xunlei.com/s/VOQDybD4ruF0-m8UJrCF-HtLA1?pwdxz9e# 【百款黑科技】&#xff1a;https://ucnygalh6wle.feishu.cn/wiki/…...

Java面试深度解析:微服务与云原生技术应用场景详解

Java面试深度解析&#xff1a;微服务与云原生技术应用场景详解 面试场景 面试官&#xff1a;我们今天的面试会围绕微服务与云原生技术展开&#xff0c;结合一个在线教育平台的业务场景进行提问。希望你放松心态&#xff0c;正常发挥。 码农明哥&#xff1a;好的好的&#xf…...

短剧小程序系统开发源码上架,短剧项目市场分析

引言 随着短视频内容消费的爆发式增长&#xff0c;短剧小程序凭借其碎片化、强互动、低成本的特点&#xff0c;成为内容创业与资本布局的新风口。2024年以来&#xff0c;行业规模突破500亿元&#xff0c;预计2027年将超千亿17。本文将深度解析短剧小程序系统开发的技术优势、市…...

常见的请求头(Request Header)参数

1. Accept 作用&#xff1a;告知服务器客户端支持的响应数据格式&#xff08;如 JSON、XML、HTML&#xff09;。示例&#xff1a;Accept: application/json&#xff08;优先接收 JSON 格式数据&#xff09;。 2. Content-Type 作用&#xff1a;说明请求体的数据格式&#xff08…...

渗透测试核心技术:内网渗透与横向移动

内网渗透是红队行动的关键阶段,攻击者通过突破边界进入内网后,需快速定位域控、横向移动并维持权限。本节从内网环境搭建、信息收集、横向移动技巧到权限维持工具,系统讲解如何在内网中隐蔽行动并扩大战果。 1. 内网环境搭建与基础配置 目标: 模拟真实企业网络,构建包含…...

2025/5/18

继续研究一下大佬的RAG项目。开始我的碎碎念。 RAG可以分成两部分&#xff1a;一个是问答&#xff0c;一个是数据处理。 问答是人提问&#xff0c;然后查数据库&#xff0c;把查的东西用大模型组织成人话&#xff0c;回答人的提问。 数据处理是把当下知识库里的东西&#xf…...

使用国内源加速Qt在线安装

简介&#xff1a; 在线安装Qt时&#xff0c;会发现下载非常缓慢&#xff0c;可以用过使用国内镜像源来加速安装过程。 在线安装包的下载过程&#xff1a; 1&#xff0c;打开下载页面 https://www.qt.io/download-open-source 2&#xff0c;点击 Download the Qt online ins…...

【图像生成大模型】HunyuanVideo:大规模视频生成模型的系统性框架

HunyuanVideo&#xff1a;大规模视频生成模型的系统性框架 引言HunyuanVideo 项目概述核心技术1. 统一的图像和视频生成架构2. 多模态大语言模型&#xff08;MLLM&#xff09;文本编码器3. 3D VAE4. 提示重写&#xff08;Prompt Rewrite&#xff09; 项目运行方式与执行步骤1. …...

Java IO流(超详细!!!)

Java IO流 文章目录 Java IO流1.文件相关基础普及1.1 常用文件操作1.3 目录的操作和文件删除 2.IO流原理及流的分类2.1 字节流2.1.1 InputStream&#xff1a;字节输入流2.1.2 OutputStream 2.2 字符流2.2.1 Reader2.2.1 Writer 2.3 节点流和处理流2.3.1节点流2.3.2 处理流2.3.2…...

规则联动引擎GoRules初探

背景说明 嵌入式设备随着物联网在生活和生产中不断渗透而渐渐多起来&#xff0c;数据的采集、处理、分析在设备侧的自定义配置越来越重要。一个可通过图形化配置的数据处理过程&#xff0c;对于加速嵌入式设备的功能开发愈发重要。作为一个嵌入式软件从业者&#xff0c;笔者一…...

Android开发-翻页类视图

在Android应用中&#xff0c;翻页类视图&#xff08;Paging Views&#xff09; 是一种非常直观且用户友好的方式来展示内容。无论是用于展示图片轮播、引导页还是分页加载数据列表&#xff0c;翻页效果都能极大地提升用户体验。本文将介绍几种实现翻页效果的常见组件和方法&…...

高能数造闪耀 CIBF 2025,以创新技术引领新能源智造新征程

在全球新能源产业加速发展的关键节点&#xff0c;CIBF 2025 展会成为行业技术与成果交流的重要平台。高能数造&#xff08;西安&#xff09;技术有限公司深度参与此次盛会&#xff0c;凭借在新能源电池智能制造领域的深厚积累与创新突破&#xff0c;为行业发展注入强劲动力&…...

数据结构与算法——栈和队列

栈和队列 栈概念与结构栈的实现栈的初始化栈的销毁判断栈是否为空入栈出栈取栈顶元素栈中有效元素个数 队列概念与结构队列的实现队列结点结构队列结构初始化队列队列判空销毁队列入队列&#xff0c;队尾出队列&#xff0c;队头取队头数据取队尾数据队列有效数据个数 栈 概念与…...

新电脑软件配置三 pycharm

快捷键放大和缩小字体 按住ctrl鼠标滚轮向上 缩小同理...

浅入ES5、ES6(ES2015)、ES2023(ES14)版本对比,及使用建议---ES6就够用(个人觉得)

JavaScript&#xff08;ECMAScript&#xff09;的发展经历了多个版本&#xff0c;每个版本都引入了新特性和改进。以下仅是对三个常用版本&#xff08;ES5、ES6&#xff08;ES2015&#xff09; 和 ES2023&#xff09;的基本对比及使用建议&#xff1a; 目前常见项目中还是用ES6…...

【Odoo】Pycharm导入运行Odoo15

【Odoo】Pycharm导入运行Odoo15 前置准备1. Odoo-15项目下载解压2. PsrtgreSQL数据库 项目导入运行1. 项目导入2. 设置项目内虚拟环境3. 下载项目中依赖4. 修改配置文件odoo.conf 运行Pycharm快捷运行 前置准备 1. Odoo-15项目下载解压 将下载好的项目解压到开发目录下 2. …...

【运营商查询】批量手机号码归属地和手机运营商高速查询分类,按省份城市,按运营商移动联通电信快速分类导出Excel表格,基于WPF的实现方案

WPF手机号码归属地批量查询与分类导出方案 应用场景 ​​市场营销​​&#xff1a;企业根据手机号码归属地进行精准营销&#xff0c;按城市或省份分类制定针对性推广策略​​客户管理​​&#xff1a;快速对客户手机号码进行归属地分类&#xff0c;便于后续客户关系管理​​数…...

中级统计师-统计学基础知识-第四章 假设检验

一、假设检验的基本原理 1. 基本思想 反证法&#xff1a;假设原假设成立&#xff0c;通过样本矛盾性进行反驳小概率原理&#xff1a;设定显著性水平 α \alpha α&#xff08;通常取 0.05&#xff09;&#xff0c;若观测结果的概率 p ≤ α p \leq \alpha p≤α&#xff0c…...

等于和绝对等于的区别

1. &#xff08;等于&#xff09; 特点&#xff1a;比较时会自动进行类型转换&#xff08;隐式转换&#xff09;&#xff0c;尝试将两边的值转为相同类型后再比较。规则&#xff1a; 如果类型相同&#xff0c;直接比较值。如果类型不同&#xff0c;按以下规则转换&#xff1a; …...

家庭关系处理个人总结

首先要说到前面的是&#xff0c;每个家庭的成员背景环境经济状况不同&#xff0c;原生家庭差异&#xff0c;导致面临具体问题是不同的。就类似软件“没有银弹”的概念&#xff0c;没有一种方法可以解决每个人问题。 举个例子&#xff0c;面对婆媳矛盾 网上父辈的人 会说 百行孝…...

【Python训练营打卡】day29 @浙大疏锦行

DAY 29 复习日 知识点回顾 1. 类的装饰器 2. 装饰器思想的进一步理解&#xff1a;外部修改、动态 3. 类方法的定义&#xff1a;内部定义和外部定义 作业&#xff1a;复习类和函数的知识点&#xff0c;写下自己过去29天的学习心得&#xff0c;如对函数和类的理解&#xff0c;…...

React 19版本refs也支持清理函数了。

文章目录 前言一、refs 支持清理函数二、案例演示1.useEffect写法2.React 19改进 的ref写法 总结 前言 React 19版本发布了ref支持清理函数了&#xff0c;这样就可以达到useEffect一样的效果了。为啥需要清理函数呢&#xff0c;这是因为节约内存。 清理事件监听&#xff08;避…...

uniapp的适配方式

文章目录 前言✅ 一、核心适配方式对比&#x1f4cf; 二、rpx 单位&#xff1a;uni-app 的核心适配机制&#x1f9f1; 三、默认设计稿适配&#xff08;750宽&#xff09;&#x1f501; 四、字体 & 屏幕密度适配&#x1f6e0; 五、特殊平台适配&#xff08;底部安全区、刘海…...

Java面试场景:从音视频到AI应用的技术探讨

面试场景&#xff1a;音视频与AI应用技术的碰撞 在某互联网大厂的面试中&#xff0c;面试官王先生与求职者明哥展开了一场关于音视频技术与AI应用的对话。 第一轮提问&#xff1a;音视频场景 面试官&#xff1a;明哥&#xff0c;你能谈谈在音视频场景中&#xff0c;Spring B…...

es聚合-词条统计

es语句 ---普通结构----"tags":{"type": "keyword","index": true},GET /knowledge_test/_search {"size": 0,"aggs": {"tag_count": {"terms": {"field": "tags",&quo…...

【沉浸式求职学习day43】【Java面试题精选3】

沉浸式求职学习 1.Java中this和super的区别2.为什么返回类型不算方法重载3.方法重写时需要注意什么问题4.深克隆和浅克隆有什么区别5.如何实现深克隆6.什么是动态代理7.静态代理和动态代理的区别8.如何实现动态代理&#xff1f;9.JDK Proxy 和 CGLib 有什么区别&#xff1f;10.…...

OpenAI推出Codex — ChatGPT内置的软件工程Agents

OpenAI继续让ChatGPT对开发者更加实用。 几天前,他们增加了连接GitHub仓库的支持,可以"Deep Research"并根据你自己的代码提问。 今天,该公司在ChatGPT中推出了Codex的研究预览版,这是迄今为止最强大的AI编码Agent。 它可以编写代码、修复错误、运行测试,并在…...

Win 11开始菜单图标变成白色怎么办?

在使用windows 11的过程中&#xff0c;有时候开始菜单的某些程序图标变成白色的文件形式&#xff0c;但是程序可以正常打开&#xff0c;这个如何解决呢&#xff1f; 这通常是由于快捷方式出了问题&#xff0c;下面跟着操作步骤来解决吧。 1、右键有问题的软件&#xff0c;打开…...

中级统计师-统计学基础知识-第三章 参数估计

统计学基础知识 第三章 参数估计 第一节 统计量与抽样分布 1.1 总体参数与统计量 总体参数&#xff1a;描述总体特征的未知量&#xff08;如均值 μ \mu μ、方差 σ 2 \sigma^2 σ2、比例 π \pi π&#xff09;。统计量&#xff1a;由样本数据计算的量&#xff08;如样本…...

学习黑客HTTP 请求头

HTTP 请求头&#xff08;Request Headers&#xff09;是 HTTP 请求中非常重要的一部分&#xff0c;它们以键值对的形式向服务器传递关于请求的附加信息、客户端的能力或上下文。 理解请求头对于 Web 开发、API 交互、网络调试和安全都至关重要。下面我将常见的 HTTP 请求头字段…...

日志参数含义

一 学习率相关 base_lr&#xff1a;基础学习率&#xff0c;初始设定的学习率 -lr&#xff1a;当前实际使用的学习率&#xff0c;通常是 base_lr 经过学习率调整策略后的值&#xff0c;比如lrbase_lr*(1start_factor) 时间统计 time&#xff1a;每次迭代总时间&#xff0c;单位…...

[Linux]安装吧!我的软件包管理器!

一、常见安装方式 在 Linux 中&#xff0c;有 3 种常见的软件安装方式&#xff1a; &#xff08;1&#xff09;yam、apt &#xff08;2&#xff09;.rpm 安装包安装 &#xff08;3&#xff09;源码安装 二、什么是软件包 在 Linux 下安装软件&#xff0c;通常的办法是下载…...

Flink 作业提交流程

Apache Flink 的 作业提交流程&#xff08;Job Submission Process&#xff09; 是指从用户编写完 Flink 应用程序&#xff0c;到最终在 Flink 集群上运行并执行任务的整个过程。它涉及多个组件之间的交互&#xff0c;包括客户端、JobManager、TaskManager 和 ResourceManager。…...

牛客网NC276110题解:小红的数组重排

牛客网NC276110题解&#xff1a;小红的数组重排 题目解析 算法思路 对数组进行排序&#xff08;非降序&#xff09;检查特殊情况&#xff1a; 如果存在三个连续相等的元素&#xff0c;则无解如果前两个元素都是0&#xff0c;则无解 若不存在特殊情况&#xff0c;则排序后的数…...