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

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

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

IMG_20231006_183505

迭代器(Iterators)

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

class MyIterator:def __init__(self, start, end):self.current = startself.end = enddef __iter__(self):return selfdef __next__(self):if self.current < self.end:result = self.currentself.current += 1return resultelse: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 = startwhile current < end:yield currentcurrent += 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 resultreturn 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_pathdef __iter__(self):self.file = open(self.file_path, 'r')return selfdef __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, 1while True:yield aa, 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 wrapperdef 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, 1for _ in range(n):result.append(a)a, b = b, a + breturn result# 使用生成器计算斐波那契数列
def fibonacci_generator(n):a, b = 0, 1for _ in range(n):yield aa, 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 timedef 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 resultreturn wrapper# 应用性能分析装饰器
@performance_analyzer
def time_consuming_operation():time.sleep(2)print("Operation completed")# 调用被装饰的函数
time_consuming_operation()

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

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

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

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

import timedef 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] = resultreturn resultreturn 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}")yieldprint(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 Flaskapp = 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_wrapperreturn 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 idef square_mapper(numbers):for num in numbers:yield num * numdef filter_even(numbers):for num in numbers:if num % 2 == 0:yield numdef 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 timedef 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 resultreturn 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 asyncioasync def async_data_producer(n):for i in range(1, n + 1):await asyncio.sleep(1)  # 模拟异步操作yield iasync def async_square_mapper(numbers):async for num in numbers:yield num * numasync 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 resultreturn wrapperreturn 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 wrapperdef 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 numnum += 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 resultexcept 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] = resultreturn resultreturn 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.mzph.cn/news/714065.shtml

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

相关文章

PaddleOCR的部署教程(实操环境安装、数据集制作、实际应用案例)

文章目录 前言 PaddleOCR简介 一、PaddleOCR环境搭建 因为我之前安装过cuda和cudnn&#xff0c;查看cuda的版本根据你版本安装合适的paddlepaddle版本&#xff08;之前没有安装过cuda的可以看我这篇文章Ubuntu20.04配置深度学习环境yolov5最简流程&#xff09; 1.创建一个…

【C++从0到王者】第四十八站:最短路径

文章目录 一、最短路径二、单源最短路径 -- Dijkstra算法1.单源最短路径问题2.算法思想3.代码实现4.负权值带来的问题 三、单源最短路径 -- Bellman-Ford算法1.算法思想2.算法实现3.SPFA优化4.负权回路 四、多源最短路径 -- Floyd-Warshall算法1.算法思想2.算法实现 一、最短路…

Python调用ChatGPT API使用国内中转key 修改接口教程

大家好&#xff0c;我是淘小白~ 有的客户使用4.0的apikey ,直接使用官方直连的apikey消费很高&#xff0c;有一位客户一个月要消费2万&#xff0c;想使用4.0中转的apikey&#xff0c;使用中转的apikey 需要修改官方的openai库&#xff0c;下面具体说下。 1、首先确保安装的op…

Java ElasticSearch-Linux面试题

Java ElasticSearch-Linux面试题 前言1、守护线程的作用&#xff1f;2、链路追踪Skywalking用过吗&#xff1f;3、你对G1收集器了解吗&#xff1f;4、你们项目用的什么垃圾收集器&#xff1f;5、内存溢出和内存泄露的区别&#xff1f;6、什么是Spring Cloud Bus&#xff1f;7、…

安装ProxySQL,教程及安装链接(网盘自提)

一、网盘下载&#xff0c;本地直传 我网盘分享的是proxysql-2.5.5-1-centos8.x86_64.rpm&#xff0c;yum或者dnf直接安装就行 提取码&#xff1a;rhelhttps://pan.baidu.com/s/1nmx8-h8JEhrxQE3jsB7YQw 官方安装地址 官网下载地址https://repo.proxysql.com/ProxySQL/ 二、…

【AIGC】“光影交织的恋曲:绝美情侣在蓝天下的深情互动“

外貌特征 (Physical Appearance)&#xff1a;给远景镜头&#xff0c;这对情侣拥有出众的容貌和气质。男子身材挺拔&#xff0c;五官立体鲜明&#xff0c;阳光洒在他俊朗的脸庞上&#xff0c;更显英气逼人&#xff1b;女子则拥有一头柔顺亮丽的秀发&#xff0c;明亮的眼睛如同星…

GPT-4论文精读【论文精读·53】

Toolformer 今天我们来聊一下 GPT 4&#xff0c;但其实在最开始准备这期视频的时候&#xff0c;我是准备讲 Toolformer 这篇论文的&#xff0c;它是 Meta AI 在2月初的时候放出来的一篇论文。说这个大的语言模型可以利用工具了&#xff0c;比如说它就可以去调用各种各样的API&a…

腾讯云优惠券领取的三个渠道,一个比一个优惠!

腾讯云代金券领取渠道有哪些&#xff1f;腾讯云官网可以领取、官方媒体账号可以领取代金券、完成任务可以领取代金券&#xff0c;大家也可以在腾讯云百科蹲守代金券&#xff0c;因为腾讯云代金券领取渠道比较分散&#xff0c;腾讯云百科txybk.com专注汇总优惠代金券领取页面&am…

Unity(第二十四部)UI

在游戏开发中&#xff0c;用户界面&#xff08;UI&#xff09;是至关重要的一部分。它负责与玩家进行交互&#xff0c;提供信息&#xff0c;并增强游戏的整体体验。Unity 提供了强大的工具和功能来创建和管理 UI。 ui的底层就是画布&#xff0c;创建画布的时候会同时创建一个事…

C++ STL标准程序库开发指南学习笔记

一、类模板简介&#xff1a; 在现今的C标准模板库中&#xff0c;几乎所有的东西都被设计为template形式&#xff0c;不支持模板&#xff0c;就无法使用标准程序库。模板库可以认为是针对一个或多个尚未明确的类型而编写一套函数或类型。模板是C的一个新特性。通过使用模板&…

【前端素材】推荐优质电商类后台管理系统网页Vuesax平台模板(附源码)

一、需求分析 在线后台管理系统是指供管理员或运营人员使用的Web应用程序&#xff0c;用于管理和监控网站、应用程序或系统的运行和数据。它通常包括一系列工具和功能&#xff0c;用于管理用户、内容、权限、数据等。下面是关于在线后台管理系统的详细分析&#xff1a; 1、功…

前端 css 实现标签的效果

效果如下图 直接上代码&#xff1a; <div class"label-child">NEW</div> // css样式 // 父元素 class .border-radius { position: relative; overflow: hidden; } .label-child { position: absolute; width: 150rpx; height: 27rpx; text-align: cente…

web服务器nginx下载及在win11的安装

一.背景 还是为了公司安排的师带徒任务。 操作系统版本&#xff1a;win11 家庭版 mginx版本&#xff1a;1.24.0 二.nginx版本选择与下载 我之前也写过下载nginx下载_ngnix stable 下载-CSDN博客 不想看寻找过程的&#xff0c;直接点这里去下载https://nginx.org/download…

【王道操作系统】ch1计算机系统概述-04操作系统结构

文章目录 【王道操作系统】ch1计算机系统概述-04操作系统结构操作系统的内核操作系统的体系结构考纲新增内容&#xff08;红色为全新内容&#xff0c;黄色为原有内容&#xff09;&#xff1a;01 分层结构02 模块化03 宏内核&#xff08;大内核&#xff09;和微内核04 外核 【王…

redis03 八种数据类型

思维草图 String类型 字符串类型&#xff0c;是redis中最简单的存储类型&#xff0c;可以包含任何数据&#xff0c;例如jpg图片或者序列化的对象等&#xff0c;底层都是以字节数组形式存储&#xff0c;最大能存储512MB的数据。 常用命令 KEY命名规范 加前缀&#xff0c;分…

802.11局域网的 MAC 帧

目录 802.11 局域网的 MAC 帧 802.11 数据帧的三大部分 1.关于 802.11 数据帧的地址 最常用的两种情况 2.序号控制字段、持续期字段和帧控制字段 802.11 局域网的 MAC 帧 802.11 帧共有三种类型&#xff1a;控制帧、数据帧和管理帧。 802.11 数据帧的三大部分 MAC 首部&…

基于 STM32U5 片内温度传感器正确测算温度

目录预览 1、引言 2、问题 3、小结 01 引言 STM32 在内部都集成了一个温度传感器&#xff0c;STM32U5 也不例外。这个位于晶圆上的温度传感器虽然不太适合用来测量外部环境的温度&#xff0c;但是用于监控晶圆上的温度还是挺好的&#xff0c;以防止芯片过温运行。 02 问题…

sqllabs第五关floor报错注入

实验环境sqllabs第五关 floor()报错注入的原因是group by在向临时表插入数据时&#xff0c;由于rand()多次计算导致插入临时表时主键重复&#xff0c;从而报错&#xff0c;又因为报错前concat()中的SQL语句或函数被执行&#xff0c;所以该语句报错且被抛出的主键是SQL语句或函…

深入理解Lambda表达式:基础概念与实战演练【第114篇—python:Lambda表达式】

深入理解Lambda表达式&#xff1a;基础概念与实战演练 在现代编程语言中&#xff0c;Lambda表达式作为一种轻量级的匿名函数形式&#xff0c;越来越受到程序员的青睐。特别是在函数式编程兴起的今天&#xff0c;Lambda表达式在简化代码、提高可读性方面发挥着重要作用。本文将…

C++笔记(六)--- 静态成员变量/函数(static)

目录 C语言中静态变量 C静态成员变量 C静态成员函数 C语言中静态变量 1.函数内部用static修饰的变量&#xff0c;只能在此函数使用&#xff0c;但所修饰的变量不随函数释放而释放&#xff0c;下次调用时的值仍为上次结束时的值2.static修饰的全局变量只能在其定义的文件使用…