Python函数、类和方法

news2024/11/17 19:31:03

        大家好,当涉及到编写可维护、可扩展且易于测试的代码时,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 + b
    return sum

result = 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 1
    else:
        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:
    @classmethod
    def class_method(cls, arg1, arg2):
        # 方法体
        pass

静态方法(Static Methods)

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

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

2、类

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

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

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

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

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

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

class Car:
    def __init__(self, brand, color):
        self.brand = brand
        self.color = color
    
    def 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 attribute

obj.class_attribute = "New instance attribute"
print(obj.class_attribute)  # 输出: New instance attribute
print(MyClass.class_attribute)  # 输出: Modified class attribute

类属性的应用

  • 类属性通常用于存储与类相关的常量或共享数据。
  • 它们可以作为类的默认值或配置选项,供所有实例共享。
  • 类属性可以在类的方法中使用,以提供类级别的行为。
class Circle:
    pi = 3.14159

    def __init__(self, radius):
        self.radius = radius

    def calculate_area(self):
        return Circle.pi * self.radius * self.radius

circle1 = 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 = brand
    
    def 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 = color
    
    def 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 = name
    
    def speak(self):
        pass

class 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.coloradmin.cn/o/1687897.html

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

相关文章

Swin Transformer 笔记与理解

目录 解决什么问题基本结构理解 解决什么问题 传统的transformer处理于长序列需要非常大的计算量,而且很慢。且传统的transformer虽然的全局信息的获取上有着很好的效果,但是在局部信息的获取上就没有那么强了。Swim transformer的主要的贡献就是使用分…

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战

LLM 大模型学习必知必会系列(十):基于AgentFabric实现交互式智能体应用,Agent实战 0.前言 **Modelscope **是一个交互式智能体应用基于ModelScope-Agent,用于方便地创建针对各种现实应用量身定制智能体,目前已经在生产级别落地。AgentFabri…

Java输入与输出详解

Java输入和输出 前言一、Java打印Hello World二、输出到控制台基本语法代码示例格式化字符串 三、从键盘输入读入一个字符正确写法 使用 Scanner 读取字符串/整数/浮点数使用 Scanner 循环读取 N 个数字 前言 推荐一个网站给想要了解或者学习人工智能知识的读者,这…

嵌入式智能硬件茶杯垫的设计与实现方案

iCupBox简介 这是一款智能杯垫产品,基于GTD时间管理理念设计,目的是提醒人们专心工作和及时喝水休息,提高工作效率。 https://gitee.com/jiangtao008/iCupBox 开原许可协议:MIT 项目分为客户端APP和杯垫固件系统: 客户端APP,使用QML开发,集成GTD时间管理方法,与杯垫固…

QQ技术导航源码附带交易系统

网站功能 QQ登录 友联自助交换 友情链接交易功能 多功能搜索 ico小图标本地化 网站图片本地化 蜘蛛日志 文章评论 网站评论 自助链接匿名提交站点,添加友链访问网站自动审核通过 VIP 会员等级 VIP 付费升级 单个文章或者站点付费快审 多背景图片可自定义背景图片…

Web Server项目实战2-Linux上的五种IO模型

上一节内容的补充:I/O多路复用是同步的,只有调用某些API才是异步的 Unix/Linux上的五种IO模型 a.阻塞 blocking 调用者调用了某个函数,等待这个函数返回,期间什么也不做,不停地去检查这个函数有没有返回&#xff0c…

【算法】二分算法——寻找峰值

题解:寻找峰值(二分算法) 目录 1.题目2.暴力求解3.二分算法4.总结 1.题目 题目链接:LINK 2.暴力求解 暴力求解的思路很简单,这个数组的形状无非就三种: 一直上升下降(这里包含先下降后上升)先升后降 总结一下规律&#xff1…

详解CSS(二)

目录 1.背景属性 1.1背景颜色 1.2背景图片 1.3背景平铺 1.4背景位置 1.5背景尺寸 2.圆角矩形 3.元素的显示模式 3.1行内元素/内联元素(Inline element) 3.2块级元素(Block-level element) 3.3行内块元素(In…

一键自动回复,提升客服效率,解锁销售新高度

在快速迭代的跨境电商时代,效率与顾客体验是决定商家能否脱颖而出的关键要素。作为一款专为跨境电商设计的全能管理工具,现我们已全面升级,与俄罗斯头部电商平台Ozon深度整合,推出自动回复功能,旨在帮助卖家实现客服管…

1.Nacos 入门与实战(Spring Cloud)

1.Nacos 入门与实战 1.什么是 Nacos?1.1 Nacos 功能1.1.1 配置中心1.1.2 注册中心 1.2 Nacos 优点 2.Nacos 基本使用2.1 Nacos 部署安装2.1.1 部署方式2.1.2 安装并启动2.2.3 配置数据源2.2.4 开启控制台授权登录(可选) 2.2 配置中心使用2.2.1 创建配置…

使用API有效率地管理Dynadot域名,进行域名邮箱的默认邮件转发设置

关于Dynadot Dynadot是通过ICANN认证的域名注册商,自2002年成立以来,服务于全球108个国家和地区的客户,为数以万计的客户提供简洁,优惠,安全的域名注册以及管理服务。 Dynadot平台操作教程索引(包括域名邮…

Docker-Android安卓模拟器本地部署并实现远程开发测试

文章目录 1. 虚拟化环境检查2. Android 模拟器部署3. Ubuntu安装Cpolar4. 配置公网地址5. 远程访问小结 6. 固定Cpolar公网地址7. 固定地址访问 本文主要介绍如何在Ubuntu系统使用Docker部署docker-android安卓模拟器,并结合cpolar内网穿透工具实现公网远程访问本地…

504 Gateway Time-out

问题描述 做Excel导入的功能,由于Excel的数据比较多,需要做处理然后入库,数据量大概200万,所以毫无悬念的导入Excel接口调用超过了一分钟,并且报错:504 gateway timeout。 解决方案 nginx超时限制。路径…

51单片机入门:AT24C02

AT24C02简介 AT24C02是一个2K bit的EEPROM存储器,使用I2C通信方式(其中02对应2K bit,类似的,AT24C04/08对应4K bit/8K bit的存储器)。 其原理图如下: 对应的引脚及其功能: 引脚名称功能A0/A1…

ThingsBoard物联网网关在暖通自控中的应用

ThingsBoard是用于数据收集、处理、可视化和设备管理的开源物联网平台。 场景 智能办公场景中的物联网需求包括能源管理、安全监控、环境监测、空间优化和设备自动化,以提升效率、节约成本并增强员工的舒适度和安全性。 通过监测建筑内部的温度、湿度、光照等数据&a…

WordPress插件Disable WP REST API,可根据是否登录来禁用REST API

前面跟大家分享了代码版禁用WordPress REST API的方法(详见『WordPress4.7以上版本如何禁用JSON REST API?』),不过有些站长不太敢折腾自己的网站代码,那么建议试试这款Disable WP REST API,它可以&#xf…

linux命令arp的使用

arp arp 命令用于显示和修改 IP 到 MAC 转换表 补充说明 arp 命令 是 Address Resolution Protocol,地址解析协议,是通过解析网络层地址来找寻数据链路层地址的一个网络协议包中极其重要的网络传输协议。而该命令可以显示和修改 arp 协议解析表中的缓…

为什么要用虚拟时钟Virtual clock?

通常RTL设计要求对芯片/module的输入信号进行reg_in打拍处理,对芯片/module的输出也要求做reg_out打拍处理,这是良好的代码习惯,为时序收敛留下足够裕量,也避免顶层例化综合后的子模块时出现模块间IO时序不满足的情况。综合阶段可…

编写一个llvm编译器插件,完成在store汇编指令前对内存合法性的check。

dds(iceoryx、fastdds等)中间件采用了共享内存,如果app内存越界将共享内存踩踏坏了,将会形成灾难。本插件可以检测到app是否在写共享内存,如果是,我们可以让app assert。从而提高dds的稳定性 插件效果: 插件源码&…

2024 年 5 种领先的小语言模型:Phi 3、Llama 3 等

2024 年 5 种领先的小语言模型:Phi 3、Llama 3 等 近年来,GPT-3 和 BERT 等大型语言模型的发展改变了人工智能的格局,它们以其强大的功能和广泛的应用而闻名。 然而,除了这些巨头之外,一种新的 AI 工具类别也正在掀起…