Python函数、类和方法

        大家好,当涉及到编写可维护、可扩展且易于测试的代码时,Python提供了一些强大的工具和概念,其中包括函数、类和方法。这些是Python编程中的核心要素,可以帮助我们构建高效的测试框架和可靠的测试用例。

        本文将探讨Python中的函数、类和方法的概念,并介绍它们在测试开发中的重要性和用途。我们将了解它们的基本概念、语法和使用方法,以及如何利用它们来提高代码的可维护性、可测试性和可读性。

首先,让我们从函数开始。

一、函数

        函数是一种在 Python 中定义和封装可重用代码块的结构。它们接受输入参数(可选),执行一系列操作,并返回结果(也可选)。函数在程序中的各个部分之间实现了代码的模块化和重用性,使得代码更加清晰、可维护和可扩展。

1、函数的定义

        在 Python 中,函数的定义以 def 关键字开始,后面跟着函数名、参数列表和冒号。函数体内的代码块缩进表示它们属于函数的一部分。

函数的定义通常遵循以下格式:

def function_name(parameter1, parameter2, ...):# 函数体代码# 可选的返回语句
  • function_name 是函数的名称,应该具有描述性并符合命名规范。
  • parameter1, parameter2, ... 是函数的参数列表,用于接收输入值。参数可以是必需的(必须提供值)或可选的(有默认值)。
  • 函数体内的代码块包含函数的实际操作。它可以包括各种语句、控制结构和其他函数调用。
  • return 语句用于指定函数的返回值。如果没有 return 语句,函数将默认返回 None

2、函数的调用

        函数的调用是通过写出函数名和传递参数来完成的。函数调用将控制转移到函数体内部,执行其中的操作,并根据需要返回结果。

以下是一个简单的函数示例,用于计算两个数的和:

def add_numbers(a, b):sum = a + breturn sumresult = add_numbers(3, 5)
print(result)  # 输出:8

        在这个示例中,我们定义了一个名为 add_numbers 的函数,它接受两个参数 a 和 b。函数体内部将这两个参数相加,并使用 return 语句返回结果。通过调用 add_numbers(3, 5),我们将实际的参数值传递给函数,并将返回的结果赋给 result 变量。最后,我们打印出结果 8

3、函数的参数

        函数可以接受零个或多个参数,用于接收输入值并在函数体内部进行处理。参数可以是必需的或可选的,并且可以有默认值。

  • 必需参数:必需参数在函数调用中是必须提供的。函数体内的操作可以使用这些参数进行计算或处理。
  • 默认参数:默认参数在函数定义中给出了默认值。如果函数调用中没有为这些参数提供值,将使用默认值。
  • 可变参数:有时候,我们不确定函数将接收多少个参数。在这种情况下,可以使用可变参数来接收任意数量的参数。在函数定义中,使用 *args 表示可变参数,它将参数打包成一个元组。
  • 关键字参数:关键字参数允许我们在函数调用中以键值对的形式传递参数。在函数定义中,使用 **kwargs 表示关键字参数,它将参数打包成一个字典。

以下是一个示例函数,演示不同类型的参数:

def example_function(required_param, default_param="default", *args, **kwargs):print("Required parameter:", required_param)print("Default parameter:", default_param)print("Variable arguments:", args)print("Keyword arguments:", kwargs)example_function("Hello")

输出结果如下:

        在这个示例中,example_function 接受一个必需参数 required_param,一个默认参数 default_param(具有默认值 "default"),一个可变参数 args(作为空元组)和一个关键字参数 kwargs(作为空字典)。

4、函数的返回值

        函数可以使用 return 语句返回结果。当函数执行到 return 语句时,它将立即退出函数并返回指定的值。如果没有指定 return 语句,函数将默认返回 None

以下是一个计算阶乘的函数示例,演示函数如何返回结果:

def factorial(n):if n == 0:return 1else:return n * factorial(n - 1)result = factorial(5)
print(result)  # 输出:120

        在这个示例中,factorial 函数使用递归的方式计算给定数的阶乘。如果输入值为 0,函数直接返回 1。否则,它将递归调用自身并返回 n * factorial(n - 1) 的结果。

5、函数的作用域

        函数内部定义的变量具有函数作用域。这意味着它们只在函数内部可见,并且在函数外部不可访问。函数可以访问函数参数、局部变量和全局变量。

以下是一个示例函数,演示变量作用域的概念:

def example_function():local_var = "local"print("Local variable:", local_var)print("Global variable:", global_var)global_var = "global"
example_function()
print("Global variable:", global_var)

输出结果如下:

        在这个示例中,example_function 中定义了一个局部变量 local_var,它在函数内部可见。函数可以访问全局变量 global_var。在函数内部打印局部变量和全局变量的值后,我们在函数外部再次打印全局变量的值。

        函数是 Python 编程中的重要概念,它们提供了代码的封装和重用机制。通过定义函数,我们可以将复杂的操作分解为更小的可管理的部分,并在需要时重复使用它们。函数使代码更加模块化、可读性更高,并且提高了代码的可维护性和可扩展性。

5、Lambda函数

        Lambda函数是一种匿名函数,也称为"lambda表达式"。它是一种简洁的函数定义方式,通常用于需要一个简单函数的地方,而不需要为该函数命名或在其他地方多次使用。

Lambda函数的语法如下:

lambda arguments: expression

        其中,lambda关键字表示定义一个lambda函数,arguments是函数的参数,可以是一个或多个参数,用逗号分隔。expression是函数的表达式,定义了函数的逻辑操作,并返回结果。

Lambda函数具有以下特点:

  1. 匿名性: Lambda函数是匿名的,即没有显式的函数名称。它们适用于需要一个简单函数的场景,而不需要在其他地方多次使用该函数。

  2. 简洁性: Lambda函数的语法非常简洁,可以在一行代码中定义函数,不需要使用def关键字来定义函数。

  3. 单行表达式: Lambda函数通常用于表示单行的表达式,而不是复杂的函数体。这是因为Lambda函数的主要目的是提供一种简洁的方式来定义简单的功能。

使用Lambda函数的常见场景包括:

  1. 函数作为参数: 在函数式编程中,常常需要将函数作为参数传递给其他函数。Lambda函数可以在不定义具体函数的情况下,直接在函数调用时创建一个临时的函数作为参数传递。

  2. 简化代码: 当某个功能只需要一个简单的操作或转换时,使用Lambda函数可以避免定义一个完整的函数,使代码更为简洁。

下面是一些示例来说明Lambda函数的使用:

# 示例 1: Lambda函数用作简单的加法操作
add = lambda x, y: x + y
result = add(3, 5)  # 结果为 8# 示例 2: Lambda函数用作列表排序的键函数
students = [{"name": "Alice", "age": 20},{"name": "Bob", "age": 18},{"name": "Charlie", "age": 22}
]
students.sort(key=lambda student: student["age"])  # 按照年龄排序# 示例 3: Lambda函数用作map函数的参数
numbers = [1, 2, 3, 4, 5]
squared = list(map(lambda x: x**2, numbers))  # 对列表中的每个元素进行平方操作

        需要注意的是,尽管Lambda函数在某些情况下能够简化代码,但过度使用Lambda函数可能会导致代码变得难以理解和维护。对于复杂的函数逻辑或需要多次复用的函数,建议使用传统的函数定义方式(使用def关键字)来提高代码的可读性和可维护性。

6、使用函数的注意事项

        在使用函数时,有一些需要注意的点,以确保函数的正确性和可维护性。以下是一些主要的注意事项:

  1. 函数的命名和命名规范:为函数选择一个描述性的名称,能够清晰地表达其功能和目的。遵循命名规范,使用小写字母和下划线来分隔单词,以提高代码的可读性和一致性。

  2. 函数的参数传递:函数的参数传递可以是按值传递(对于不可变对象)或按引用传递(对于可变对象)。理解参数传递的方式对于正确处理函数内部的变量和外部变量非常重要。

  3. 函数的文档字符串:为函数提供文档字符串(docstring)是良好的编程习惯。文档字符串应该清楚地描述函数的功能、参数、返回值和使用方法,以便其他开发人员能够理解和正确使用函数。

  4. 函数的返回值:确保函数按照预期返回正确的结果。根据函数的设计,确定是否需要返回一个值,以及返回的类型和格式。

  5. 函数的副作用:函数的副作用是指函数对于函数外部的状态或变量进行了修改。在函数设计中,需要明确函数是否具有副作用,并清楚地记录和管理这些副作用,以避免意外的行为或数据损坏。

  6. 函数的异常处理:在函数内部,应该考虑可能发生的异常情况,并适当地处理这些异常。可以使用 try-except 块来捕获和处理异常,以确保函数在出现问题时具有适当的行为。

  7. 函数的测试和调试:在使用函数之前,应该对函数进行充分的测试和调试,以确保其行为符合预期。编写测试用例来覆盖不同的情况和边界条件,并验证函数的输出是否正确。

  8. 函数的可读性和可维护性:编写清晰、简洁和易于理解的函数是很重要的。遵循良好的编码规范,使用适当的缩进、注释和命名约定,以提高函数的可读性和可维护性。

  9. 函数的设计原则:了解和遵循函数设计原则,如单一责任原则(SRP)和开放封闭原则(OCP),以确保函数具有良好的模块化和可扩展性。

  10. 函数的性能考虑:对于需要频繁调用的函数或处理大量数据的函数,需要考虑其性能。优化函数的算法和数据结构,避免不必要的计算和内存消耗,以提高函数的性能。

        使用函数时需要注意函数的命名、参数传递、文档字符串、返回值、副作用、异常处理、测试和调试、可读性和可维护性、设计原则以及性能等方面。遵循这些注意事项可以提高代码的质量、可靠性和可维护性,同时提升开发效率。

二、方法和类

        在Python中,类(Class)是一种面向对象编程的基本概念,用于创建对象的蓝图或模板。类定义了对象的属性(变量)和行为(方法),以及对象之间的关系。类的定义使用关键字class,后跟类的名称,通常采用驼峰命名法。类中可以包含属性和方法。

        属性(Attributes)是类中的变量,用于存储对象的状态或特征。属性可以是类级别的(类属性)或实例级别的(实例属性)。类属性是类的所有实例共享的,而实例属性是每个对象独立拥有的。

        方法(Methods)是类中的函数,用于定义对象的行为或操作。方法可以访问和操作类的属性,也可以接受参数。类中的方法分为实例方法、类方法和静态方法。

1、方法

实例方法(Instance Methods)

        实例方法是最常用的方法类型。它们在类中定义,并且在对象级别上进行操作。实例方法的第一个参数通常是self,表示对当前实例的引用。

class MyClass:def instance_method(self, arg1, arg2):# 方法体pass

类方法(Class Methods)

        类方法是与整个类相关联的方法。它们使用@classmethod装饰器进行定义,并在方法的第一个参数中接受类对象,通常命名为cls。类方法可以访问类属性,并且可以通过类调用。

class MyClass:@classmethoddef class_method(cls, arg1, arg2):# 方法体pass

静态方法(Static Methods)

        静态方法与类和实例无关,也不访问类或实例的属性。它们使用@staticmethod装饰器进行定义,不需要传递额外的参数。

class MyClass:@staticmethoddef static_method(arg1, arg2):# 方法体pass

2、类

        在类中,还可以定义特殊的方法,称为魔术方法(Magic Methods)或特殊方法(Special Methods),这些方法具有特殊的名称和用途,用于定义类的行为和操作,如构造函数、析构函数、运算符重载等。

        例如,构造函数__init__是一个特殊方法,用于在创建对象时进行初始化操作。析构函数__del__用于在对象被销毁时执行清理操作。运算符重载方法如__add__用于定义对象的加法操作。

class MyClass:def __init__(self, arg1, arg2):# 构造函数passdef __del__(self):# 析构函数passdef __add__(self, other):# 加法运算符重载pass

类的使用一般涉及以下步骤:

  1. 创建类的实例(对象):使用类名后跟括号,可以传递参数给构造函数。
  2. 访问对象的属性:使用点号(.)操作符访问对象的属性。
  3. 调用对象的方法:使用点号操作符调用对象的方法。

下面是一个简单的类的示例:

class Car:def __init__(self, brand, color):self.brand = brandself.color = colordef start_engine(self):print(f"The {self.color} {self.brand} car is starting the engine.")# 创建Car类的实例
my_car = Car("Toyota", "red")# 访问对象的属性
print(my_car.brand)  # 输出: Toyota
print(my_car.color)  # 输出: red# 调用对象的方法
my_car.start_engine()  # 输出: The red Toyota car is starting the engine.

通过类,我们可以创建多个对象实例,并且每个实例都拥有自己的属性值和可以调用的方法。

3、类属性

        类属性是属于类本身的属性,而不是属于类的实例的属性。它们在所有类的实例之间共享,并且可以通过类名或实例对象访问。

定义类属性

  • 类属性可以在类的定义中直接声明,并且位于任何方法之外。
  • 类属性通常在类的构造函数(__init__方法)之外定义,以便它们在所有实例之间共享。
  • 类属性可以是任何有效的Python对象,如整数、字符串、列表等。
class MyClass:class_attribute = "Hello, I am a class attribute!"

访问类属性

  • 类属性可以通过类名直接访问,也可以通过实例对象访问。
  • 当通过类名访问类属性时,使用点号运算符(.)来引用类属性。
  • 当通过实例对象访问类属性时,实例会首先查找实例属性,如果找不到,则会查找并访问类属性。
print(MyClass.class_attribute)  # 输出: Hello, I am a class attribute!obj = MyClass()
print(obj.class_attribute)  # 输出: Hello, I am a class attribute!

修改类属性

  • 类属性可以通过类名进行修改,修改后会影响所有实例。
  • 当通过实例对象修改类属性时,实际上是创建了一个新的实例属性,不会修改类属性。
MyClass.class_attribute = "Modified class attribute"
print(MyClass.class_attribute)  # 输出: Modified class attributeobj.class_attribute = "New instance attribute"
print(obj.class_attribute)  # 输出: New instance attribute
print(MyClass.class_attribute)  # 输出: Modified class attribute

类属性的应用

  • 类属性通常用于存储与类相关的常量或共享数据。
  • 它们可以作为类的默认值或配置选项,供所有实例共享。
  • 类属性可以在类的方法中使用,以提供类级别的行为。
class Circle:pi = 3.14159def __init__(self, radius):self.radius = radiusdef calculate_area(self):return Circle.pi * self.radius * self.radiuscircle1 = Circle(5)
circle2 = Circle(3)print(circle1.calculate_area())  # 输出: 78.53975
print(circle2.calculate_area())  # 输出: 28.27431

在使用类属性时,需要注意以下几点:

  • 当实例对象访问类属性时,如果实例没有同名的实例属性,它将使用类属性的值。
  • 如果通过实例对象修改类属性,实际上是创建了一个新的实例属性,不会修改类属性本身。
  • 如果通过类名修改类属性,所有实例将反映出该修改。

        类属性是属于类的属性,可以在类的所有实例之间共享。它们在类的定义中声明,可以通过类名或实例对象访问。类属性通常用于存储与类相关的常量或共享数据,并可在类的方法中使用以提供类级别的行为。

4、类的继承

        当涉及到类的继承时,一个类可以从另一个类继承属性和方法。被继承的类称为基类或父类,继承它的类称为派生类或子类。子类可以继承父类的属性和方法,并且可以添加自己的属性和方法。

        在Python中,类的继承使用圆括号指定基类的名称,放在派生类的类定义中。派生类可以访问基类的属性和方法,通过调用super()函数。

下面是一个继承的示例:

class Vehicle:def __init__(self, brand):self.brand = branddef start_engine(self):print(f"The {self.brand} vehicle is starting the engine.")class Car(Vehicle):def __init__(self, brand, color):super().__init__(brand)self.color = colordef start_engine(self):super().start_engine()print(f"The {self.color} {self.brand} car is also starting the engine.")# 创建Car类的实例
my_car = Car("Toyota", "red")# 访问继承的属性
print(my_car.brand)  # 输出: Toyota
print(my_car.color)  # 输出: red# 调用继承的方法
my_car.start_engine()
# 输出:
# The Toyota vehicle is starting the engine.
# The red Toyota car is also starting the engine.

        在上面的示例中,Vehicle类是基类,Car类是派生类。Car类继承了Vehicle类的属性和方法。派生类的构造函数使用super()函数调用基类的构造函数,以便在初始化派生类对象时执行基类的初始化逻辑。

        派生类可以重写(覆盖)继承的方法,以改变其行为。在示例中,Car类重写了start_engine()方法,并使用super().start_engine()调用基类的同名方法,以保留基类的行为。

        此外,Python还支持多重继承,其中一个类可以从多个基类继承。多重继承使得一个类可以具有多个父类的属性和方法。在类定义中,可以在圆括号中指定多个基类的名称,并用逗号分隔。

下面是一个多重继承的示例:

class Animal:def __init__(self, name):self.name = namedef speak(self):passclass Dog(Animal):def speak(self):return "Woof!"class Cat(Animal):def speak(self):return "Meow!"class DogCat(Dog, Cat):pass# 创建DogCat类的实例
my_pet = DogCat("Tom")# 调用继承的方法
print(my_pet.speak())  # 输出: Woof!

        在上面的示例中,Animal类是基类,DogCat类分别继承了Animal类。然后,DogCat类从DogCat类多重继承。DogCat类继承了DogCat类的name属性和speak()方法,并且可以调用my_pet.speak()来获取"Woof!"的输出。

通过继承和多重继承,可以构建更复杂和灵活的类层次结构,并实现代码的重用和扩展。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/15382.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

大语言模型的工程技巧(三)——分布式计算

相关说明 这篇文章的大部分内容参考自我的新书《解构大语言模型:从线性回归到通用人工智能》,欢迎有兴趣的读者多多支持。 本文将讨论如何利用多台机器进行神经网络的分布式训练。利用多台机器来加速大语言模型的训练,是其获得成功的重要原…

BUUCTF靶场[Web] [极客大挑战 2019]Havefun1、[HCTF 2018]WarmUp1、[ACTF2020 新生赛]Include

[web][极客大挑战 2019]Havefun1 考点:前端、GET传参 点开网址,发现是这个界面 点击界面没有回显,老规矩查看源代码,看到以下代码 代码主要意思为: 用get传参,将所传的参数给cat,如果catdog…

Linux基础(五):常用基本命令

从本节开始,我们正式进入Linux的学习,通过前面的了解,我们知道我们要以命令的形式使用操作系统(使用操作系统提供的各类命令,以获得字符反馈的形式去使用操作系统。),因此,我们是很有…

【全开源】点餐小程序系统源码(ThinkPHP+FastAdmin+UniApp)

基于ThinkPHPFastAdminUniApp开发的点餐微信小程序,类似肯德基,麦当劳,喜茶等小程序多店铺模式,支持子商户模式,提供全部前后台无加密源代码和数据库,支持私有化部署。 革新餐饮行业的智慧点餐解决方案 一…

【vue-6】监听

一、监听watch 完整示例代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Documen…

【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 一、16QAM调制原理 在16QAM&#xff08;16 Quadrature Amplitude Modulation&#xff09;调制中&#xff0c;一个符号表示4个比特的数据。这种调制方式结合了幅度调制和相位调制&#xff0c;能够在相同的频谱资源下传输更多…

EEGLAB的相关使用

目录 概念 1.安装EEGLAB 2.文件实例演示 导入数据集处理 &#xff08;1&#xff09;导入数据集 &#xff08;2&#xff09;画图 &#xff08;3&#xff09; 修改并存储数据集 &#xff08;4&#xff09; 保存数据集 &#xff08;5&#xff09; 删除数据集 &#xff0…

技术前沿 |【BLIP:统一理解和生成的自举多模态模型研究】

BLIP&#xff1a;统一理解和生成的自举多模态模型研究 摘要引言一、BLIP模型概述二、 BLIP模型在多模态任务中的应用三、总结 摘要 本文介绍了BLIP&#xff08;Bootstrapping Language-Image Pre-training&#xff09;模型&#xff0c;一个前沿的多模态模型&#xff0c;通过自…

散列(哈希)及其练习题(基础)

目录 散列 字符出现次数 力扣经典题&#xff1a;两数之和 集合运算 交 并 差 字符串的出现次数 散列 导入&#xff1a; 有N个数和M个数&#xff0c;如何判断M个数中每个数是否在N中出现&#xff1f; 思想&#xff1a;空间换时间 创建hashtable&#xff0c;以N个数本…

图_基础算法

图这种数据结构还有一些比较特殊的算法&#xff0c;比如二分图判断&#xff0c;有环图无环图的判断&#xff0c;拓扑排序&#xff0c;以及最经典的最小生成树&#xff0c;单源最短路径问题&#xff0c;更难的就是类似网络流这样的问题。 先看拓扑排序&#xff08;有环无环&…

【linux性能分析】heaptrack分析内存占用

文章目录 1. Heaptrack是什么2. Heaptrack有哪些功能3. Heaptrack和valgrind massif对比4. Heaptrack安装5. Heaptrack生成追踪文件6. heaptrack_gui进行内存分析7. heaptrack_print也能用于堆分析8. 报错解决9. 补充介绍&#xff1a;heaptrack编译安装 1. Heaptrack是什么 he…

内网穿透--Spp-特殊协议-上线

免责声明:本文仅做技术交流与学习... 目录 spp项目: 一图通解: 1-下载spp 2-服务端执行命令 3-客户端执行命令 4-服务端cs监听&生马 spp项目: GitHub - esrrhs/spp: A simple and powerful proxy 支持的协议&#xff1a;tcp、udp、udp、icmp、http、kcp、quic 支持的…

Java开发者必知的时间处理工具:SimpleDateFormat类详解

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

小红书云原生 Kafka 技术剖析:分层存储与弹性伸缩

面对 Kafka 规模快速增长带来的成本、效率和稳定性挑战时&#xff0c;小红书大数据存储团队采取云原生架构实践&#xff1a;通过引入冷热数据分层存储、容器化技术以及自研的负载均衡服务「Balance Control」&#xff0c;成功实现了集群存储成本的显著降低、分钟级的集群弹性迁…

[图解]SysML和EA建模住宅安全系统-07 to be块定义图

1 00:00:01,970 --> 00:00:05,040 入侵者这里有个∞ 2 00:00:05,530 --> 00:00:07,000 说明它下面已经有子图了 3 00:00:07,010 --> 00:00:08,080 我们看看里面子图 4 00:00:10,200 --> 00:00:17,000 这里&#xff0c;我们看位置 5 00:00:19,030 --> 00:00:…

Vitis HLS 学习笔记--抽象并行编程模型-不良示例

目录 1. 简介 2. 基础 kernel 2.1 pass kernel 2.2 double_pass kernel 2.3 add_kernel 2.4 split kernel 3. 三种bypass 3.1 input_bypass 3.2 middle_bypass 3.3 output_bypass 4. 总结 1. 简介 本文展示三个在数据流水线中常见的问题&#xff1a; 输入参数绕过…

chatgpt线性差值 将直线渐变颜色

color(x)(x-x1)/(x2-x1) 与gpt给出的 这个位置比例可以表示为d/L是概念相同 x-x1是计算当前点距离起点距离&#xff0c;x2-x1是计算长度 例如&#xff0c;如果我们在直线上距离起点A的距离为d&#xff0c;整条直线的长度为L 用数学方式解释 2024/5/25 18:54:30 当我们要在一…

vue+echart :点击趋势图中的某一点或是柱状图,出现弹窗,并传输数据

样式 在趋势图中点击某一个柱状图&#xff0c;出现下面的弹窗 代码实现 主要是在趋势图页面代码中&#xff0c;在初始化趋势图的设置中&#xff0c;添加对趋势图监听的点击方法 drawChart() {const chartData this.chartData;let option {};if (!chartData.xData?.len…

Swift 类和结构体

类和结构体 一、结构体和类对比1、类型定义的语法2、结构体和类的实例3、属性访问4、结构体类型的成员逐一构造器 二、结构体和枚举是值类型三、类是引用类型1、恒等运算符2、指针 结构体和类作为一种通用而又灵活的结构&#xff0c;成为了人们构建代码的基础。你可以使用定义常…

python mp3转mp4工具

成品UI 安装moviepy库 pip install moviepy 转换demo from moviepy.editor import *# 创建一个颜色剪辑&#xff0c;时长与音频相同 audioclip AudioFileClip(r"C:\Users\Administrator\PycharmProjects\pythonProject44\test4\赵照 - 灯塔守望人.mp3") videoclip…