Python-VBA函数之旅-vars函数

news2024/11/16 1:47:54

目录

一、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/

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

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

相关文章

Redis-分布式锁实现方式

文章目录 Redis分布式锁的作用?Redis分布式锁的底层原理实现?Redis分布式锁的应用场景?Redis分布式锁遇到相关的场景问题?死锁问题锁超时问题归一问题可重入问题阻塞与非阻塞问题公平锁(Fair Lock)公平锁(F…

【每日力扣】207. 课程表 与 208. 实现 Trie (前缀树)

🔥 个人主页: 黑洞晓威 😀你不必等到非常厉害,才敢开始,你需要开始,才会变的非常厉害 207. 课程表 你这个学期必须选修 numCourses 门课程,记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课…

实现 Flask 应用的 HTTPS 加密保护

文章目录 1. 获得免费的 SSL 证书步骤: 2. 配置 Flask 应用3. 测试和部署结论结论 在今天的网络环境中,保护网站和用户数据的安全至关重要。通过在 Flask 应用中启用 HTTPS 加密,您可以确保用户的数据在传输过程中得到保护。本文将介绍如何结…

vue3修改eldialog弹窗css不生效

问题:子组件中的eldialog没有父标签 直接使用如下是不生效的 .el-dialog{ top: 10%; } 解决: 加一个父标签 使用deep深度查询 .dialogClass :deep(.el-dialog) { top: 10%; } 就可以修改了

# 从浅入深 学习 SpringCloud 微服务架构(十八)

从浅入深 学习 SpringCloud 微服务架构(十八) 一、开源配置中心 Apollo:概述 1、开源配置中心 Apollo Apollo -A reliable configuration management system Apollo(阿波罗)是携程框架部门研发的分布式配置中心,能够集中化管理…

研究变压器感应耐压试验电源的能效和节能潜力

变压器感应耐压试验电源 变压器感应耐压试验电源在电源行业中是一种非常重要的设备,用于测试和验证变压器的绝缘性能。变压器感应耐压试验电源是一种专门为变压器感应耐压试验而设计的电源设备。它的工作原理基于变压器的感应原理,利用感应电压来对变压器…

【科学研究】创造力的阴暗面——恶意创造力

::: block-1 “时问桫椤”是一个致力于为本科生到研究生教育阶段提供帮助的不太正式的公众号。我们旨在在大家感到困惑、痛苦或面临困难时伸出援手。通过总结广大研究生的经验,帮助大家尽早适应研究生生活,尽快了解科研的本质。祝一切顺利!—…

CheckStyle静态样式之道

优质博文:IT-BLOG-CN 在标准化的统一样式检查规范里,最为常用的统一样式工具是checkstyle插件,而不是国内阿里的代码规约插件。 【1】下载插件 【2】配置生效 配置生效及告警设置 【3】配置checkstyle.xml 官网地址 官网最新Releases 下面…

SV-6007 网络对讲求助终端 隧道对讲求助广播终端

SV-6007 网络对讲求助终端 隧道对讲求助广播终端 一、描述 SV-6007 网络对讲求助终端 隧道对讲求助广播终端 SV-6007是我司的一款壁挂式双按键求助对讲终端,具有10/100M以太网接口,其接收网络的音频数据,实时解码播放,还配置了…

照片尺寸怎么修改?这几个图片处理方式都可以

修改图片尺寸在许多场景中都是常见的需求,包括网页设计、图片编辑、手机应用程序开发、幻灯片演示、社交媒体和博客、以及打印和出版物设计,通过调整图片大小,可以适应不同的布局和设备要求,那么问题来了,如何将图片改…

Vue3实战笔记(21)—自定义404页面

文章目录 前言一、标题1二、通过守卫导航配置404总结 前言 一个精致的404页面对于网站的用户体验至关重要。404页面,也称为“未找到”页面,是在用户尝试访问网站中不存在或已删除的页面时显示的。 一、标题1 404都很熟悉了,vue3默认找不到界…

C#学习笔记12:Winform网页操作-CefSharp内嵌浏览器

今日学习使用Winform操作网页,先从从窗体内嵌一个浏览器开始吧: 文章提供测试代码讲解、测试效果图、整体测试工程下载 目录 CefSharp介绍与安装: 创建解决方案安装CefSharp: 控件放置: 整体代码贴出: 更改…

数据结构与算法学习笔记十---链队列的表示和实现(C++)

目录 前言 1.队列的概念 2.队列的表示和实现 1.定义 2.初始化 ​编辑 3.销毁队列 4.清空队列 5.队列判空 6.队列长度 7.获取队头元素 8.入队 9.出队 10.遍历 11.完整代码 前言 这篇博客主要讲的是对队列的链式存储。 1.队列的概念 队列是一种访问受限的线性表。…

知识图谱开发日志

应用于应用环境的配置.测试.发布 假如你写了一个web,并且测试调试都没有问题 并且,你想发给你的朋友,导师,或者部署到远程云服务器上 那么,你需要配置相同的软件,比如数据库,web服务器,必要的插件,库,etc…但这并不一定能保证软件的正常运行,因为别人可能使用完全不同的操作系统…

Facebook广告运营黑五类怎么投?

哈喽呀,很多小伙伴不知道黑五具体是哪些今天就跟大家来说说,黑五类是指一些擦边的受到限制的产品,指的是药品、医疗器械、丰胸、减肥、增高这五类产品。 黑五类产品可以在哪些平台进行投放: 目前黑五类可以广告投放的跨境电商平台…

第三方组件element-ui

1、创建 选vue2 不要快照 vue2于vue3差异 vue2main。js import Vue from vue import App from ./App.vueVue.config.productionTip falsenew Vue({render: h > h(App), }).$mount(#app)vue3 main.js vue2不能有多个跟组件(div) 代码:Mo…

ssm教材管理系统

ssm教材管理系统 一、主要技术点 ssm,easypoi(对excel导入导出),下拉列表二级联动,live-2d看板娘,echartjs图表,图片上传下载。。 二、主要业务逻辑 管理员可以增删改查教材、教材商、入库教材、用户(用户包括学生…

2024年京东618红包领取口令是什么?2024年618京东红包活动时间是从什么时候开始到几号结束?

2024年京东618红包活动时间 京东618红包活动时间是从2024年5月28日开始,一直持续到6月18日结束。 2024年京东618红包领取方式 在2024年京东618活动时间内,每天都可以打开手机京东APP,输入框搜索红包领取口令「 天降红包882 」,搜…

Java——对象的打印

当我们运行如下代码: public class Person {String name;String gender;int age;public Person(String name,String gender,int age){this.name name;this.gender gender;this.age age;}public static void main(String[] args){Person person new Person(&quo…

Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及!

Google I/O 2024 干货全解读:Gemini AI 横空出世,智能未来触手可及! 博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》…