学习日志011--模块,迭代器与生成器,正则表达式
一、python模块
在之前学习c语言时,我们学了分文件编辑,那么在python中是否存在类似的编写方式?答案是肯定的。python中同样可以实现分文件编辑。甚至还有更多的好处:
-
提高代码的可维护性:当代码被分成多个文件时,每个文件可以专注于实现特定的功能或模块。这使得查找和修复错误变得更加容易。可以更方便地对代码进行局部修改,而不需要浏览整个项目的代码。
-
增强代码的可读性:分文件编程允许开发者使用描述性的文件名,这些文件名能够清晰地传达文件内容或功能。每个文件的内容更加专注和精简,减少了代码的复杂性,使得其他开发者更容易理解代码的逻辑。
-
促进代码重用:将通用功能或模块独立成单独的文件,可以在多个项目或程序之间重用这些代码,而无需复制粘贴。通过导入所需的模块,可以轻松地复用代码,减少重复劳动和潜在的错误。
-
便于团队协作:在大型项目中,多个开发者可以同时编辑不同的文件,而不需要担心相互之间的冲突。使用版本控制系统(如Git)时,分文件编程使得跟踪变化、合并代码和解决冲突更加容易。
-
提高程序的加载速度:在需要时动态地导入模块,可以减少程序启动时的加载时间,因为只有在需要时才加载相关的代码。这对于大型应用程序尤其重要,可以显著提高程序的响应速度。
-
组织代码结构:通过将代码分成不同的文件,可以更容易地组织代码的结构,使其符合逻辑和功能上的划分。这有助于实现更清晰的层次结构和模块化设计。
-
便于单元测试:分文件编程使得为每个模块或功能编写单元测试变得更加容易。这有助于确保代码的正确性,并在修改代码时快速发现问题。
-
减少命名冲突:将代码分成不同的文件(模块)可以减少变量、函数和类名之间的命名冲突。每个文件可以有自己的命名空间,使得代码更加清晰和易于管理。
分文件编辑在Python编程中是一种非常有益的做法。它不仅提高了代码的质量,还使得开发和维护过程更加高效和顺畅。而这些一个个文件则在python称为模块
import
分文件编辑(模块)的关键字--import
不同文件在同一目录下时,可以直接使用import来引用该模块的内容,包括不限于函数,变量等
在Python中,如果你想要在同一个目录(文件夹)下导入一个模块,你需要确保几个关键点:
-
模块文件:确保你想要导入的文件是一个有效的Python模块,即以
.py为扩展名,并且包含了你想要导入的函数、类或变量。 -
init.py:如果你的模块位于一个包(包含多个模块的目录)中,确保包的目录中有一个
__init__.py文件。这个文件可以是空的,但它的存在会告诉Python这个目录应该被视为一个包。对于Python 3.3及以后的版本,即使没有__init__.py文件,包导入也可以工作,但最好还是包含这个文件以保持兼容性。 -
导入语句:使用正确的导入语句。如果你想要导入同目录下的
module_name.py文件中的内容,你可以简单地使用:import module_name或者,如果你想要导入该模块中的特定函数、类或变量,你可以使用:
from module_name import specific_function_or_class
包
什么是包
当我们使用模块的内容写代码时非常爽,可是当我们回头读代码时,看着一行行的import难免战战兢兢汗如雨下。为了让模块的引用更简洁,更直观。我们将类似的模块放入同一个文件夹内,并创建一个__init__.py作为标识符。这样的一个文件夹被称为包。这锅__init__是不是很熟悉,我们在创建类的时候也遇见过他哦

要在你的Python程序中使用包中的模块,你需要使用import语句来导入它们。你可以导入整个模块,也可以从模块中导入特定的函数、类或变量。
例如,要导入module1并使用function1,你可以这样做:
import mypackage.module1mypackage.module1.function1()
# 输出: This is function1 from module1.
或者,你可以直接从module1中导入function1:
from mypackage.module1 import function1function1()
# 输出: This is function1 from module1.
要导入子包中的模块,你可以使用类似的语法:
import mypackage.subpackage.module3mypackage.subpackage.module3.function3()
# 输出: This is function3 from subpackage.module3.
或者
from mypackage.subpackage import module3module3.function3()
# 输出: This is function3 from subpackage.module3.
在大多数情况下,只要你的包和模块位于你的脚本或当前工作目录的某个子目录中,Python就应该能够找到它们。在导入包或模块时,Python会按照sys.path列表中的目录顺序来查找它们。如果Python找不到你想要导入的包或模块,你可能需要将包含它们的目录添加到sys.path中。
import sysprint(sys.path)
输入这串代码后,你会得到一些文件目录
D:\\xn\\hqyj\\pythonProject\\.venv\\Lib\\site-packages'
其中这样的路径,打开后,就是存放包的地方。我们平时下载的包都存在这,你要是想的话也可以将自己定义的包放在这,这样以后不论在电脑哪里编写文件,都可以访问他们.
内置
除了自己编写或从网上下载外,python中还附带丰富的内置模块供给我们使用。
| 模块名称 | 模块描述 |
| os | os 模块提供了许多与操作系统交互的函数,例如创建、移动和删除文件和目录,以及访问环境变量等。 |
| sys | sys 模块提供了与 Python 解释器和系统相关的功能,例如解释器的版本和路径,以及与 stdin、stdout 和 stderr 相关的信息。 |
| time | time 模块提供了处理时间的函数,例如获取当前时间、格式化日期和时间、计时等。 |
| datetime | datetime 模块提供了更高级的日期和时间处理函数,例如处理时区、计算时间差、计算日期差等。 |
| math | math 模块提供了数学函数,例如三角函数、对数函数、指数函数、常数等。 |
| json | json 模块提供了 JSON 编码和解码函数,可以将 Python 对象转换为 JSON 格式,并从 JSON 格式中解析出 Python 对象。 |
| numpy | 一个用于维度数组计算的库 |
| opencv | 一个用于计算机视觉的库 |
| matplotlib | 一个用于数据可视化的库(绘图) |
| scikit-learn | 一个用于机器学习的库 |
| tensorflow | 一个用于深度学习的库 |
| threading | 一个用于设置多线程的库 |
二、迭代器与生成器。
迭代器
还记得我们学习高阶函数时的map()函数吗?那是留下了一个问题,map返回了一个迭代器对象。什么是迭代器,今天我们就将解答这个问题。
迭代器是一种集合,和我们之前学的列表,集合,元组类似。不同的是我们无法直接去看到他,只有在运行时才会出现。应为他的这种特性,在编写程序时可以节省大量的内存空间,而列表等数据类型,在定义时就确认大小了。此外一个迭代器类型包含__iter__,和__next__两种方法。从他们的宛若单链表名字上我们还可以看出迭代器的特性--不可回退性。那让我们来定义一个迭代器吧
class My_iter:def __init__(self,start,stop,step):self.start = startself.stop = stopself.step = stepdef __iter__(self):return selfdef __next__(self):if self.start < self.stop:x = self.startself.start += self.stepreturn xelse:raise StopIteration("迭代已完成")
my_iter = My_iter(1,10,2)
try:while True:print(next(my_iter))
except Exception as e:print(e)
这里我仿照range编写了一个简单的迭代器__init__来接受实例的数值,__iter__用来返回自生,__next__来推进迭代器.RAISE用来抛出异常,这样子死循环时,当迭代器结束时,循环也跟着结束。根据需要可以进行更改,但一定不要少了__iter__,__next__
生成器
在python中,使用了 yield 的函数就被称为——生成器。
yield 是一个关键字,用于定义生成器函数,生成器函数是一种特殊的函数,可以在迭代过程中逐步产生值,而不是一次性返回所有结果。
与普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单的理解【生成器就是一个迭代器】。
每次使用yield语句生产一个值之后,函数都将暂停执行【内存释放出来】,等待再次唤醒。
yield语句和return语句的差别就在于yield语句返回的是可迭代对象,而return返回的是不可迭代对象。
每次调用生成器的next()方法或者使用for或while循环进行迭代时,函数会从上次暂停的地方继续执行,直到再次遇见yield语句。
def create1(n):while n>0:yield nn -= 1
create_iter = create1(10)
for i in create_iter:print(i)
三、正则表达式
正则表达式(Regular Expression,简称 regex 或 regexp)是一种强大的文本处理工具,用于搜索、匹配和替换文本中的字符组合。它最初是由数学家Stephen Kleene在20世纪50年代提出的,作为描述字符串集合的一种方式,后来被广泛应用于编程语言和文本编辑器中。
正则表达式由一系列特殊字符和普通字符组成,这些特殊字符称为元字符(metacharacters),它们具有特殊的含义,用于匹配不同类型的字符或字符组合。例如,. 匹配任意单个字符,* 匹配前一个字符零次或多次,+ 匹配前一个字符一次或多次,[abc] 匹配方括号内的任意一个字符,`` 匹配字符串的开始,$ 匹配字符串的结束等。
通过组合这些元字符和普通字符,可以创建出复杂的模式来匹配特定的文本。例如,正则表达式 \d{3}-\d{2}-\d{4} 可以匹配美国社会保险号码的格式(如 123-45-6789),其中 \d 表示匹配任意数字,{3}、{2} 和 {4} 分别表示匹配前一个字符3次、2次和4次。
正则表达式在编程中非常有用,特别是在文本处理、数据验证、网络爬虫、日志分析等领域。许多编程语言都支持正则表达式,如Python、JavaScript、Java、Perl等,它们通常提供了内置的库或函数来处理正则表达式。
学习和使用正则表达式需要一定的时间和实践,因为正则表达式的语法和规则相对复杂。但是,一旦掌握了它的基本原理和常用模式,就可以大大提高文本处理的效率和准确性。
python中正则表达式是一个特殊的字符序列,它能帮助你方便的检查一个字符串是否与某种模式匹配。re模块使 Python 语言拥有全部的正则表达式功能。
re.match()
re.match() 是 Python 中正则表达式模块 re 的一个函数,用于从字符串的开始位置匹配正则表达式。如果匹配成功,它返回一个匹配对象;否则,它返回 None。
import re# 基本格式
match_object = re.match(pattern, string, flags=0)
pattern是正则表达式,string是字符串,flags是可选参数,用来实现复杂的功能
import repattern = r'\d+' # 匹配一个或多个数字
string = '123abc'match_object = re.match(pattern, string)if match_object:print('匹配成功:', match_object.group()) # 输出: 匹配成功: 123
else:print('匹配失败')
在这个例子中,正则表达式 \d+ 匹配一个或多个数字。由于字符串 '123abc' 以数字开头,所以匹配成功,并返回匹配对象。使用 group() 方法可以获取匹配的文本。
失败的情况
import repattern = r'\d+'
string = 'abc123'match_object = re.match(pattern, string)if match_object:print('匹配成功:', match_object.group())
else:print('匹配失败') # 输出: 匹配失败
使用的标志
import repattern = r'[A-Z]+' # 匹配一个或多个大写字母
string = 'Hello123'# 使用 re.IGNORECASE 标志,使匹配不区分大小写
match_object = re.match(pattern, string, re.IGNORECASE)if match_object:print('匹配成功:', match_object.group()) # 输出: 匹配成功: H
else:print('匹配失败')
re.search()
re.search() 是 Python 中正则表达式模块 re 的另一个核心函数。与 re.match() 不同的是,re.search() 会在整个字符串中搜索与正则表达式匹配的第一个位置,而不是仅仅从字符串的开始位置进行匹配。如果找到匹配项,它会返回一个匹配对象;否则,返回 None。
import re# 基本格式
match_object = re.search(pattern, string, flags=0)
示例
import repattern = r'\d+' # 匹配一个或多个数字
string = 'abc123def'match_object = re.search(pattern, string)if match_object:print('匹配成功:', match_object.group()) # 输出: 匹配成功: 123
else:print('匹配失败')
在这个例子中,正则表达式 \d+ 匹配一个或多个数字。字符串 'abc123def' 中包含数字 '123',所以 re.search() 找到匹配项并返回匹配对象。
使用标志
import repattern = r'[a-z]+' # 匹配一个或多个小写字母
string = '123ABCdef'# 使用 re.IGNORECASE 标志,使匹配不区分大小写
match_object = re.search(pattern, string, re.IGNORECASE)if match_object:print('匹配成功:', match_object.group()) # 输出: 匹配成功: ABC
else:print('匹配失败')
在这个例子中,虽然字符串 '123ABCdef' 中首先出现的是数字和大写字母,但由于使用了 re.IGNORECASE 标志,正则表达式 [a-z]+ 也能匹配到大写字母(实际上匹配到了 'ABC',因为它是第一个出现的小写或大写字母序列)。注意,这里的匹配是从左到右进行的,所以它会匹配到第一个符合条件的序列。
re.findall()
re.findall() 是 Python 中正则表达式模块 re 提供的一个函数,用于在整个字符串中查找所有与正则表达式匹配的子串,并将它们作为一个列表返回。如果没有找到任何匹配项,它将返回一个空列表。
import re# 基本格式
matches = re.findall(pattern, string, flags=0)
查找所有匹配项
import repattern = r'\d+' # 匹配一个或多个数字
string = 'abc123def456ghi789'matches = re.findall(pattern, string)
print(matches) # 输出: ['123', '456', '789']
在这个例子中,正则表达式 \d+ 匹配一个或多个数字。字符串 'abc123def456ghi789' 中包含三个数字序列 '123'、'456' 和 '789',所以 re.findall() 返回一个包含这些匹配项的列表。
使用标志
import repattern = r'[a-z]+' # 匹配一个或多个小写字母
string = 'Hello123World456'# 使用 re.IGNORECASE 标志,使匹配不区分大小写
matches = re.findall(pattern, string, re.IGNORECASE)
print(matches) # 输出: ['Hello', 'World']
三者区别
- re.match 从首字母匹配,如果字符串开始不符合正则表达式,则匹配失败,函数返回 None。
- re.search 匹配整个字符串,直到找到一个对应匹配【若有多个,也只返回第一个】。
- re.findall 返回匹配到的所有子串。
可选修饰符
正则表达式可以包含一些可选标志修饰符来控制匹配的模式。修饰符被指定为一个可选的标志。如 re.I | re.M 被设置成 I 和 M 标志:
| 修饰符 | 描述 |
| re.I | 使匹配对大小写不敏感。 |
| re.L | 做本地化识别(locale-aware)匹配。 |
| re.M | 多行匹配,影响 ^ 和 $。 |
| re.S | 使 . 匹配包括换行在内的所有字符。 |
| re.U | 根据Unicode字符集解析字符。这个标志影响 \w, \W, \b, \B。 |
| re.X | 该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。 |
import re
s = 'Good good study, Day day up'
ret = re.findall('good', s, re.I)
print(ret)
正则表达式模式
模式字符串使用特殊的语法来表示一个正则表达式。
- 字母和数字表示他们自身。
- 一个正则表达式模式中的字母和数字匹配同样的字符串。
- 多数字母和数字前加一个反斜杠时会拥有不同的含义。
- 标点符号只有被转义时才匹配自身,否则它们表示特殊的含义。
- 反斜杠本身需要使用反斜杠转义。
由于正则表达式通常都包含反斜杠,所以你最好使用原始字符串来表示它们。
正则表达式(Regular Expression,简称 regex 或 regexp)是一种用来匹配字符串中字符组合的模式。它主要用于搜索、替换和解析字符串。正则表达式由一些普通字符和特殊字符(称为元字符)组成,这些特殊字符赋予了正则表达式强大的匹配能力。
以下是一些常见的正则表达式模式和元字符的简介:
-
普通字符:
- 普通字符(如字母、数字、标点符号等)在正则表达式中匹配它们自身。
- 例如,正则表达式
abc会匹配字符串中的abc。
-
元字符:
.:匹配除换行符\n之外的任何单个字符。- ``:匹配字符串的开始位置。
$:匹配字符串的结束位置。*:匹配前面的字符零次或多次。+:匹配前面的字符一次或多次。?:匹配前面的字符零次或一次。{n}:匹配前面的字符恰好 n 次。{n,}:匹配前面的字符至少 n 次。{n,m}:匹配前面的字符至少 n 次,但不超过 m 次。[]:匹配方括号中的任意一个字符。例如,[abc]匹配a、b或c。|:表示或运算,例如a|b匹配a或b。():用于分组和捕获。例如,(abc)会捕获匹配到的abc。
import res1 ='AuhewoBhsoh023'try:def fun1(s:str):ret = re.match(r"[A-Z][a-z]*",s)if ret:print(ret.group())else:print("匹配不成功")fun1(s1)
except Exception as e:print(e)
from re import matchdef fun_1(s):ret = match(r"[a-zA-Z]+[\w]",s)if ret:print(ret.group())else:print("没有匹配到")s="_23onf"
fun_1(s)
import re
def fun3(pwd):ret = re.match(r'^\w{8,20}5$',pwd)if ret:print(ret.group())else:print("密码不正确")fun3("111122233344455")
-
转义字符:
\:用于转义元字符,使其匹配自身。例如,\.匹配点字符.。
-
字符类:
\d:匹配任意一个数字,相当于[0-9]。\D:匹配任意一个非数字字符,相当于[0-9]。\w:匹配任意一个字母、数字或下划线,相当于[A-Za-z0-9_]。\W:匹配任意一个非字母、非数字或非下划线字符,相当于[A-Za-z0-9_]。\s:匹配任意一个空白字符(包括空格、制表符、换行符等)。\S:匹配任意一个非空白字符。
import re
s = '__ 0434p波野菠萝- %^&*'
re1 = re.findall('.',s)
print(re1)re2 = re.findall(r'\d',s)
print(re2)re3 = re.findall(r'\D',s)
print(re3)re4 = re.findall(r'\w',s)
print(re4)re5 = re.findall(r'\W',s)
print(re5)re6 = re.findall(r'[_&]',s)
print(re6)
-
量词:
*?、+?、??:非贪婪匹配,尽可能少地匹配字符。{n,m}?:非贪婪匹配,匹配至少 n 次,但不超过 m 次,尽可能少地匹配。
-
断言:
- ``:匹配字符串的开始(前面没有其他字符)。
$:匹配字符串的结束(后面没有其他字符)。\b:匹配一个单词边界,即单词和空格之间的位置。\B:匹配非单词边界的位置。
-
捕获与分组:
(pattern):捕获匹配 pattern 的子串。(?:pattern):非捕获组,匹配 pattern 但不捕获。
import re#匹配出163、126、qq邮箱
myemail = '2042856895@qq.com'
ret = re.match(r'^\w{4,20}@(163|126|qq)\.com$', myemail)
print(ret.group())#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(\w*)><(\w*)>.*</\2></\1>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())#匹配出<html><h1>www.bawei.com</h1></html>
ret = re.match(r"<(?P<name1>\w*)><(?P<name2>\w*)>.*</(?P=name2)></(?P=name1)>", "<html><h1>www.hqyj.com</h1></html>")
print(ret.group())
-
替换与分组引用:
- 在替换字符串中,
\1、\2等表示捕获组的引用。
- 在替换字符串中,
正则表达式具有强大的灵活性和表达能力,但也因此可能变得复杂和难以阅读。在编写正则表达式时,建议逐步构建和测试,以确保其正确性和性能
re.split函数
功能是分割
import re
s = 'user:zhangsan pwd:888666'
ret = re.split(r':| ', s)
print(ret)
re.sub函数
功能是替换
import re
s = 'i am zhangsan, i am 18 year, i like eat'
ret = re.sub(r"i", "I", s)
print(ret)
相关文章:
学习日志011--模块,迭代器与生成器,正则表达式
一、python模块 在之前学习c语言时,我们学了分文件编辑,那么在python中是否存在类似的编写方式?答案是肯定的。python中同样可以实现分文件编辑。甚至还有更多的好处: 提高代码的可维护性:当代码被分成多个文件时…...
ChatGPT 搜索 vs Google 搜索
原文:Amanda Caswell - 2024.11.01 随着 OpenAI 推出的实时搜索功能,ChatGPT 正在逐步成为像 Google 这样的传统搜索引擎的竞争对手。ChatGPT 以其对话式的回答方式而闻名,它能够在没有广告干扰的情况下提供实时的上下文信息。 我迫不及待地…...
一文简单了解Android中的input流程
在 Android 中,输入事件(例如触摸、按键)从硬件传递到应用程序并最终由应用层消费。整个过程涉及多个系统层次,包括硬件层、Linux 内核、Native 层、Framework 层和应用层。我们将深入解析这一流程,并结合代码逐步了解…...
【MySQL】SQL语言
【MySQL】SQL语言 文章目录 【MySQL】SQL语言前言一、SQL的通用语法二、SQL的分类三、SQLDDLDMLDQLDCL 总结 前言 本篇文章将讲到SQL语言,包括SQL的通用语法,SQL的分类,以及SQL语言的DDL,DML,DQL,DCL。 一、SQL的通用语法 在学习具体的SQL语句之前,先来…...
5.4.2-1 编写Java程序在HDFS上创建文件
本次实战涉及使用Java操作Hadoop HDFS,包括创建文件、判断文件存在性及异常处理。通过手动添加依赖、启动HDFS服务,成功在HDFS上创建和检查文件。进一步探索了文件操作的最佳实践,如检查文件存在性以避免重复创建,以及处理HDFS安全…...
The 3rd Universal CupStage 15: Chengdu, November 2-3, 2024(2024ICPC 成都)
Problem L. Recover Statistics 题目意思: 给定a, b, c三个值,确保构造的数列中包含满足题目的数量 解题思路: 100 中 选择a 50个, b45个, c4个。 #include <iostream>using namespace std;using ll long …...
显示微服务间feign调用的日志
第一步 package com.niuniu.common.config;import com.niuniu.common.CommonConstant; import com.niuniu.common.utils.UserContext; import feign.Logger; import feign.RequestInterceptor; import feign.RequestTemplate; import org.springframework.context.annotation.…...
SOHO场景开局(小型,多子网):AP+管理型交换机+路由器+光猫
业务需求 1. 实现除光猫外,整网设备通过APP进行开局,开局部署完成后,能够通过APP远程运维。 2. 需要单独划分访客、办公、视频监控3个子网,其中访客子网供顾客无线上网使用,办公子网用于接入无线和有线办公终端&#x…...
Android - Pixel 6a 手机OS 由 Android 15 降级到 Android 14 操作记录
Pixel 6a 手机由 Android 14 升级到 Android 15了,但是由于一些原因又想降级回 Android 14, 能降吗?该怎么降级呢?本篇文章来记述实际操作过程,希望能给想做相同操作的人一些帮助。 答案当然是能降,而且我…...
linux系统kkFileView 配置https预览文件
思路: 1.kkfile的 context全局路径可以修改 context-path,比如:server.servlet.context-path 2.使用nginx反向代理 /kkfile 转发到 kkfile路径上 官网教程 kkFileView - 在线文件预览 1、配置config/application.properties. server.se…...
stm32——通用定时器时钟知识点
(该图来自小破站 铁头山羊老师的stm32标准库教学)...
前端无感刷新token
摘要: Axios 无感知刷新令牌是一种在前端应用中实现自动刷新访问令牌(access token)的技术,确保用户在进行 API 请求时不会因为令牌过期而中断操作 目录概览 XMLHttpRequestAxiosFetch APIJQuni.request注意事项: 访问…...
针对股票评论的情感分类器
🏡作者主页:点击! 🤖编程探索专栏:点击! ⏰️创作时间:2024年11月16日13点39分 神秘男子影, 秘而不宣藏。 泣意深不见, 男子自持重, 子夜独自沉。 论文链接 点击开启你的论文编程之旅…...
Day18 Nim游戏
你和你的朋友,两个人一起玩 Nim 游戏: 桌子上有一堆石头。 你们轮流进行自己的回合, 你作为先手 。 每一回合,轮到的人拿掉 1 - 3 块石头。 拿掉最后一块石头的人就是获胜者。 假设你们每一步都是最优解。请编写一个函数ÿ…...
理解反射,学会反射:撬开私有性质(private)的属性与方法
看到这句话的时候证明:此刻你我都在努力 加油陌生人 个人主页:Gu Gu Study专栏:用Java学习数据结构系列喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹喜欢的话可以点个赞谢谢了。作者:小…...
Redis在高性能缓存中的应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 Redis在高性能缓存中的应用 引言 Redis 概述 定义与原理 发展历程 Redi…...
菲涅耳全息图
菲涅耳全息图:记录介质在物光波场的菲涅耳衍射区(物体到记录介质表面的距离在菲涅耳衍射区内)。 一、点源全息图的记录和再现 1.1 记录 设物光波和参考光波是从点源O(xo, yo, zo)和点源 R(xr, yr, zr)发出的球面波, 波长为λ1, 全息底片位于z0 的平面上, 与两个点源…...
STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56
STM32 BootLoader 刷新项目 (十) Flash擦除-命令0x56 1. STM32F407 BootLoader 中的 Flash 擦除功能详解 在嵌入式系统中,BootLoader 的设计是非常关键的部分,它负责引导主程序的启动、升级以及安全管理。而在 STM32F407 等 MCU 上实现 BootLoader&…...
POI word转pdf乱码问题处理
1.使用poi 转换word文档成pdf 导入依赖 <dependency><groupId>com.aspose</groupId><artifactId>words</artifactId><version>16.8.0</version></dependency>2.代码实现: SneakyThrowspublic void wordToPdf(String docPath,…...
【GeekBand】C++设计模式笔记11_Builder_构建器
1. “对象创建” 模式 通过 “对象创建” 模式绕开new,来避免对象创建(new)过程中所导致的紧耦合(依赖具体类),从而支持对象创建的稳定。它是接口抽象之后的第一步工作。典型模式 Factory MethodAbstract …...
(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)
题目:3442. 奇偶频次间的最大差值 I 思路 :哈希,时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况,哈希表这里用数组即可实现。 C版本: class Solution { public:int maxDifference(string s) {int a[26]…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
基于当前项目通过npm包形式暴露公共组件
1.package.sjon文件配置 其中xh-flowable就是暴露出去的npm包名 2.创建tpyes文件夹,并新增内容 3.创建package文件夹...
如何将联系人从 iPhone 转移到 Android
从 iPhone 换到 Android 手机时,你可能需要保留重要的数据,例如通讯录。好在,将通讯录从 iPhone 转移到 Android 手机非常简单,你可以从本文中学习 6 种可靠的方法,确保随时保持连接,不错过任何信息。 第 1…...
Axios请求超时重发机制
Axios 超时重新请求实现方案 在 Axios 中实现超时重新请求可以通过以下几种方式: 1. 使用拦截器实现自动重试 import axios from axios;// 创建axios实例 const instance axios.create();// 设置超时时间 instance.defaults.timeout 5000;// 最大重试次数 cons…...
零基础在实践中学习网络安全-皮卡丘靶场(第九期-Unsafe Fileupload模块)(yakit方式)
本期内容并不是很难,相信大家会学的很愉快,当然对于有后端基础的朋友来说,本期内容更加容易了解,当然没有基础的也别担心,本期内容会详细解释有关内容 本期用到的软件:yakit(因为经过之前好多期…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
