DAY30 函数专题1:函数定义与参数

前言:今天主要是完成了关于函数定义与参数的5个题目从中都有不一样的收获!

一、题目1:计算圆的面积

  1. 任务:编写一个名为calculate_circle_area的函数,该函数接收圆的半径radius作为参数,并返回圆的面积。圆的面积=Π*radius^2(可以使用math.pi作为Π的值)

  2. 要求:函数接收一个位置参数radius。计算半径为5、0、-1时候的面积

  3. 注意点:可以采取try-except使函数变得更加稳健,如果传入的半径为负数,函数应该返回0(或者可以考虑引发一个ValueError)。

代码:

python 复制代码
import math
def cal_circle_area(r):
    try:
        if r < 0 :
            return 0
        else:
            area = math.pi*(r**2)
        return area
    except TypeError:
        print(f"ValueError")

#测试
test_r = [5,0,-1]
print("计算不同半径圆的面积")
print("-" * 30)

for r in test_r:
    area = cal_circle_area(r)
    print(f"半径 = {r},面积 = {area}")

test_e = "a"
area_e = cal_circle_area(test_e)

运行结果:

思考:

书写思路

  1. 先引入所需要的库

  2. 再定义函数,并给定相关参数

  3. 在函数中采用try: except TypeError:结构 在try中进行数值类型判断并实现功能,在except TypeError:结构中给出错误情况转入的方向避免程序卡死,数据丢失

  4. 定义相关变量,对函数进行调用

二、题目2:计算矩形的面积

  1. 任务:编写一个名为calculate_rectangle_area的函数,该函数接收矩形的度length和宽度width作为参数,并返回矩形的面积。

  2. 公式:矩形面积=length*width

  3. 要求:函数接收两个位置参数length和width。

(1)函数返回计算得到的面积。

(2)如果长度或宽度为负数,函数应该返回0。

代码:

python 复制代码
def calculate_rectangle_area(length,width):
    try:
        if length < 0 or width < 0:
            return 0 
        else:
            area = length * width
            return area
    except TypeError:
            print(f"ValueError")

test_case = [(3,2),
             (3,0),
             (0,3),
             (0,0),
             (-1,5),
             (1.5,2)
]

print("计算不同长宽矩形的面积")
print("-" * 30)

for length , width in test_case:
    area = calculate_rectangle_area(length,width)
    print(f"长度 = {length}, 宽度 = {width}, 面积 = {area}")

运行结果:

思考:

此题目与题目一最大的区别在于,此题目的参数要传两个,故我们采用元组列表(list of tuples)来对相关测试变量进行存贮。

三、 题目3:计算任意数量数字的平均值

  1. 任务:编写一个名为calculate_average的函数,该函数可以接收任意数量的数字作为参数(引入可变位置参数(*args)),并返回它们的平均值。

  2. 要求:使用*args来接收所有传入的数字。

(1)、如果没有任何数字传入,函数应该返回0。

(2)、函数返回计算得到的平均值。

代码:

python 复制代码
def calculate_average(*args):
    """
    计算任意数量数字的平均值
    
    参数:
    *args: 可变数量的数值参数
    
    返回:
    所有数字的平均值。如果没有传入任何数字,返回0
    """
    # 检查是否传入了数字
    if len(args) == 0:
        return 0
    
    try:
        # 计算总和
        total = sum(args)
        
        # 计算平均值
        average = total / len(args)
        return average
        
    except (TypeError, ZeroDivisionError):
        # 处理可能的异常(虽然len(args)!=0时不会除零)
        return 0

# 测试函数
print("测试计算平均值函数:")
print("-" * 30)

# 测试用例
test_cases = [
    (1, 2, 3, 4, 5),      # 多个整数
    (10, 20, 30),         # 三个数
    (3.5, 4.5, 5.5),      # 小数
    (7,),                 # 只有一个数
    (),                   # 没有参数
    (0, 0, 0, 0),         # 全是0
    (-1, 0, 1),           # 包含负数
    (2.2, 3.3, 4.4, 5.5)  # 多个小数
]

# 2. enumerate(test_cases, 1)的作用:
# enumerate()函数会同时返回索引和元素值。
# enumerate(test_cases, 1) 相当于:
# 1, (1, 2, 3, 4, 5)
# 2, (10, 20, 30)
# 3, (3.5, 4.5, 5.5)
# 4, (7,)
# 5, ()
# 6, (-1, 0, 1)


for i, numbers in enumerate(test_cases, 1):
    result = calculate_average(*numbers)
    
    if len(numbers) == 0:
        print(f"测试{i}: 无参数传入, 平均值 = {result}")
    else:
        print(f"测试{i}: 数字 {numbers}, 平均值 = {result:.4f}")

运行结果:

思考:

此函数的参数使用 *args可接收任意数量的参数!

四、题目4 :打印用户信息

  1. 任务:编写一个名为print_user_info的函数,该函数接收一个必需的参数user_id,以及任意数量的额外用户信息(作为关键字参数)。

  2. 要求:

(1)user_id是一个必需的位置参数。

(2)使用**kwargs来接收额外的用户信息。

(3)函数打印出用户ID,然后逐行打印所有提供的额外信息(键和值)。

(4)函数不需要返回值

代码:

python 复制代码
# **kwargs:可变关键字参数,接收任意数量的键值对
# 在函数内部,kwargs是一个字典 可以像操作字典一样访问:kwargs.items(), kwargs.keys(), kwargs.values()
def print_user_info(user_id, **kwargs):
    """
    打印用户信息
    
    参数:
    user_id: 必需的用户ID(位置参数)
    **kwargs: 任意数量的关键字参数,包含额外用户信息
    """
    # 打印用户ID
    print(f"用户ID: {user_id}")
    
    # 打印额外信息(如果有的话)
    if kwargs:
        print("额外信息:")
        # 逐行打印所有关键字参数
        for key, value in kwargs.items():
            print(f"  {key}: {value}")
    else:
        print("无额外信息")
    
    # 函数不需要返回值,所以不写return语句或只写return

# 测试函数
print("=== 测试1: 只有用户ID ===")
print_user_info("A001")

print("\n=== 测试2: 有额外信息 ===")
print_user_info("B002", name="张三", age=25, city="北京")

print("\n=== 测试3: 多个额外信息 ===")
print_user_info("C003", 
                name="李四", 
                age=30, 
                email="lisi@example.com", 
                department="技术部", 
                phone="13800138000")

运行结果:

思考:

**kwargs的特点:

1、接收任意数量的关键字参数

2、在函数内部,kwargs是一个字典

3、可以像操作字典一样访问:kwargs.items(), kwargs.keys(), kwargs.values()

五、题目五:格式化几何图形描述

  1. 任务:编写一个名为describe_shape的函数,该函数接收图形的名称shape_name(必需),一个可选的color(默认"black"),以及任意数量的描述该图形尺寸的关键字参数(例如radius=5对于圆,length=10,width=4对于矩形.)

  2. 要求:shape_name是必需的位置参数。

(1)ocolor是一个可选参数,默认值为"black"。

(2)使用**kwargs收集描述尺寸的参数。

(3)函数返回一个描述字符串

python 复制代码
def describe_shape(shape_name, color="black", **kwargs):
    """
    格式化几何图形描述
    
    参数:
    shape_name: 必需的位置参数,图形名称
    color: 可选参数,颜色,默认为"black"
    **kwargs: 描述图形尺寸的关键字参数
    
    返回:
    描述字符串
    """
    # 基础描述部分
    description = f"A {color} {shape_name}"
    
    # 尺寸描述部分
    if kwargs:
        # 如果有尺寸参数
        dimensions = []
        for key, value in kwargs.items():
            dimensions.append(f"{key}={value}")
        dimensions_str = ", ".join(dimensions)
        description += f" with dimensions: {dimensions_str}."
    else:
        # 如果没有尺寸参数
        description += " with no specific dimensions."
    
    return description


# 测试函数
print("=== 测试 describe_shape 函数 ===")
print("-" * 40)

# 测试1: 有尺寸参数的圆
circle_desc1 = describe_shape("circle", color="red", radius=5)
print(f"测试1: {circle_desc1}")

# 测试2: 有多个尺寸参数的矩形
rectangle_desc = describe_shape("rectangle", color="blue", length=10, width=4, height=2)
print(f"测试2: {rectangle_desc}")

# 测试3: 使用默认颜色
triangle_desc = describe_shape("triangle", side1=3, side2=4, side3=5)
print(f"测试3: {triangle_desc}")

# 测试4: 没有尺寸参数
square_desc = describe_shape("square", color="green")
print(f"测试4: {square_desc}")

# 测试5: 多个参数组合
pentagon_desc = describe_shape("pentagon", "yellow", side=7, apothem=4.8)
print(f"测试5: {pentagon_desc}")

# 测试6: 只有必需参数
shape_desc = describe_shape("hexagon")
print(f"测试6: {shape_desc}")

运行结果:

@浙大疏锦行

相关推荐
SiYuanFeng34 分钟前
Colab复现 NanoChat:从 Tokenizer(CPU)、Base Train(CPU) 到 SFT(GPU) 的完整踩坑实录
python·colab
炸炸鱼.1 小时前
Python 操作 MySQL 数据库
android·数据库·python·adb
_深海凉_2 小时前
LeetCode热题100-颜色分类
python·算法·leetcode
AC赳赳老秦2 小时前
OpenClaw email技能:批量发送邮件、自动回复,高效处理工作邮件
运维·人工智能·python·django·自动化·deepseek·openclaw
zhaoshuzhaoshu3 小时前
Python 语法之数据结构详细解析
python
AI问答工程师3 小时前
Meta Muse Spark 的"思维压缩"到底是什么?我用 Python 复现了核心思路(附代码)
人工智能·python
zfan5204 小时前
python对Excel数据处理(1)
python·excel·pandas
小饕4 小时前
我从零搭建 RAG 学到的 10 件事
python
老歌老听老掉牙4 小时前
PyQt5+Qt Designer实战:可视化设计智能参数配置界面,告别手动布局时代!
python·qt
格鸰爱童话5 小时前
向AI学习项目技能(六)
java·人工智能·spring boot·python·学习