Python-VBA函数之旅-vars函数

目录

一、vars函数的常见应用场景

二、vars函数使用注意事项

三、如何用好vars函数?

1、vars函数:

1-1、Python:

1-2、VBA:

2、推荐阅读:

个人主页:https://myelsa1024.blog.csdn.net/

一、vars函数的常见应用场景

        vars函数在Python中有多个实际应用场景,它主要用于查看和访问对象的属性(即对象的 `__dict__` 属性),其常见的应用场景有:

1、动态设置和获取属性:当你不确定对象的所有属性,或者需要动态地设置和获取属性时,vars()函数非常有用,你可以用它来遍历对象的所有属性,或者根据某些条件动态地设置属性。

2、动态类创建:结合type()函数和vars()函数,你可以动态地创建类并设置其属性,这在需要基于用户输入或其他条件创建类时非常有用。

3、配置管理:如果你有一个复杂的对象或系统,其配置由多个属性组成,你可以使用vars()函数来管理这些配置。例如,你可以将配置存储在一个字典中,并使用vars()函数将该字典应用于对象,从而一次性设置多个属性。

4、序列化和反序列化:虽然vars()函数本身不是用于序列化和反序列化的最佳工具,但它可以作为一个起点,你可以使用vars()函数获取对象的属性字典,然后将其序列化为JSON或其他格式;同样地,你也可以将序列化的数据反序列化为字典,并使用vars()函数或setattr()函数将其应用于对象。

5、对象间属性复制:如果你有两个对象,并且希望将一个对象的属性复制到另一个对象,你可以使用vars()函数来获取源对象的属性字典,并将其复制到目标对象,这在使用具有相似属性结构的对象时非常有用。

6、自定义属性访问控制:通过重写类的`__getattr__()`和`__setattr__()`方法,并结合vars()函数,你可以实现自定义的属性访问控制。例如,你可以在属性被访问或设置时执行一些额外的逻辑,如验证、转换或记录。

7、调试和诊断:在调试和诊断复杂系统时,vars()函数可以帮助你查看对象的当前状态,通过打印vars(obj)的结果,你可以快速了解对象的所有属性及其值,从而更容易地定位问题所在。

8、编写灵活的函数和方法:有时你可能希望编写一个函数或方法,它能够处理具有不同属性的对象。使用vars()函数,你可以编写一个函数,该函数接受一个对象作为参数,并基于该对象的属性来执行不同的操作。

9、反射和元编程:元编程是指编写操作代码的代码,vars()函数可以用于动态地检查和修改代码中的对象,这在创建框架、ORM(对象关系映射)库或其他需要动态行为的库中非常有用。

10、框架和库的内部实现:一些 Python 框架和库在其内部实现中可能会使用vars()函数来操作对象的属性。例如,ORM(对象关系映射)库可能会使用vars()函数来获取对象的属性,并将其转换为数据库查询的参数。

11、数据分析和可视化:在数据分析和可视化中,你可能需要提取对象的属性以进行进一步的处理或展示,vars()函数可以方便地获取这些属性,并将其用于各种分析和可视化工具中。

        注意,虽然vars()函数在许多情况下都很有用,但它并不是访问或修改对象属性的唯一方法。在大多数情况下,你应该优先考虑使用点记法(`.`)来直接访问和修改对象的属性;只有在需要动态访问或修改属性时,才考虑使用vars()函数

二、vars函数使用注意事项

        在Python中,vars()函数是一个内置函数,用于返回指定对象的`__dict__`属性。如果未指定对象,则vars()函数返回当前本地符号表的字典。然而,在使用vars()函数时,请注意以下事项:

1、对象类型:不是所有对象都有`__dict__`属性。例如,一些内置类型(如整数、浮点数、字符串等)和某些特殊对象(如类、模块等)可能没有`__dict__`属性,对于这些对象,vars()函数可能无法正常工作或返回预期的结果。

2、可变性:通过vars()函数获得的字典是可变的,但这并不意味着你可以随意修改它,修改这个字典可能会改变对象的内部状态,但也可能导致意外的副作用或错误,特别是,如果你修改了类的`__dict__`,可能会影响该类及其所有实例的行为。

3、局部与全局变量:在函数内部使用vars()时,它返回的是当前函数的局部符号表的字典,而不是全局符号表,如果你需要访问全局变量,可以使用globals()函数。

4、线程安全:在多线程环境中,直接修改由vars()函数或globals()函数返回的字典可能不是线程安全的,这是因为多个线程可能同时访问和修改这些字典,导致数据竞争和不一致的结果,如果你需要在多线程环境中共享状态,建议使用其他同步机制(如锁)来保护对这些字典的访问。

5、性能考虑:虽然vars()函数和globals()函数在大多数情况下都很快,但在性能敏感的代码中频繁使用它们可能会引入不必要的开销,这是因为这些函数需要遍历并复制符号表的内容来创建一个新的字典对象。

6、可读性和可维护性:过度使用vars()函数或globals()函数可能会降低代码的可读性和可维护性,这些函数使得变量和状态的管理变得不那么明确和直观,可能导致其他开发人员难以理解和维护你的代码,因此,在可能的情况下,最好使用显式的变量和参数来传递和管理状态。

7、替代方案:在许多情况下,你可以使用其他方法来访问或修改对象的属性,而无需使用vars()函数。例如,你可以使用getattr()函数和setattr()函数来动态地获取和设置对象的属性,或者使用类的 `__init__()` 方法来初始化对象的状态,这些替代方案通常更加清晰、直观和易于维护。

三、如何用好vars函数?

        vars()函数在Python中主要用于查看或操作对象的`__dict__`属性,即对象的命名空间。为了有效地使用vars()函数,你需遵循以下建议:

1、了解其作用域:vars()函数在模块级别调用时返回模块的`__dict__`属性,而在函数内部调用时返回当前局部命名空间的字典,要理解vars()函数返回的内容,你需要知道它是在哪个作用域内被调用的。

2、谨慎修改返回的字典:虽然vars()函数返回的字典是可变的,但修改它可能会带来不可预期的结果。特别是,在函数内部修改由vars()返回的局部命名空间可能会破坏函数的正常工作;在类实例上修改vars()返回的字典可能会改变实例的状态,但应当小心不要破坏类的封装性。

3、使用vars()查看对象属性:如果你想要查看对象的所有属性(包括从基类继承的属性),可以使用vars()函数,这在调试或理解对象状态时非常有用。

4、避免在性能敏感的代码中使用:虽然vars()函数通常很快,但在需要高性能的代码中,频繁调用它可能会成为瓶颈,在这种情况下,考虑使用其他方法来访问对象的属性。

5、使用替代方法:如果可能,最好使用更明确和直接的方法来访问和修改对象的属性。例如,使用点记法(`object.attribute`)或getattr()函数和setattr()函数。

6、在类定义中使用vars()函数:在类定义中,你可以在`__init__()`方法或其他方法中使用vars()来初始化对象的属性,但这通常不是最佳实践,更常见的是直接在`__init__()`方法中定义和初始化属性,但是,如果你需要从字典或其他类似的数据结构中动态地设置对象的属性,vars()函数可能会很有用。

7、结合locals()和globals()使用:locals()函数和globals()函数分别返回当前局部命名空间和全局命名空间的字典,这些函数可以与vars()函数结合使用,以在更广泛的作用域中操作变量。

8、注意vars()函数的返回值:vars()函数返回的是对象的`__dict__`属性的一个浅拷贝,这意味着如果你修改了返回的字典中的嵌套对象(如列表或字典),这些修改将反映在原始对象的`__dict__`属性中,但是,如果你替换返回的字典中的整个嵌套对象,原始对象的`__dict__`属性将不会受到影响。

9、文档和注释:当你使用vars()函数或其他可能导致代码难以理解的技巧时,确保你的代码有充分的文档和注释,以便其他开发人员能够理解和维护你的代码。

1、vars函数:
1-1、Python:
# 1.函数:vars
# 2.功能:
# 2-1、无实参:用于返回当前本地作用域中的属性和属性值的字典对象
# 2-2、有实参:用于返回对象object的属性和属性值的字典对象
# 3.语法:vars([object])
# 4.参数:object,可选参数,表示对象
# 5.返回值:
# 5-1、无实参:返回当前本地作用域中的属性和属性值的字典对象
# 5-2、有实参:返回该对象object的属性和属性值的字典对象
# 6.说明:
# 7.示例:
# 用dir()函数获取该函数内置的属性和方法
print(dir(vars))
# ['__call__', '__class__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__',
# '__getstate__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__le__', '__lt__', '__module__', '__name__',
# '__ne__', '__new__', '__qualname__', '__reduce__', '__reduce_ex__', '__repr__', '__self__', '__setattr__', '__sizeof__',
# '__str__', '__subclasshook__', '__text_signature__']

# 用help()函数获取该函数的文档信息
help(vars)

# 应用一:动态设置和获取属性
# 示例1:实例级别的使用
class MyClass:
    def __init__(self):
        self.static_attr = "I'm a static attribute"
obj = MyClass()
# 使用 vars() 动态设置属性
vars(obj)['dynamic_attr'] = "I'm a dynamic attribute"
# 使用 vars() 获取属性
print(vars(obj)['static_attr'])  # 输出: I'm a static attribute
print(vars(obj)['dynamic_attr'])  # 输出: I'm a dynamic attribute
# 也可以直接通过对象访问这些属性
print(obj.static_attr)  # 输出: I'm a static attribute
print(obj.dynamic_attr)  # 输出: I'm a dynamic attribute
# I'm a static attribute
# I'm a dynamic attribute
# I'm a static attribute
# I'm a dynamic attribute

# 示例2:模块级别的使用
# 在模块级别,vars()等同于globals()
x = 10
print(vars()['x'])  # 输出 10
# 使用vars()设置属性
vars()['y'] = 20
print(y)  # 输出 20
# 10
# 20

# 应用二:动态类创建
# 创建一个空的类字典来存储类属性和方法
class_dict = {
    '__doc__': 'This is a dynamically created class',
    'class_var': 'I am a class variable',
    # 定义一个方法
    'greet': lambda self: print(f'Hello from {self.__class__.__name__}!')
}
# 使用type()函数动态创建类
DynamicClass = type('DynamicClass', (object,), class_dict)
# 创建类的实例并测试
instance = DynamicClass()
print(instance.class_var)  # 输出: I am a class variable
instance.greet()  # 输出: Hello from DynamicClass!
# 如果你确实想用vars()来查看或修改类的属性(不推荐这样做)
print(vars(DynamicClass)['class_var'])  # 输出: I am a class variable
# 注意:不推荐使用vars()来修改类属性,因为它会绕过类属性的正常访问控制
# 但这里为了示例,我们仍然演示如何设置一个新属性
# vars(DynamicClass)['new_class_var'] = 'This is a new class variable'
# # 访问新设置的类属性
# print(DynamicClass.new_class_var)  # 输出: This is a new class variable
# 但通常我们会直接通过类来访问和修改属性
DynamicClass.another_class_var = 'Another class variable'
print(DynamicClass.another_class_var)  # 输出: Another class variable
# I am a class variable
# Hello from DynamicClass!
# I am a class variable
# Another class variable

# 应用三:配置管理
# 假设我们有一个配置类,用于存储应用程序的配置项
class Config:
    def __init__(self):
        # 初始化一些配置项
        self.database_url = 'sqlite:///example.db'
        self.debug_mode = False
        self.log_level = 'INFO'
# 创建一个配置实例
config = Config()
# 使用vars()查看和修改配置
print("原始配置:")
for key, value in vars(config).items():
    print(f"{key}: {value}")
# 修改配置项
vars(config)['debug_mode'] = True
print("\n修改后的配置:")
for key, value in vars(config).items():
    print(f"{key}: {value}")
# 另外一种常见的配置管理方式是通过字典或模块级别的变量
# 这里我们模拟使用模块级别的变量作为配置
# config.py 文件内容
# DATABASE_URL = 'sqlite:///example.db'
# DEBUG_MODE = False
# LOG_LEVEL = 'INFO'
# 在主程序中导入配置模块
# import config
# 使用vars()查看模块级别的配置(注意:这不是通常推荐的做法,因为模块不是字典)
# 通常我们会直接通过模块名访问配置变量,如 config.DATABASE_URL
# 但为了示例,我们可以模拟这样做(不推荐!):
# import sys
# module = sys.modules['config']  # 假设config模块已经被导入
# print("\n模块级别的配置:")
# for key in dir(module):
#     if not key.startswith('__'):  # 忽略特殊属性和方法
#         value = getattr(module, key)
#         print(f"{key}: {value}")
# 更好的做法是直接访问模块中的变量
# print(f"DATABASE_URL: {config.DATABASE_URL}")
# print(f"DEBUG_MODE: {config.DEBUG_MODE}")
# print(f"LOG_LEVEL: {config.LOG_LEVEL}")
# 修改模块级别的配置(通常不推荐直接修改模块变量,除非你清楚这样做的后果)
# config.DEBUG_MODE = True
# print(f"修改后的DEBUG_MODE: {config.DEBUG_MODE}")

# 应用四:序列化和反序列化
import json
class Config:
    def __init__(self):
        self.setting1 = "value1"
        self.setting2 = 42
        self.setting3 = True
# 创建一个配置对象
config = Config()
# 使用vars()获取对象的属性字典
config_dict = vars(config)
# 序列化:将字典转换为JSON字符串
config_json = json.dumps(config_dict)
print("Serialized Config:", config_json)
# 反序列化:将JSON字符串转换回字典
deserialized_dict = json.loads(config_json)
# 如果你想要将反序列化后的字典恢复为一个Config对象,
# 你可能需要定义一个从字典创建Config对象的方法
def create_config_from_dict(data):
    config = Config()
    for key, value in data.items():
        setattr(config, key, value)
    return config
# 使用上面定义的方法从字典创建Config对象
deserialized_config = create_config_from_dict(deserialized_dict)
# 验证反序列化后的对象
print("Deserialized Config:", deserialized_config.setting1, deserialized_config.setting2, deserialized_config.setting3)
# Serialized Config: {"setting1": "value1", "setting2": 42, "setting3": true}
# Deserialized Config: value1 42 True

# 应用五:对象间属性复制
class MyClass:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c
    def copy_from(self, other):
        # 使用vars()获取other对象的属性字典
        other_vars = vars(other)
        # 将other对象的属性字典中的键值对设置到当前对象的 __dict__ 中
        self.__dict__.update(other_vars)
# 创建两个对象
obj1 = MyClass(1, 2, 3)
obj2 = MyClass(4, 5, 6)
# 打印obj1的属性
print("Before copying:", vars(obj1))
# 复制obj2的属性到obj1
obj1.copy_from(obj2)
# 打印obj1的属性,现在它应该包含了obj2的属性
print("After copying:", vars(obj1))
# Before copying: {'a': 1, 'b': 2, 'c': 3}
# After copying: {'a': 4, 'b': 5, 'c': 6}

# 应用六:自定义属性访问控制
class CustomAccess:
    def __init__(self):
        self._private_attr = 'This is a private attribute'
        self._data = {}
    def __getattr__(self, name):
        # 当尝试访问不存在的属性时,会调用这个方法
        # 这里我们尝试从_data字典中获取属性
        if name in self._data:
            return self._data[name]
        else:
            # 如果_data中不存在该属性,并且也不是以'_'开头的(模拟私有属性),则抛出异常
            if not name.startswith('_'):
                raise AttributeError(f"Attribute '{name}' not found")
            # 对于以'_'开头的属性,可以返回某种默认值或执行其他逻辑
            return None
    def __setattr__(self, name, value):
        # 当尝试设置属性时,会调用这个方法
        # 如果属性名以'_'开头,则设置为实例变量(直接赋值)
        if name.startswith('_'):
            super().__setattr__(name, value)
        else:
            # 否则,将属性存储在_data字典中
            self._data[name] = value
    def __delattr__(self, name):
        # 当尝试删除属性时,会调用这个方法
        # 如果属性名在_data字典中,则删除它
        if name in self._data:
            del self._data[name]
        else:
            # 如果不是_data中的属性,并且也不是以'_'开头的,则抛出异常
            if not name.startswith('_'):
                raise AttributeError(f"Attribute '{name}' not found")
            # 对于以'_'开头的属性,直接调用父类的__delattr__
            super().__delattr__(name)
# 使用示例
obj = CustomAccess()
# 设置属性
obj.public_attr = 'This is a public attribute'
# 访问属性
print(obj.public_attr)  # 输出: This is a public attribute
print(obj._private_attr)  # 仍然可以访问以'_'开头的“私有”属性
# print(obj.nonexistent_attr)  # 抛出 AttributeError: Attribute 'nonexistent_attr' not found
# 删除属性
del obj.public_attr
# print(obj.public_attr)  # 抛出 AttributeError: Attribute 'public_attr' not found
# 尝试删除“私有”属性(在这里我们允许删除,但通常不建议这样做)
del obj._private_attr
print(obj._private_attr)  # 输出: None,因为我们没有定义_delattr__中对私有属性的特殊处理
# This is a public attribute
# This is a private attribute
# None

# 应用七:调试和诊断
class Person:
    def __init__(self, name, age):
        self.name = name
        self.age = age
        self.address = None
# 创建一个Person对象
person = Person("Myelsa", 18)
person.address = "123 Main St"
# 使用vars()查看对象的属性及其值
print("Person attributes and values:")
for attr, value in vars(person).items():
    print(f"{attr}: {value}")
# 假设我们想要调试或诊断某个特定属性是否存在或具有预期的值
if 'name' in vars(person) and person.name == "Myelsa":
    print("Name attribute exists and has the expected value.")
else:
    print("Name attribute does not exist or has an unexpected value.")
# 假设我们想要修改一个属性并再次查看其状态
person.age = 42
print("Person after modifying age:")
for attr, value in vars(person).items():
    print(f"{attr}: {value}")
# 假设我们有一个函数,它接收一个对象并打印其属性用于诊断
def diagnose_object(obj):
    print(f"Diagnosing object of type {type(obj).__name__}:")
    for attr, value in vars(obj).items():
        print(f"  {attr}: {value}")
# 使用函数进行诊断
diagnose_object(person)
# Person attributes and values:
# name: Myelsa
# age: 18
# address: 123 Main St
# Name attribute exists and has the expected value.
# Person after modifying age:
# name: Myelsa
# age: 42
# address: 123 Main St
# Diagnosing object of type Person:
#   name: Myelsa
#   age: 42
#   address: 123 Main St

# 应用八:编写灵活的函数和方法
class MyClass:
    def __init__(self, **kwargs):
        # 初始化时设置对象的属性
        for key, value in kwargs.items():
            setattr(self, key, value)
    def update_from_dict(self, **kwargs):
        # 使用**kwargs动态地更新对象的属性
        for key, value in kwargs.items():
            setattr(self, key, value)
    def display_vars(self):
        # 显示对象的所有属性及其值
        print(vars(self))
# 创建一个MyClass的实例,并设置一些属性
obj = MyClass(name="Myelsa", age=18, city="Guangzhou")
# 显示对象的初始状态
obj.display_vars()
# 使用update_from_dict方法动态地更新对象的属性
obj.update_from_dict(age=42, country="China")
# 显示对象更新后的状态
obj.display_vars()
# 假设我们有一个包含新属性值的字典
new_values = {'name': 'Bruce', 'occupation': 'Developer'}
# 我们可以将字典转换为关键字参数,并传递给update_from_dict方法
obj.update_from_dict(**new_values)
# 显示对象使用新字典更新后的状态
obj.display_vars()
# {'name': 'Myelsa', 'age': 18, 'city': 'Guangzhou'}
# {'name': 'Myelsa', 'age': 42, 'city': 'Guangzhou', 'country': 'China'}
# {'name': 'Bruce', 'age': 42, 'city': 'Guangzhou', 'country': 'China', 'occupation': 'Developer'}

# 应用九:反射和元编程
class MyObject:
    def __init__(self, **kwargs):
        self.__dict__.update(kwargs)
def print_object_vars(obj):
    """使用vars()打印对象的所有属性"""
    print(vars(obj))
def set_object_vars(obj, **kwargs):
    """使用vars()和setattr()动态设置对象的属性"""
    for key, value in kwargs.items():
        setattr(obj, key, value)
def inspect_and_modify(obj, attribute, new_value):
    """使用vars()反射检查属性,并修改它"""
    if attribute in vars(obj):
        print(f"Before modification: {attribute} = {vars(obj)[attribute]}")
        vars(obj)[attribute] = new_value
        print(f"After modification: {attribute} = {vars(obj)[attribute]}")
    else:
        print(f"Attribute '{attribute}' does not exist in the object.")
# 创建一个MyObject实例并设置属性
obj = MyObject(name="Myelsa", age=18)
# 打印对象的所有属性
print_object_vars(obj)
# 使用set_object_vars函数动态设置对象的属性
set_object_vars(obj, city="New York", occupation="Developer")
print_object_vars(obj)
# 使用inspect_and_modify函数反射检查并修改属性
inspect_and_modify(obj, 'age', 42)
print_object_vars(obj)
# 注意:直接使用vars(obj)[attribute] = new_value与setattr效果相同,
# 但通常推荐使用setattr,因为它处理了一些特殊情况(如__开头的属性)
# {'name': 'Myelsa', 'age': 18}
# {'name': 'Myelsa', 'age': 18, 'city': 'New York', 'occupation': 'Developer'}
# Before modification: age = 18
# After modification: age = 42
# {'name': 'Myelsa', 'age': 42, 'city': 'New York', 'occupation': 'Developer'}

# 应用十:框架和库的内部实现
class DynamicObject:
    def __init__(self, **kwargs):
        # 使用字典来存储动态属性
        self._dynamic_attributes = {}
        # 使用kwargs初始化属性
        self.update_attributes(**kwargs)
    def update_attributes(self, **kwargs):
        """更新动态属性"""
        self._dynamic_attributes.update(kwargs)
    def __getattr__(self, name):
        """实现动态属性的获取"""
        try:
            return self._dynamic_attributes[name]
        except KeyError:
            raise AttributeError(f"'{self.__class__.__name__}' object has no attribute '{name}'")
    def __setattr__(self, name, value):
        """实现动态属性的设置"""
        if name == '_dynamic_attributes':
            # 避免循环引用
            super().__setattr__(name, value)
        else:
            # 将属性存储在_dynamic_attributes字典中
            self._dynamic_attributes[name] = value
    def __str__(self):
        """返回对象的字符串表示,用于调试或日志记录"""
        return str(vars(self))  # 注意:这里使用了vars(),但在实际框架中可能需要更复杂的序列化
# 示例使用
obj = DynamicObject(name="Myelsa", value=42)
print(obj)
# 动态设置属性
obj.new_attribute = "Hello, World!"
print(obj)  # 输出更新后的对象状态
# 检查是否存在某个属性
if hasattr(obj, 'name'):
    print(obj.name)
# 清理或重置对象状态(模拟框架内部操作)
def reset_object(obj):
    obj._dynamic_attributes = {}
reset_object(obj)
print(obj)
# {'_dynamic_attributes': {'name': 'Myelsa', 'value': 42}}
# {'_dynamic_attributes': {'name': 'Myelsa', 'value': 42, 'new_attribute': 'Hello, World!'}}
# Myelsa
# {'_dynamic_attributes': {}}

# 应用十一:数据分析和可视化
import pandas as pd
import matplotlib.pyplot as plt
class DataAnalyzer:
    def __init__(self, dataframe):
        self.df = dataframe
        self.processed_data = None
    def preprocess_data(self, column, operation='mean'):
        """对指定列进行预处理(例如计算平均值)"""
        if operation == 'mean':
            self.processed_data = self.df[column].mean()
            # 这里可以添加更多预处理操作
    def visualize_data(self, column, operation='histogram'):
        """根据预处理的数据进行可视化"""
        if self.processed_data is None:
            print("请先对数据进行预处理。")
            return
        if operation == 'histogram':
            # 假设processed_data是数值,我们可以创建一个简单的直方图
            # 但实际上我们会直接对原始数据列进行可视化
            self.df[column].plot(kind='hist', bins=30)
            plt.title(f'Histogram of {column}')
            plt.show()
            # 这里可以添加更多可视化选项
    def show_state(self):
        """显示类的当前状态"""
        print("Current state of the DataAnalyzer:")
        print(vars(self))
# 示例使用
# 创建一个简单的 DataFrame
data = {'value': [3, 5, 6, 8, 10, 11, 24]}
df = pd.DataFrame(data)
# 创建一个DataAnalyzer实例
analyzer = DataAnalyzer(df)
# 预处理数据
analyzer.preprocess_data('value', operation='mean')
# 显示类的当前状态
analyzer.show_state()
# 可视化数据
analyzer.visualize_data('value')
# Current state of the DataAnalyzer:
# {'df':    value
# 0      3
# 1      5
# 2      6
# 3      8
# 4     10
# 5     11
# 6     24, 'processed_data': 9.571428571428571}
1-2、VBA:
略,待后补。
2、推荐阅读:

2-1、Python-VBA函数之旅-locals()函数

Python算法之旅:Algorithms

Python函数之旅:Functions

个人主页:https://myelsa1024.blog.csdn.net/

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构--AVL树

一、什么是AVL树 1、AVL树的概念 二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查 找元素相当于在顺序表中搜索元素,效率低下。因此,两位俄罗斯的数学家G.M.Adelson-Velskii 和E.M.Landis在…

YOLOv5独家改进:backbone改进 | 微软新作StarNet:超强轻量级Backbone | CVPR 2024

💡💡💡创新点:star operation(元素乘法)在无需加宽网络下,将输入映射到高维非线性特征空间的能力,这就是StarNet的核心创新,在紧凑的网络结构和较低的能耗下展示了令人印象深刻的性能和低延迟 💡💡💡如何跟YOLOv5结合:替代YOLOv5的backbone 收录 YOL…

一表捋清网络安全等级保护测评要求

三级网络安全等级保护测评指标: 对于中小企事业单位来说,网络安全建设是一个复杂且投入较高的过程,因此他们更倾向于寻找一种“省心省力”的等保建设方案,以及一种能够持续有效且具有较高性价比的网络安全建设投入方式。 此时&…

直流无刷电机控制(一)六步换相(有感霍尔)附六步换相实现代码

直流无刷电机概述 直流无刷电机的转子为永磁铁,定子为换相线圈,有别于有刷电机通过电刷或者换向器换相,无刷电机通过控制器电子换相。 极对数 直流无刷电机采用永磁铁作为转子,一对NS磁极为一极对,为了使电机运转更…

【js】获取媒体流实现拍照功能,摄像头切换

<script setup>import {onMounted,reactive,ref} from vueconst videoConstraints reactive({width: 500,height: 300});let picArr reactive([])let videoNode ref(null)let show ref(true)let stream reactive({})onMounted(async () > {// 获取视频流&#xf…

语义分割——高分卫星土地覆盖数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

在浏览器执行js脚本的两种方式

fetch请求get 在浏览器执行http请求,可以使用fetch函数; fetch(“url”).then(response => response.text()) .then(data => console.log(JSON.parse(data)[‘status’])) .catch(error => console.error(error)) 直接返回json数据: fetch(“url”).then(response…

深入解析Linux逻辑卷管理器(LVM)

&#x1f407;明明跟你说过&#xff1a;个人主页 &#x1f3c5;个人专栏&#xff1a;《Linux &#xff1a;从菜鸟到飞鸟的逆袭》&#x1f3c5; &#x1f516;行路有良友&#xff0c;便是天堂&#x1f516; 目录 一、前言 1、Linux的起源与发展 2、什么是逻辑卷管理器&…

一觉醒来 AI科技圈发生的大小事儿 05月14日

&#x1f4f3;人类成功实现「蓝牙上天」&#xff01;接收来自600公里外太空信号 一家名为Hubble Network的初创公司成功实现了从地球到太空的蓝牙连接&#xff0c;通过SpaceX将两颗卫星送入轨道&#xff0c;从600公里外的卫星接收信号。他们开发了软件和相控阵天线&#xff0c…

设置linux终端用户输入空闲一段时间后就自动断开(linux终端超时自动断开)

在 /etc/profile 中加入TMOUT变量即可。 在文件的最后追加以下两行 export TMOUT600 # 600秒内无操作就断开。 readonly TMOUT # 将变量设置为只读&#xff0c;防止用户更改如图

好书推荐《智能网联汽车》

一本书打通 SLAM 在智能汽车 / 自动驾驶领域应用 自动驾驶技术已成为当今数字化时代汽车行业的热点话题之一。随着技术的不断成熟&#xff0c;越来越多的车辆采用激光 SLAM&#xff08;即时定位与地图构建&#xff09;和视觉 SLAM 技术&#xff0c;实现更高层次的智能网联汽车…

小果网页---套利系统添加了可以套利模块,提供数据api

最近在小果套利系统里面添加了一下可以套利模块&#xff0c;同时实现了盘中自动更新&#xff0c;30分钟更新一次。给大家提交交易参考&#xff0c;可以套利模块的选择 dfdf[df[申购状态] !暂停申购]dfdf[df[申购限额] !无限额]df[溢价率]df[溢价率].astype(float)df[成交量]df…

“网络安全新纪元:等保2.0的详细解读与实践”

网络安全等级保护基本要求》&#xff08;等保2.0&#xff09;于2019年6月发布&#xff0c;是我国网络安全等级保护制度的一项重要标准。等保2.0主要针对关键信息基础设施的网络安全保护&#xff0c;对数据安全和个人信息保护提出了更高的要求。本文将对等保2.0进行详细解读&…

leetcode-字符串变形-104

题目要求 思路 1.首先根据ASCII的规则&#xff0c;把字符串大小写替换&#xff0c;空格保持不变 2.将整个字符串进行翻转 3.以空格为区间&#xff0c;将区间内的字符串进行翻转&#xff0c;其中翻转的函数reverse() 代码实现 class Solution { public:string trans(string s…

数组定义方法

数组定义方法 "abcdef" 一个字符串 "a" "b" "c" "d" "e" "f" 字符串列表 ("a" "b" "c" "d" "e" &…

洛谷 P3372:线段树 1 ← 分块算法模板(区间更新、区间查询)

【题目来源】https://www.luogu.com.cn/problem/P3372【题目描述】 如题&#xff0c;已知一个数列&#xff0c;你需要进行下面两种操作&#xff1a; &#xff08;1&#xff09;将某区间每一个数加上 k。 &#xff08;2&#xff09;求出某区间每一个数的和。【输入格式】 第一行…

百面算法工程师 | YOLOv6面试考点原理全解析

本文给大家带来的百面算法工程师是深度学习目标检测YOLOv6面试总结&#xff0c;文章内总结了常见的提问问题&#xff0c;旨在为广大学子模拟出更贴合实际的面试问答场景。在这篇文章中&#xff0c;我们还将介绍一些常见的深度学习目标检测面试问题&#xff0c;并提供参考的回答…

pikachu靶场通关之暴力破解

目录 基于表单的暴力破解 1.打开网站&#xff0c;随便输入一个账号密码&#xff0c;点击登录 2.输入正确的账号密码&#xff0c;点击右上角的提示 3.随便输入账号密码&#xff0c;抓包 4.右键发送到intruder,点击intruder 5.设置攻击位置 6.设置攻击模式&#xff0c;选择…

【十大排序算法】----C语言版插入排序(详细图解)

目录 一&#xff1a;插入排序——原理 二&#xff1a;插入排序——分析 三&#xff1a;插入排序——实现 四&#xff1a;插入排序——效率 一&#xff1a;插入排序——原理 插入排序的原理和基本思想&#xff1a;把待排序的记录按其关键码值的大小逐个插入到一个已经排好序…

Python-VBA函数之旅-zip函数

目录 一、zip函数的常见应用场景 二、zip函数使用注意事项 三、如何用好zip函数&#xff1f; 1、zip函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;https://myelsa1024.blog.csdn.net/ 一、zip函数的常见…