Python 编程中的迭代器、生成器和装饰器探究【第110篇—迭代器】

news2024/11/16 17:50:56

Python 编程中的迭代器、生成器和装饰器探究

在Python编程中,迭代器(Iterators)、生成器(Generators)和装饰器(Decorators)是三个强大的概念,它们为代码的可读性、效率和灵活性提供了极大的帮助。本文将深入探讨这三个方向,通过代码实例和详细解析,帮助读者更好地理解和运用这些Python编程的核心概念。

IMG_20231006_183505

迭代器(Iterators)

在Python中,迭代器是用于遍历集合中的元素的对象。它实现了两个方法:__iter__()__next__()。让我们通过一个简单的例子来理解迭代器的概念:

class MyIterator:
    def __init__(self, start, end):
        self.current = start
        self.end = end

    def __iter__(self):
        return self

    def __next__(self):
        if self.current < self.end:
            result = self.current
            self.current += 1
            return result
        else:
            raise StopIteration

# 使用迭代器遍历元素
my_iterator = MyIterator(1, 5)
for num in my_iterator:
    print(num)

上述代码中,我们定义了一个简单的迭代器 MyIterator,它能够生成从指定起始值到结束值的整数序列。通过 for num in my_iterator,我们可以方便地遍历并输出这个序列。

生成器(Generators)

生成器是一种更简洁、高效的迭代器实现方式。它使用了关键字 yield,允许在每次调用迭代器的 __next__() 方法时暂停并保存当前状态。这样做不仅减少了代码量,还能在处理大数据集时减小内存消耗。看一个生成器的例子:

def my_generator(start, end):
    current = start
    while current < end:
        yield current
        current += 1

# 使用生成器遍历元素
for num in my_generator(1, 5):
    print(num)

这里,my_generator 函数通过 yield 关键字实现了一个简单的生成器。与迭代器相比,这样的实现更为简洁,并且在处理大规模数据时更加高效。

装饰器(Decorators)

装饰器是一种用于修改函数或方法行为的工具,它允许在函数执行前后执行额外的代码。这种机制对于日志记录、性能分析等场景非常有用。以下是一个简单的装饰器示例:

def my_decorator(func):
    def wrapper(*args, **kwargs):
        print("Before function execution")
        result = func(*args, **kwargs)
        print("After function execution")
        return result
    return wrapper

@my_decorator
def my_function():
    print("Inside the function")

# 调用被装饰的函数
my_function()

在这个例子中,my_decorator 装饰器将在调用 my_function 函数前后分别输出一条信息。通过 @my_decorator 的语法糖,我们可以方便地将装饰器应用到目标函数上。

通过深入学习和应用迭代器、生成器和装饰器,你将能够写出更具可读性、灵活性和高效性的Python代码。这些概念的巧妙使用为编程提供了更多的可能性,也为处理复杂问题提供了便捷的工具。希望本文对你理解和运用这些概念时有所帮助。

进一步深入:迭代器的应用

迭代器不仅仅用于简单的数值序列,还广泛应用于文件读取、数据库查询等场景。下面是一个迭代器在文件读取中的示例:

class FileLineIterator:
    def __init__(self, file_path):
        self.file_path = file_path

    def __iter__(self):
        self.file = open(self.file_path, 'r')
        return self

    def __next__(self):
        line = self.file.readline()
        if line:
            return line.strip()
        else:
            self.file.close()
            raise StopIteration

# 使用文件行迭代器
file_iterator = FileLineIterator('sample.txt')
for line in file_iterator:
    print(line)

在这个例子中,FileLineIterator 迭代器可以逐行读取文件内容,使得文件处理更加高效,尤其是在处理大型文件时。

生成器的无限序列

生成器非常适合表示无限序列,因为它们可以在需要时动态生成值,而不是一次性生成所有值。下面是一个生成器表示斐波那契数列的例子:

def fibonacci_generator():
    a, b = 0, 1
    while True:
        yield a
        a, b = b, a + b

# 输出斐波那契数列前十项
fibonacci = fibonacci_generator()
for _ in range(10):
    print(next(fibonacci))

在这个例子中,fibonacci_generator 生成器能够无限产生斐波那契数列的值,而不需要事先确定生成的个数。

装饰器链

装饰器可以链式调用,通过这种方式,可以将多个装饰器组合起来,实现更复杂的功能。以下是一个使用两个装饰器的示例:

def uppercase_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def exclamation_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + "!"
    return wrapper

@exclamation_decorator
@uppercase_decorator
def greet(name):
    return f"Hello, {name}"

# 调用被装饰的函数
print(greet("John"))

在这个例子中,greet 函数被 uppercase_decoratorexclamation_decorator 两个装饰器依次修饰,实现了将问候语转为大写并添加感叹号的效果。

通过这些例子,我们更全面地了解了迭代器、生成器和装饰器在Python编程中的应用。这些概念的灵活使用可以使代码更为优雅、可维护,同时提高程序的性能和可读性。希望本文对你深入理解这些Python编程中的重要概念有所帮助。

迭代器与生成器的性能优势

除了提供便捷的语法和更优雅的代码结构外,迭代器和生成器还带来了明显的性能优势,特别是在处理大规模数据时。下面的例子演示了使用生成器来计算斐波那契数列的性能提升:

import time

# 使用普通函数计算斐波那契数列
def fibonacci_list(n):
    result = []
    a, b = 0, 1
    for _ in range(n):
        result.append(a)
        a, b = b, a + b
    return result

# 使用生成器计算斐波那契数列
def fibonacci_generator(n):
    a, b = 0, 1
    for _ in range(n):
        yield a
        a, b = b, a + b

# 计算并比较执行时间
start_time = time.time()
fibonacci_list_result = fibonacci_list(100000)
end_time = time.time()
print(f"List-based Fibonacci took {end_time - start_time} seconds")

start_time = time.time()
fibonacci_generator_result = list(fibonacci_generator(100000))
end_time = time.time()
print(f"Generator-based Fibonacci took {end_time - start_time} seconds")

通过将生成器的结果转换为列表进行比较,我们可以看到生成器版本的斐波那契数列计算在性能上具有显著的优势。这是因为生成器是惰性计算的,只在需要时生成值,而不是一次性生成整个序列,从而节省了内存和计算资源。

装饰器的实际应用:性能分析

装饰器还常用于实现性能分析,通过记录函数的执行时间来帮助开发者找出代码中的性能瓶颈。以下是一个简单的性能分析装饰器的例子:

import time

def performance_analyzer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"{func.__name__} took {end_time - start_time} seconds to execute")
        return result
    return wrapper

# 应用性能分析装饰器
@performance_analyzer
def time_consuming_operation():
    time.sleep(2)
    print("Operation completed")

# 调用被装饰的函数
time_consuming_operation()

这个装饰器 performance_analyzer 输出了被装饰函数的执行时间,帮助开发者更好地理解代码的性能特征,从而进行优化。

通过这些例子,我们不仅深入了解了迭代器、生成器和装饰器的语法和应用,还看到了它们在实际开发中如何提高代码的性能和可维护性。这些概念是Python编程中非常强大且常用的工具,对于任何想要深入学习Python的开发者来说,它们都是必备的知识点。

迭代器、生成器和装饰器的结合应用

将迭代器、生成器和装饰器结合使用可以产生强大而灵活的代码结构。以下示例展示了如何使用装饰器来实现一个缓存机制,提高生成器的性能:

import time

def cache_decorator(func):
    cache = {}

    def wrapper(*args, **kwargs):
        key = (args, frozenset(kwargs.items()))
        if key in cache:
            print("Result fetched from cache")
            return cache[key]
        else:
            result = func(*args, **kwargs)
            cache[key] = result
            return result

    return wrapper

@cache_decorator
def slow_computation(x, y):
    time.sleep(2)
    return x + y

# 第一次调用,执行缓慢的计算
result_1 = slow_computation(3, 4)
print(f"Result 1: {result_1}")

# 第二次调用,结果从缓存中获取
result_2 = slow_computation(3, 4)
print(f"Result 2: {result_2}")

在这个例子中,cache_decorator 装饰器为 slow_computation 函数提供了缓存功能。第一次调用时,函数执行较慢,结果被缓存。第二次调用时,结果直接从缓存中获取,避免了重复计算。

更复杂的生成器应用:无锁协程

生成器还可以用于实现协程,一种轻量级的并发编程模型。以下是一个简单的无锁协程的示例:

def coroutine_example(name):
    print(f"Coroutine {name} started")
    for i in range(5):
        print(f"Coroutine {name} processing step {i}")
        yield
    print(f"Coroutine {name} finished")

# 创建两个协程
coroutine1 = coroutine_example("A")
coroutine2 = coroutine_example("B")

# 交替执行协程步骤
for _ in range(5):
    next(coroutine1)
    next(coroutine2)

在这个例子中,coroutine_example 生成器模拟了一个简单的协程,它在执行过程中可以被中断,允许其他协程执行。通过交替调用两个协程的 next 方法,我们实现了一种简单的无锁并发模型。

装饰器在Web框架中的应用

在Web开发中,装饰器也经常用于实现路由、身份验证等功能。以下是一个简化的Web框架的示例:

from flask import Flask

app = Flask(__name__)

def route_decorator(path):
    def wrapper(func):
        def inner_wrapper(*args, **kwargs):
            result = func(*args, **kwargs)
            return f"Path: {path}, Result: {result}"
        return inner_wrapper
    return wrapper

@route_decorator("/home")
def home():
    return "Welcome to the home page"

@route_decorator("/about")
def about():
    return "Learn more about us"

if __name__ == "__main__":
    app.run()

在这个例子中,route_decorator 装饰器接受一个路径参数,并将被装饰的函数的结果与路径信息组合返回。通过这样的装饰器,我们可以方便地定义Web应用的路由和处理函数。

通过这些综合的示例,我们看到了迭代器、生成器和装饰器如何在不同的场景中协同工作,提供了更加灵活和强大的编程工具。这些概念的深入理解和熟练应用将极大地提升你的Python编程技能。

迭代器与生成器的组合:管道式数据处理

迭代器和生成器的结合应用常常用于创建管道式的数据处理,使得数据流能够经过一系列的处理步骤,实现清晰且可维护的代码。以下是一个简单的管道式数据处理示例:

def numbers_producer(n):
    for i in range(1, n + 1):
        yield i

def square_mapper(numbers):
    for num in numbers:
        yield num * num

def filter_even(numbers):
    for num in numbers:
        if num % 2 == 0:
            yield num

def main_pipeline(n):
    numbers = numbers_producer(n)
    squared_numbers = square_mapper(numbers)
    even_numbers = filter_even(squared_numbers)

    for result in even_numbers:
        print(result)

# 使用管道处理数据
main_pipeline(10)

在这个例子中,numbers_producer 生成器产生一组数字,然后通过 square_mapper 生成器将每个数字平方,最后通过 filter_even 过滤出偶数。整个过程通过简洁的管道结构实现了数据的处理流程。

装饰器在测试中的应用

装饰器在测试中也有着广泛的应用,例如用于计算函数执行时间、检查函数调用参数等。以下是一个简单的测试装饰器示例:

import time

def test_duration_decorator(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print(f"Test {func.__name__} took {end_time - start_time} seconds")
        return result
    return wrapper

@test_duration_decorator
def expensive_operation():
    time.sleep(2)
    print("Operation completed")

# 调用被测试的函数
expensive_operation()

在这个例子中,test_duration_decorator 装饰器用于测量函数执行的时间,使得在测试阶段能够方便地获取函数性能信息。

生成器表达式的简洁性

除了常规的生成器外,Python还引入了生成器表达式,提供了一种更为简洁的生成器语法。以下是一个使用生成器表达式的例子:

# 使用生成器表达式生成斐波那契数列
fibonacci = (a if a % 2 == 0 else 0 for a in range(10))
print(list(fibonacci))

这个例子中,生成器表达式一行代码就生成了一个斐波那契数列,展示了生成器表达式在简单场景中的强大和简洁。

通过这些例子,我们更全面地了解了迭代器、生成器和装饰器在不同场景中的应用。它们的结合使用为编写高效、清晰和易于维护的代码提供了强大的工具。希望这些实际应用的示例能够帮助你更好地掌握这些核心概念。

迭代器、生成器和装饰器的高级应用

异步编程中的生成器

在异步编程中,生成器也发挥着重要作用。通过使用 asyncawait 关键字,可以创建异步生成器,实现非阻塞的协程操作。以下是一个简单的异步生成器的例子:

import asyncio

async def async_data_producer(n):
    for i in range(1, n + 1):
        await asyncio.sleep(1)  # 模拟异步操作
        yield i

async def async_square_mapper(numbers):
    async for num in numbers:
        yield num * num

async def async_main_pipeline(n):
    numbers = async_data_producer(n)
    squared_numbers = async_square_mapper(numbers)

    async for result in squared_numbers:
        print(result)

# 使用异步生成器处理数据
asyncio.run(async_main_pipeline(5))

在这个例子中,async_data_producer 异步生成器产生一组数字,async_square_mapper 异步生成器将每个数字平方。整个过程通过异步生成器实现,能够充分利用异步编程的优势。

装饰器的参数化

装饰器也可以接受参数,实现更加灵活的功能。以下是一个接受参数的装饰器的示例:

def repeat(n_times):
    def decorator(func):
        def wrapper(*args, **kwargs):
            for _ in range(n_times):
                result = func(*args, **kwargs)
                print(f"Repeat {n_times}: {result}")
            return result
        return wrapper
    return decorator

@repeat(n_times=3)
def greet(name):
    return f"Hello, {name}"

# 调用被装饰的函数
greet("Alice")

在这个例子中,repeat 装饰器接受一个参数 n_times,表示重复调用被装饰的函数的次数。通过这种方式,我们可以方便地在不同的情境下使用相同的装饰器,但调整其行为。

多个装饰器的堆叠

Python 允许将多个装饰器叠加在一起,形成装饰器的堆叠。这种方式可以使代码更加模块化,每个装饰器只关注一个方面的功能。以下是一个使用多个装饰器的示例:

def uppercase_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result.upper()
    return wrapper

def exclamation_decorator(func):
    def wrapper(*args, **kwargs):
        result = func(*args, **kwargs)
        return result + "!"
    return wrapper

@exclamation_decorator
@uppercase_decorator
def greet(name):
    return f"Hello, {name}"

# 调用被装饰的函数
print(greet("Bob"))

在这个例子中,greet 函数被先应用 uppercase_decorator 装饰器,然后再应用 exclamation_decorator 装饰器,形成了装饰器的堆叠。

通过这些高级应用的示例,我们深入了解了迭代器、生成器和装饰器在异步编程、参数化和堆叠方面的强大功能。这些概念的灵活运用可以帮助我们处理更为复杂和实际的编程场景。

使用生成器进行无限流处理

生成器在处理无限流数据时表现得尤为强大。下面的例子展示了如何使用生成器处理无限流数据,实现一个简单的素数生成器:

def primes_generator():
    primes = []  # 存储已发现的素数
    num = 2       # 从2开始检查素数

    while True:
        is_prime = all(num % prime != 0 for prime in primes)
        if is_prime:
            primes.append(num)
            yield num
        num += 1

# 使用素数生成器打印前十个素数
primes = primes_generator()
for _ in range(10):
    print(next(primes))

在这个例子中,primes_generator 是一个无限生成素数的生成器。通过不断检查新的数字是否能够整除已知的素数,从而实现了一个简单但高效的素数生成器。

装饰器的异常处理

装饰器还可以用于异常处理,为函数调用提供额外的错误处理逻辑。以下是一个用于记录异常信息的装饰器示例:

def exception_logger(func):
    def wrapper(*args, **kwargs):
        try:
            result = func(*args, **kwargs)
            return result
        except Exception as e:
            print(f"Exception in {func.__name__}: {str(e)}")
            raise  # 继续抛出异常
    return wrapper

@exception_logger
def divide(a, b):
    return a / b

# 调用被装饰的函数
result = divide(5, 0)

在这个例子中,exception_logger 装饰器捕获了被装饰函数的异常,并打印了异常信息。这样的装饰器可以用于记录、报告异常,并且可以方便地应用到多个函数中。

装饰器在缓存中的应用

装饰器还可以用于实现缓存,避免重复计算。以下是一个使用装饰器实现缓存的例子:

def cache_decorator(func):
    cache = {}

    def wrapper(*args, **kwargs):
        key = (args, frozenset(kwargs.items()))
        if key in cache:
            print("Result fetched from cache")
            return cache[key]
        else:
            result = func(*args, **kwargs)
            cache[key] = result
            return result

    return wrapper

@cache_decorator
def expensive_operation(x, y):
    time.sleep(2)
    return x + y

# 第一次调用,执行缓慢的计算
result_1 = expensive_operation(3, 4)
print(f"Result 1: {result_1}")

# 第二次调用,结果从缓存中获取
result_2 = expensive_operation(3, 4)
print(f"Result 2: {result_2}")

在这个例子中,cache_decorator 装饰器为 expensive_operation 函数提供了缓存功能。第一次调用时,函数执行较慢,结果被缓存。第二次调用时,结果直接从缓存中获取,避免了重复计算。

通过这些实际应用的例子,我们更深入地了解了生成器在处理无限流数据中的优势,以及装饰器在异常处理、缓存等方面的实用性。这些概念的巧妙运用能够为代码提供更多的功能和灵活性。

总结:

在本文中,我们深入探讨了Python编程中三个核心概念:迭代器、生成器和装饰器。通过具体的代码实例和详细的解析,我们对这些概念的基础用法和高级应用有了全面的了解。

首先,我们学习了迭代器的基本概念和用法,它是用于遍历集合元素的对象,通过实现__iter__()__next__()方法实现。迭代器的应用不仅仅局限于数值序列,还可以用于文件读取等场景。

其次,我们深入研究了生成器的强大功能。生成器通过使用yield关键字实现了一种更为简洁、高效的迭代器方式,尤其适用于处理大规模数据时,能够有效降低内存消耗。

然后,我们学习了装饰器的基础知识和实际应用。装饰器是用于修改函数或方法行为的工具,通过实例化一个闭包函数实现。我们通过装饰器在测试、性能分析、Web框架等方面的应用,深入理解了装饰器的多样化用途。

接着,我们展示了这三个概念的高级应用。在异步编程中,我们使用生成器实现了异步协程;通过装饰器的参数化和堆叠,我们增加了这些概念的灵活性;在无限流处理和异常处理中,我们发现生成器和装饰器的强大优势。

最后,我们通过实际场景的例子,如无限流处理、异常处理、缓存等,深入理解了这些概念在实际开发中的应用。生成器和装饰器的高级用法为我们提供了更多解决问题的工具,使得代码更为优雅、清晰和高效。

总体而言,迭代器、生成器和装饰器是Python编程中的关键工具,它们不仅提高了代码的可读性和灵活性,还为处理各种编程场景提供了有效的解决方案。通过深入理解和熟练运用这些概念,我们能够写出更为强大、高效的Python代码。

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

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

相关文章

准备车载测试面试的小伙伴,赶紧看起来!

随着现代汽车的电子化程度越来越高&#xff0c;汽车总线系统也变得越来越复杂。汽车总线测试是一项重要的任务&#xff0c;它有助于确定车辆电子系统中的问题&#xff0c;并保障车辆的安全和可靠性。 CAN总线…… 控制器区域网&#xff08;Controller Area Network&#xff0c…

from tensorflow.keras.layers import Dense,Flatten,Input报错无法引用

from tensorflow.keras.layers import Dense,Flatten,Input 打印一下路径&#xff1a; import tensorflow as tf import keras print(tf.__path__) print(keras.__path__) [E:\\开发工具\\pythonProject\\studyLL\\venv\\lib\\site-packages\\keras\\api\\_v2, E:\\开发工具\\…

什么是人才储备?如何做人才储备?

很多小伙伴都会有企业面试被拒的情况&#xff0c;然后HR会告诉你&#xff0c;虽然没有录用你&#xff0c;但是你进入了他们的人才储备库&#xff0c;那么这个储备库有什么作用和特点呢&#xff1f;我们如何应用人才测评系统完善人才储备库呢&#xff1f; 人才储备一般有以下三…

备考2025年AMC8数学竞赛:2000-2024年AMC8真题练一练

想了解如何提高小学和初中数学成绩&#xff1f;小学和初中可以参加的数学竞赛有哪些&#xff1f;不妨看看AMC8美国数学竞赛&#xff0c;现在许多小学生和初中生都在参加这个比赛。如果孩子有兴趣&#xff0c;有余力的话可以系统研究AMC8的历年真题&#xff0c;即使不参加AMC8竞…

链式插补 (MICE):弥合不完整数据分析的差距

导 读 数据缺失可能会扭曲结果&#xff0c;降低统计功效&#xff0c;并且在某些情况下&#xff0c;导致估计有偏差&#xff0c;从而破坏从数据中得出的结论的可靠性。 处理缺失数据的传统方法&#xff08;例如剔除或均值插补&#xff09;通常会引入自己的偏差或无法充分利用数…

鸿蒙Harmony应用开发—ArkTS声明式开发(自定义事件分发)

ArkUI在处理触屏事件时&#xff0c;会在触屏事件触发前进行按压点和组件区域的触摸测试&#xff0c;来收集需要响应触屏事件的组件&#xff0c;再基于触摸测试结果分发相应的触屏事件。在父节点&#xff0c;开发者可以通过onChildTouchTest决定如何让子节点去做触摸测试&#x…

《Spring Security 简易速速上手小册》第6章 Web 安全性(2024 最新版)

文章目录 6.1 CSRF 防护6.1.1 基础知识详解CSRF 攻击原理CSRF 防护机制最佳实践 6.1.2 重点案例&#xff1a;Spring Security 中的 CSRF 防护案例 Demo测试 CSRF 防护 6.1.3 拓展案例 1&#xff1a;自定义 CSRF 令牌仓库案例 Demo测试自定义 CSRF 令牌仓库 6.1.4 拓展案例 2&am…

Python:运算符、内置函数和序列基本用法

一、学习目标 1&#xff0e;熟练使用Python运算符。 2&#xff0e;熟练使用Python内置函数。 3&#xff0e;掌握输入、输出函数的使用方法。 4&#xff0e;了解列表、元组、字典、集合的概念和基本用法。 二、相关练习 1&#xff0e;输入一个自然数250&#xff0c;输出其…

pytest教程-13-conftest.py文件

上一小节我们学习了fixture的作用域&#xff0c;本小节我们学习一下pytest conftest.py文件的使用方法。 conftest.py文件的作用 conftest.py文件是pytest框架中的一个特殊文件&#xff0c;用于定义共享的设置、夹具(fixture)和钩子函数&#xff08;hook&#xff09;。 在py…

翻译论文:Beating Floating Point at its Own Game: Posit Arithmetic(一)

仅作记录学习使用&#xff0c;侵删 原文Beating Floating Point at its Own Game: Posit Arithmetic 参考翻译Posit: 替换IEE754的新方式 | SIGARCH 摘要 IEEE标准754浮点数&#xff08;浮点数&#xff09;的直接接点替换 Posit的优势 不需要区间算术或可变大小操作数 如…

PoC免写攻略

在网络安全领域&#xff0c;PoC&#xff08;Proof of Concept&#xff09;起着重要的作用&#xff0c;并且在安全研究、漏洞发现和漏洞利用等方面具有重要的地位。攻击方视角下&#xff0c;常常需要围绕 PoC 做的大量的工作。常常需要从手动测试开始编写 PoC&#xff0c;再到实…

Home Assistant:基于Python的智能家居开源系统详解

Home Assistant&#xff1a;基于Python的智能家居开源系统详解 在数字化和智能化的时代&#xff0c;智能家居系统成为了现代家庭的新宠。它们能够让我们更加方便地控制家中的各种设备&#xff0c;实现自动化和个性化的居住体验。其中&#xff0c;Home Assistant作为一款基于Pyt…

性能优化问题思考总结

INP 是什么&#xff1f; Interaction to Next Paint (INP) INP是一项指标&#xff0c;通过观察用户在访问网页期间发生的所有点击、点按和键盘互动的延迟时间&#xff0c;评估网页对用户互动的总体响应情况。 互动是指在同一逻辑用户手势期间触发的一组事件处理脚本。例如&a…

【AI Agent系列】【MetaGPT多智能体学习】3. 开发一个简单的多智能体系统,兼看MetaGPT多智能体运行机制

本系列文章跟随《MetaGPT多智能体课程》&#xff08;https://github.com/datawhalechina/hugging-multi-agent&#xff09;&#xff0c;深入理解并实践多智能体系统的开发。 本文为该课程的第四章&#xff08;多智能体开发&#xff09;的第一篇笔记。主要记录下多智能体的运行…

【论文精读】DALLE: Zero-Shot Text-to-Image Generation零样本文本到图像生成

文章目录 一、前言二、摘要三、方法&#xff08;一&#xff09;主要目标&#xff08;二&#xff09;stage 1&#xff1a;训练离散变分自动编码器&#xff08;dVAE&#xff09;&#xff08;三&#xff09;stage 2&#xff1a;训练自回归转换器&#xff08;四&#xff09;公式表达…

RT-Thread使用PWM时出现的问题(4.x版本)

编译出现问题 1. 发现对应的结构体没有相关参数 问题原因 这个字段是在后面的os版本新增的&#xff0c;导致前面的版本没法使用&#xff0c;这个字段是为了做兼容高级定时器部分的处理 处理方案 第一种最简单&#xff0c;就是升级os版本。&#xff08;推荐&#xff09;第二…

思维题(蓝桥杯 填空题 C++)

目录 题目一&#xff1a; ​编辑 代码&#xff1a; 题目二&#xff1a; 代码&#xff1a; 题目三&#xff1a; 代码&#xff1a; 题目四&#xff1a; 代码&#xff1a; 题目五&#xff1a; 代码&#xff1a; 题目六&#xff1a; 代码七&#xff1a; 题目八&#x…

10.selenium的基本使用

selenium是一个关于爬虫功能python的库&#xff0c;它的整体逻辑与之前的请求爬虫思路不同。selenium是模拟出一个浏览器&#xff0c;你通过代码操作这个浏览器从而获取一些信息&#xff0c;比如执行click()就相当于点击了浏览器中的某个元素&#xff0c;相当于是针对浏览器的鼠…

CSP-201712-2-游戏

CSP-201712-2-游戏 解题思路 初始化变量&#xff1a;定义整数变量n和k&#xff0c;分别用来存储小朋友的总数和淘汰的特定数字。然后定义了num&#xff08;用来记录当前报的数&#xff09;和peopleIndex&#xff08;用来记录当前报数的小朋友的索引&#xff09;。 初始化小朋…

《CrackCollect》

CrackCollect 类型&#xff1a;益智学习 视角&#xff1a;2d 乐趣点&#xff1a;趣味化英语学习&#xff0c;闯关增加学习动力 时间&#xff1a;2019 个人职责&#xff1a; 1、所有功能的策划讨论 2、所有开发工作 3、所有上架工作 此游戏旨在针对英语水平处于初级阶段的人&…