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

软件测试基础十三(python 函数)

函数

1. 函数的意义

  1. 代码复用
    • 提高效率:Python中的函数允许将一段可重复使用的代码封装起来。例如,在一个数据分析项目中,可能需要多次计算一组数据的平均值。可以将计算平均值的代码定义为一个函数:
def calculate_average(num_list):return sum(num_list) / len(num_list)
      • 之后,无论在程序的哪个位置需要计算平均值,只要有合适的数据列表,就可以直接调用这个函数,而不需要每次都重新编写计算平均值的代码。这样可以大大提高代码编写的效率。
    • 减少代码冗余:假设在一个Web应用程序中,需要对用户输入的多个表单数据进行验证,检查是否为合法的电子邮件地址。如果不使用函数,可能需要在每个验证表单数据的地方都编写相同的验证代码。而通过定义一个函数来验证电子邮件地址,可以避免这种冗余:
import redef validate_email(email):pattern = r'^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$'return re.match(pattern, email) is not None
      • 这样,在程序的任何需要验证电子邮件的地方,都可以调用validate_email函数,使代码更加简洁和易于维护。
  1. 逻辑抽象与模块化
    • 隐藏实现细节:函数可以将复杂的逻辑封装起来,只暴露必要的接口。例如,在一个机器学习项目中,可能有一个复杂的算法用于训练模型。可以将训练模型的过程封装在一个函数中:
def train_model(data, model_type):# 复杂的模型训练代码,包括数据预处理、选择算法、训练等步骤if model_type == "linear_regression":# 线性回归模型训练代码passelif model_type == "decision_tree":# 决策树模型训练代码pass#...return trained_model
      • 对于调用train_model函数的其他部分代码,不需要了解模型训练的具体细节,如数据如何预处理、具体的算法实现等。只需要提供合适的数据和模型类型,就可以得到训练好的模型。
    • 便于代码组织和理解:当程序规模较大时,将代码划分为多个函数可以使程序结构更加清晰。例如,在一个游戏开发项目中,可以将游戏的初始化、游戏循环、玩家操作处理等功能分别封装在不同的函数中:
def initialize_game():# 初始化游戏资源,如加载地图、创建角色等passdef game_loop():# 游戏主循环,包括更新游戏状态、渲染画面等passdef handle_player_actions():# 处理玩家的操作,如移动、攻击等pass
      • 这种模块化的代码结构使得开发人员更容易理解每个部分的功能,也便于多人协作开发,不同的开发人员可以负责不同的函数模块。
  1. 参数化与灵活性
    • 根据不同输入执行不同操作:函数可以接受参数,根据传入的参数值执行不同的操作。例如,一个绘图函数可以根据传入的参数绘制不同形状和颜色的图形:
import matplotlib.pyplot as pltdef draw_shape(shape_type, color):if shape_type == "circle":circle = plt.Circle((0.5, 0.5), 0.3, color=color)plt.gca().add_patch(circle)elif shape_type == "square":square = plt.Rectangle((0.3, 0.3), 0.4, 0.4, color=color)plt.gca().add_patch(square)plt.axis('equal')plt.show()
      • 调用draw_shape函数时,可以传入不同的形状类型(如"circle""square")和颜色参数,函数就会根据这些参数绘制出相应的图形。
    • 方便代码调试和测试:由于函数具有明确的输入和输出,在调试和测试代码时更加方便。可以针对单个函数进行单元测试,检查其对于不同输入的输出是否符合预期。例如,对于上面的calculate_average函数,可以编写如下的单元测试:
assert calculate_average([1, 2, 3]) == 2
assert calculate_average([4, 5, 6]) == 5
      • 通过这种方式,可以确保函数的正确性,并且在函数出现问题时更容易定位和修复错误。

2. 函数的定义和调用

  1. 定义函数
    • 使用def关键字来定义一个函数。函数定义包括函数名、参数列表和函数体。
    • 例如:
def greet():print("Hello!")
    • 这里定义了一个名为greet的函数,它没有参数,函数体中只是打印了“Hello!”。
  1. 调用函数
    • 通过函数名后跟括号来调用函数。
    • 例如:greet()会执行上面定义的greet函数,输出“Hello!”。

3. 函数的参数

  1. 实参和形参
    • 形参(形式参数):在函数定义中,出现在函数名后的括号里的变量名,用于接收调用函数时传入的值。
    • 实参(实际参数):在调用函数时,传递给函数的具体值。
    • 例如:
def add(a, b):return a + bresult = add(3, 5)
    • 这里ab是形参,35是实参。
  1. 缺省参数(默认参数)
    • 在函数定义时,可以为参数指定一个默认值。如果在调用函数时没有为该参数提供值,就会使用默认值。
    • 例如:
def greet(name="World"):print(f"Hello, {name}!")greet()  # 输出 "Hello, World!"
greet("Alice")  # 输出 "Hello, Alice!"

4. 返回值

  1. 使用return语句返回值
    • 函数可以使用return语句返回一个值或多个值。如果没有return语句,函数默认返回None
    • 例如:
def add(a, b):return a + bresult = add(3, 5)
print(result)  # 输出 8
  1. 返回多个值
    • 可以使用元组来返回多个值。
    • 例如:
def calculate(a, b):sum_result = a + bproduct_result = a * breturn sum_result, product_resultsum_value, product_value = calculate(3, 5)
print(sum_value)  # 输出 8
print(product_value)  # 输出 15

5. 函数嵌套调用

  1. 概念
    • 一个函数可以在其内部调用另一个函数。
    • 例如:
def add(a, b):return a + bdef multiply(a, b):return a * bdef calculate(a, b):sum_result = add(a, b)product_result = multiply(a, b)return sum_result, product_resultresult = calculate(3, 5)
print(result)  # 输出 (8, 15)

6. 变量的作用域

  1. 局部变量
    • 在函数内部定义的变量称为局部变量,它们只能在函数内部访问。
    • 例如:
def my_function():x = 10print(x)my_function()  # 输出 10
# print(x)  # 这里会报错,因为 x 是局部变量,在函数外部无法访问
  1. 全局变量
    • 在函数外部定义的变量称为全局变量,它们可以在整个程序中访问。
    • 例如:
x = 10def my_function():print(x)my_function()  # 输出 10
    • 如果在函数内部要修改全局变量的值,需要使用global关键字进行声明。
    • 例如:
x = 10def my_function():global xx = 20print(x)my_function()  # 输出 20
print(x)  # 输出 20

7. 匿名函数(lambda 函数)

  1. 定义和使用
    • 匿名函数是一种没有名称的函数,通常使用lambda关键字来定义。
    • 例如:
add = lambda a, b: a + b
result = add(3, 5)
print(result)  # 输出 8
    • 这里定义了一个匿名函数,它接受两个参数ab,并返回它们的和。
  1. 应用场景
    • 匿名函数通常用于一些简单的操作,特别是作为参数传递给其他函数时非常方便。
    • 例如,sorted()函数可以接受一个key参数,用于指定排序的依据。可以使用匿名函数来定义这个依据。
    • 例如:
my_list = [(1, 2), (3, 1), (2, 3)]
sorted_list = sorted(my_list, key=lambda x: x[1])
print(sorted_list)  # 输出 [(3, 1), (1, 2), (2, 3)]

总之,函数是 Python 编程中的重要概念,掌握函数的定义、调用、参数、返回值、嵌套调用、变量作用域和匿名函数等内容,可以使程序更加模块化、可维护和可扩展。

http://www.lryc.cn/news/479112.html

相关文章:

  • 计算机网络——HTTP篇
  • 信息化运维方案,实施方案,开发方案,信息中心安全运维资料(软件资料word)
  • 自动化工具 Gulp
  • css实现div被图片撑开
  • Power Pivot、Power BI 和 SQL Server Analysis Services 的公式语言:DAX(数据分析表达式)
  • 大模型应用编排工具Dify二开之工具和模型页面改造
  • Pytorch用BERT对CoLA、新闻组文本数据集自然语言处理NLP:主题分类建模微调可视化分析...
  • LightGBM-GPU不能装在WSL,能装在windows上
  • 工业相机常用功能之白平衡及C++代码分享
  • Foundry 单元测试
  • idea database连接数据库后看不到表解决方法、格式化sql快捷键
  • 【数学二】线性代数-向量-向量组的秩、矩阵得秩
  • ABAP开发-内存管理
  • 【Ajax】跨域
  • yii 常用一些调用
  • 网页版五子棋——用户模块(服务器开发)
  • 以RK3568为例,ARM核心板如何实现NTP精准时间同步?
  • Twitter(X)2024最新注册教程
  • 10.桥接模式设计思想
  • Java多线程详解⑤(全程干货!!!)线程安全问题 || 锁 || synchronized
  • (已解决)Dependency “ ” not found 细谈
  • 网络编程、UDP、TCP、三次握手、四次挥手
  • 程序员的生活周刊 #7:耐克总裁被裁记
  • sparkSQL的UDF,最常用的regeister方式自定义函数和udf注册方式定义UDF函数 (详细讲解)
  • 【Ubuntu20】VSCode Python代码规范工具配置 Pylint + Black + MyPy + isort
  • 游戏提示错误:xinput1_3.dll缺失?四种修复错误的xinput1_3.dll文件
  • YOLOv11融合IncepitonNeXt[CVPR2024]及相关改进思路
  • [Web安全 网络安全]-学习文章汇总导航(持续更新中)
  • Docker Compose部署Rabbitmq(Docker file安装延迟队列)
  • SpringBoot+FileBeat+ELK8.x版本收集日志