【Python爬虫(1)】专栏开篇:夯实Python基础
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发者,都能从中汲取知识,助力掌握爬虫核心技能,开拓技术视野。
目录
- 一、引言
- 二、Python 语法基础
- 2.1 变量
- 2.2 数据类型
- 2.3 运算符
- 三、流程控制语句
- 3.1 if-else 语句
- 3.2 for 循环
- 3.3 while 循环
- 四、函数的定义与使用
- 4.1 函数定义
- 4.2 函数调用
- 4.3 函数参数
- 4.4 局部变量和全局变量
- 五、总结
一、引言
在如今这个数据驱动的时代,数据就如同宝贵的资源,而 Python 爬虫则是获取这些资源的有力工具。无论是从网页中提取新闻资讯、从电商平台获取商品信息,还是从社交媒体收集用户评论,Python 爬虫都能大显身手。
然而,要想熟练掌握 Python 爬虫技术,扎实的 Python 基础是必不可少的。这就好比建造高楼大厦,Python 基础就是那稳固的基石。只有打好了这个基础,我们才能在爬虫的学习道路上稳步前行,理解并运用各种爬虫技术和框架。接下来,就让我们一起回顾那些重要的 Python 基础知识吧。
二、Python 语法基础
2.1 变量
在 Python 中,变量就像是一个标签,我们可以把数据贴在这个标签上,方便后续使用。变量的命名需要遵循一定的规则:
- 首先,变量名必须以字母或者下划线开头,后续字符可以是字母、数字或者下划线 ,比如my_variable、_name、count123都是合法的变量名,而2hello、my-var就是不合法的。
- 同时,我们不能使用 Python 的保留字(关键字)作为变量名,像if、for、while这些都是保留字,是不能用来命名变量的。
- 此外,为了提高代码的可读性,我们尽量使用有意义的名字作为变量名,比如用age表示年龄,name表示姓名,而不是用单个字母a、n等。
变量的赋值使用等号=,比如age = 20,这就把整数 20 赋值给了变量age,之后我们使用age时,就相当于使用 20 这个值。Python 是动态类型语言,变量不需要预先声明类型,它会根据赋值自动确定类型。我们还可以在一行内给多个变量赋值,如x = y = z = 0,这样x、y、z都被赋值为 0;也可以同时给多个不同变量赋不同的值,a, b, c = 1, 2, “hello”,此时a为 1,b为 2,c为"hello"。
2.2 数据类型
- 整型(int):用来表示整数,没有小数部分,如age = 25,count = -10。在 Python 中,整型的范围很大,基本可以满足我们日常的计算需求。
- 浮点型(float):表示带有小数部分的数字,比如pi = 3.14,salary = 5000.5 。需要注意的是,浮点数在计算机中存储时可能存在精度问题,例如0.1 + 0.2在数学上等于0.3,但在 Python 中输出结果可能是0.30000000000000004,这是因为浮点数在计算机中是以二进制形式存储的,某些十进制小数无法精确地用二进制表示。
- 布尔型(bool):只有两个值,True和False,常用于条件判断和逻辑运算。比如is_student = True,is_adult = False 。在 Python 中,True本质上是 1,False本质上是 0,所以布尔型也可以参与一些算术运算,如True + 1结果为 2,False + 5结果为 5。
- 字符串(str):由一系列字符组成,用于表示文本数据。可以用单引号(‘)、双引号(")或三引号(’'‘或"“”)括起来,比如name = ‘Alice’,message = “Hello, World!”,poem = “”“This is a multi - line poem.
It has multiple lines.
“”” 。字符串支持很多操作,如拼接first_name = “John”,last_name = “Doe”,full_name = first_name + " " + last_name,此时full_name的值为"John Doe";还可以通过索引获取单个字符,message[0]得到的是’H’ 。 - 列表(list):是一种可变的有序序列,可以包含多个不同类型的元素,用方括号[]表示 ,如fruits = [‘apple’, ‘banana’, ‘cherry’],numbers = [1, 2, 3, 4],mixed = [1, ‘two’, 3.5, True] 。列表可以通过索引访问元素,fruits[0]得到’apple’ ,也可以通过append()方法添加元素,fruits.append(‘date’),此时fruits变为[‘apple’, ‘banana’, ‘cherry’, ‘date’] ,还可以使用del语句删除元素,del fruits[1],fruits就变为[‘apple’, ‘cherry’, ‘date’] 。
- 元组(tuple):与列表类似,也是有序的序列,但元组是不可变的,一旦创建就不能修改其内容,用圆括号()表示,例如coordinates = (10, 20),colors = (‘red’, ‘green’, ‘blue’) 。虽然元组不能修改元素,但可以通过索引访问元素,coordinates[0]得到 10。元组通常用于存储一些固定的数据,比如坐标、日期等。
- 字典(dict):是一种可变的无序映射类型,用于存储键值对,用花括号{}表示,每个键值对之间用冒号:分隔,不同键值对之间用逗号,分隔,如person = {‘name’: ‘Bob’, ‘age’: 30, ‘city’: ‘New York’} 。可以通过键来访问对应的值,person[‘name’]得到’Bob’ ,也可以修改值person[‘age’] = 31 ,还能添加新的键值对person[‘job’] = ‘Engineer’ 。
- 集合(set):是一个无序的、不包含重复元素的集合,用花括号{}或set()函数来定义,如nums = {1, 2, 3, 3, 4},实际存储的nums为{1, 2, 3, 4} ,重复的 3 被自动去除了。集合可以进行交集、并集、差集等运算,set1 = {1, 2, 3},set2 = {3, 4, 5},set1.intersection(set2)得到{3} ,set1.union(set2)得到{1, 2, 3, 4, 5} ,set1.difference(set2)得到{1, 2} 。
2.3 运算符
- 算术运算符:用于基本的数学运算,包括+(加)、-(减)、*(乘)、/(除)、%(取模,即取除法的余数)、**(幂运算)、//(取整除,返回商的整数部分)。例如:
a = 10
b = 3
print(a + b) # 输出13
print(a - b) # 输出7
print(a * b) # 输出30
print(a / b) # 输出3.3333333333333335
print(a % b) # 输出1
print(a ** b) # 输出1000
print(a // b) # 输出3
- 比较运算符:用于比较两个值的大小或是否相等,返回布尔值True或False ,包括==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)、<=(小于等于)。例如:
x = 5
y = 8
print(x == y) # 输出False
print(x!= y) # 输出True
print(x > y) # 输出False
print(x < y) # 输出True
print(x >= y) # 输出False
print(x <= y) # 输出True
- 逻辑运算符:用于逻辑运算,返回布尔值,包括and(与)、or(或)、not(非) 。and表示两个条件都为True时,结果才为True;or表示只要有一个条件为True,结果就为True;not用于反转条件的值。例如:
condition1 = True
condition2 = False
print(condition1 and condition2) # 输出False
print(condition1 or condition2) # 输出True
print(not condition1) # 输出False
- 位运算符:对二进制位进行操作,包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移位)、>>(右移位)。例如:
a = 5 # 二进制为0101
b = 3 # 二进制为0011
print(a & b) # 输出1,二进制为0001
print(a | b) # 输出7,二进制为0111
print(a ^ b) # 输出6,二进制为0110
print(~a) # 输出-6,二进制为11111010(补码形式)
print(a << 1) # 输出10,二进制为1010
print(a >> 1) # 输出2,二进制为0010
- 赋值运算符:用于给变量赋值,最基本的是=,还有一些复合赋值运算符,如+=(加法赋值)、-=(减法赋值)、*=(乘法赋值)、/=(除法赋值)、%=(取模赋值)、**=(幂赋值)、//=(取整除赋值)。例如:
x = 10
x += 5 # 相当于x = x + 5,此时x的值为15
x -= 3 # 相当于x = x - 3,此时x的值为12
x *= 2 # 相当于x = x * 2,此时x的值为24
x /= 4 # 相当于x = x / 4,此时x的值为6.0
三、流程控制语句
流程控制语句是编程语言的重要组成部分,它允许我们根据不同的条件执行不同的代码块,或者重复执行一段代码。在 Python 中,主要的流程控制语句有if-else语句、for循环和while循环。
3.1 if-else 语句
if-else语句用于根据条件来决定执行哪部分代码,它有三种常见的形式:单分支、双分支和多分支。
- 单分支:
-
- 语法:
if 条件表达式:语句块
-
- 说明:当条件表达式的值为True时,执行语句块中的代码;否则,跳过语句块。
-
- 示例:判断一个数是否大于 10。
num = 15
if num > 10:print(f"{num} 大于10")
- 双分支:
-
- 语法:
if 条件表达式:语句块1
else:语句块2
-
- 说明:如果条件表达式的值为True,执行语句块 1;否则,执行语句块 2。
-
- 示例:判断一个数是奇数还是偶数。
num = 8
if num % 2 == 0:print(f"{num} 是偶数")
else:print(f"{num} 是奇数")
- 多分支:
-
- 语法:
if 条件表达式1:语句块1
elif 条件表达式2:语句块2
...
else:语句块n
-
- 说明:依次判断条件表达式的值,当某个条件表达式为True时,执行对应的语句块,然后跳过整个if-elif-else结构;如果所有条件表达式都为False,则执行else中的语句块(else部分可选)。
-
- 示例:根据学生的成绩给出不同的等级评定。
score = 75
if score >= 90:print("优秀")
elif score >= 80:print("良好")
elif score >= 70:print("中等")
elif score >= 60:print("及格")
else:print("不及格")
3.2 for 循环
for循环用于遍历可迭代对象(如列表、元组、字符串等)中的每个元素,并对每个元素执行相同的操作。
- 基本语法:
for 变量 in 可迭代对象:语句块
-
- 说明:依次从可迭代对象中取出每个元素,赋值给变量,然后执行语句块中的代码,直到可迭代对象中的所有元素都被遍历完。
-
- 示例:遍历列表并打印每个元素。
fruits = ['apple', 'banana', 'cherry']
for fruit in fruits:print(fruit)
- 结合 range () 函数使用:range()函数可以生成一个整数序列,常与for循环结合使用来实现指定次数的循环。
-
- 语法:range(start, stop, step),其中start是起始值(默认为 0),stop是结束值(不包含在序列中),step是步长(默认为 1)。
-
- 示例:打印 0 到 4 的数字。
for i in range(5):print(i)
-
- 示例:打印 1 到 10 之间的偶数。
for i in range(2, 11, 2):print(i)
- break 和 continue 语句:在for循环中,break语句用于立即终止循环,continue语句用于跳过当前循环的剩余部分,直接进入下一次循环。
-
- 示例:使用break语句提前结束循环。
for num in range(1, 10):if num == 5:breakprint(num)
-
- 示例:使用continue语句跳过某些元素。
for num in range(1, 10):if num % 2 == 0:continueprint(num)
3.3 while 循环
while循环会在条件表达式为True时,重复执行语句块。
- 语法:
while 条件表达式:语句块
-
- 说明:首先判断条件表达式的值,如果为True,则执行语句块,然后再次判断条件表达式,如此循环,直到条件表达式的值为False。
-
- 示例:计算 1 到 10 的累加和。
sum_num = 0
i = 1
while i <= 10:sum_num += ii += 1
print(f"1到10的累加和为: {sum_num}")
- break 和 continue 语句:在while循环中,break和continue语句的作用与在for循环中相同。
-
- 示例:使用break语句在满足条件时终止循环。
i = 1
while True:if i == 5:breakprint(i)i += 1
-
- 示例:使用continue语句跳过某些循环。
i = 0
while i < 10:i += 1if i % 2 == 0:continueprint(i)
四、函数的定义与使用
在 Python 中,函数是组织好的、可重复使用的代码块,用于实现特定的功能。它可以提高代码的复用性和可维护性,让我们的编程工作更加高效。
4.1 函数定义
函数定义使用def关键字,其基本语法如下:
def 函数名(参数列表):"""函数文档字符串,用于描述函数的功能和使用方法"""函数体return 返回值
- 参数列表:可以包含零个或多个参数,参数之间用逗号,分隔。参数是函数接收外部传入数据的变量,通过参数,函数可以处理不同的数据。
- 函数体:包含了实现函数功能的一系列语句,是函数的核心部分。
- return 语句:用于返回函数的执行结果,是可选的。如果没有return语句,函数会默认返回None。
例如,定义一个简单的函数,用于计算两个数的和:
def add_numbers(a, b):"""该函数用于计算两个数的和:param a: 第一个数:param b: 第二个数:return: 两个数的和"""result = a + breturn result
在这个例子中,add_numbers是函数名,a和b是参数,函数体计算了a和b的和并将结果通过return返回。
4.2 函数调用
函数定义好后,就可以通过函数调用来执行其中的代码。调用函数时,使用函数名加上括号,括号内传入实际的参数值(如果有参数的话)。
例如,调用上面定义的add_numbers函数:
sum_result = add_numbers(3, 5)
print(sum_result) # 输出8
在这个例子中,add_numbers(3, 5)就是函数调用,3和5是实际传入的参数值,函数执行后返回的结果赋值给了sum_result变量,然后打印出结果。
函数调用时,参数的传递方式有两种:
- 按位置传参:按照参数定义的顺序依次传入参数值,如上面的add_numbers(3, 5),3对应参数a,5对应参数b。
- 按名称传参:通过参数名来指定参数值,这种方式可以不按照参数定义的顺序传参 ,例如add_numbers(b = 5, a = 3),结果与按位置传参相同。
4.3 函数参数
- 必备参数:调用函数时必须传入的参数,数量和顺序都要与函数定义时一致,否则会报错。例如上面的add_numbers函数,a和b就是必备参数。
- 默认参数:在定义函数时可以为参数指定默认值,调用函数时如果没有传入该参数的值,就会使用默认值。例如:
def greet(name, greeting = "Hello"):"""该函数用于向某人打招呼:param name: 姓名:param greeting: 问候语,默认为"Hello":return: 打招呼的字符串"""message = f"{greeting}, {name}!"return message
调用这个函数时,可以只传入name参数:
print(greet("Alice")) # 输出Hello, Alice!
也可以传入greeting参数来覆盖默认值:
print(greet("Bob", "Hi")) # 输出Hi, Bob!
- 不定长参数:
- *args:用于接收任意数量的位置参数,这些参数会被收集成一个元组。例如:
def print_numbers(*args):for num in args:print(num)print_numbers(1, 2, 3, 4)
- **kwargs:用于接收任意数量的关键字参数,这些参数会被收集成一个字典。例如:
def print_info(**kwargs):for key, value in kwargs.items():print(f"{key}: {value}")print_info(name="Alice", age=25, city="New York")
4.4 局部变量和全局变量
- 局部变量:在函数内部定义的变量,只在函数内部有效,函数执行结束后,局部变量就会被销毁。例如:
def my_function():local_var = 10 # 局部变量print(local_var)my_function()
# print(local_var) # 这行会报错,因为local_var在函数外不可见
- 全局变量:在函数外部定义的变量,在整个程序中都可以访问。例如:
global_var = 20 # 全局变量def my_function():print(global_var)my_function()
print(global_var)
在函数内部修改全局变量时,需要使用global关键字声明,否则 Python 会认为是在创建一个新的局部变量。例如:
global_var = 30def modify_global():global global_varglobal_var = 40print(global_var)modify_global()
print(global_var)
如果不使用global关键字,像下面这样:
global_var = 50def modify_global():global_var = 60 # 创建了一个新的局部变量,而不是修改全局变量print(global_var)modify_global()
print(global_var) # 输出50,因为全局变量没有被修改
五、总结
通过以上对 Python 基础语法的回顾,我们复习了变量、数据类型、运算符、流程控制语句以及函数的定义与使用等重要知识点。这些基础内容是我们学习 Python 爬虫的基石,只有熟练掌握它们,才能更好地理解和运用后续的爬虫技术。
在后续的爬虫学习中,我们会频繁地使用这些基础知识。比如在处理网页数据时,可能会用到字符串操作来提取有用信息,使用列表和字典来存储数据;在编写爬虫逻辑时,会运用流程控制语句来判断网页状态、决定爬取策略,使用函数来封装一些重复的操作,提高代码的复用性。
所以,建议大家在学习爬虫之前,一定要花时间巩固这些 Python 基础知识。可以通过做练习题、阅读优秀的 Python 代码示例等方式来加深理解和记忆。只有基础扎实了,我们在爬虫的学习道路上才能走得更远、更稳。
相关文章:
【Python爬虫(1)】专栏开篇:夯实Python基础
【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
低代码组态软件-BY组态
引言 在工业4.0与智能制造浪潮的推动下,组态软件作为工业自动化的核心工具,正逐步从传统单机模式向Web化、智能化方向演进。BY组态作为一款基于Web的嵌入式组态插件工具,凭借其低代码、高灵活性和跨平台特性,成为工业物联网&#…...
【计算机网络】数据链路层数据帧(Frame)格式
在计算机网络中,数据帧(Frame) 是数据链路层的协议数据单元(PDU),用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议(如以太网、PPP、HDLC 等)。以下是常见数据帧格式的…...
[特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用
C语言中对文件打开关闭操作 前言方法一:标准输入输出库(stdio.h)—— 高级文件操作的利器打开文件💡 关闭文件:fclose示例代码📝 个人见解 方法一:系统调用(fcntl.h 和 unistd.h&…...
如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传
目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录(例如rpc)保存为一个Git仓库并上传到远程仓库,您可以遵循以下步骤: 1. 初始…...
应用分层、三层架构和MVC架构
前言 在前面中,我们已经学习了Spring MVC 的一些基础操作,那么后面就用一些简单的案例来巩固一下。 在开始学习做案例之前,我们先来了解一下在软件开发中常见的设计模式和架构。 应用分层 含义 应用分层是一种软件开发设计思想࿰…...
前端实现防抖功能的详细解读
在前端开发中,防抖(Debounce) 是一种优化技术,用于限制某个函数在短时间内被频繁调用的次数。它的核心思想是:在一定时间内,无论触发多少次事件,只执行最后一次操作。防抖通常用于处理用户输入、…...
VUE3环境搭建
最近准备用Vue编写一点前端页面,我在前端一直是个小白,之前用的Vue2写了几个页面,现在已经是VUE3了,重新安装下环境开始。 1.npm安装 Vue需要用npm安装,npm是nodejs的package manager,这里我们安装下node…...
1-16 tortoiseGit分支与Git操作
1-1 创建分支 什么时候需要开分支? - 隔离线上版本和开发版本 - 大功能开发,不想影响到其他人,自己独立开个分支去开发 SVN经典目录结构: - trunk-------------------------开发中的文件 - bran…...
【VB语言】EXCEL中VB宏的应用
【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示:以下是本篇文章正文内容,下面案例可供参考 一、EXCEL-VB 1.实验过…...
前端优化可以从哪些方面下手及优化方案
前端优化是提升网页性能、提升用户体验和降低服务器负担的重要手段。可以从多个角度入手,以下是一些常见的优化方向和方案: 1. 性能优化 减少请求数量:尽量减少页面加载时发起的 HTTP 请求,例如使用合并文件(CSS 和 …...
类和对象(5)——抽象类和接口
目录 1. 抽象类 1.1 抽象类的概念 1.2 抽象类语法:abstract关键字 1.3 抽象类的特性 1.4 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口语法:interface关键字 2.3 接口的实现:implements关键字 2.4 接口的特性 2.5 实现多个接口 …...
海康摄像头IPV6模式,手动,自动,路由公告
海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议(IP)的第六版,用于替代IPv4,提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接: 手动:用户可…...
LabVIEW与USB设备开发
开发一台USB设备并使用LabVIEW进行上位机开发,涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输,帮助用户顺利完成项目开发。下面是一个详细的说明&…...
BY组态:工业自动化的未来,触手可及
在工业4.0的浪潮下,智能化、数字化已成为制造业发展的核心驱动力。作为工业自动化领域的重要工具,组态软件在实现设备监控、数据采集、流程控制等方面发挥着不可替代的作用。然而,传统的组态软件往往存在开发周期长、学习成本高、灵活性不足等…...
深入理解Python多进程编程 multiprocessing
深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程,从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行,极大地提高了处理效率,特别是在…...
使用DeepSeek建立一个智能聊天机器人0.12
为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...
基于VLC的Unity视频播放器(三)
关于UMP插件 UMP插件不更新了,我测试在Ubuntu24.04上编辑器和运行时都无法正常播放,在替换lib之后编辑器可以播放,但打包后不行……很奇怪 继续更新了一下UnityVLC 添加了对Linux的支持,勉强都可以播放了…… Win截图 Ubuntu2…...
每日一题——把数字翻译成字符串
把数字翻译成字符串 题目描述示例示例1示例2 题解动态规划代码实现复杂度分析 总结 题目描述 有一种将字母编码成数字的方式:‘a’->1, ‘b’->2, … , ‘z’->26。 现在给一串数字,返回有多少种可能的译码结果。 数据范围:字符串…...
基于状态观测器和物联网基础设施的智能电网高速孤岛检测
论文标题 中文标题: 基于状态观测器和物联网基础设施的智能电网高速孤岛检测 英文标题: High-Speed Islanding Detection in Smart Grids Using a State Observer and IoT Infrastructure 作者信息 Shahid Karim<sup>1,2, *</sup>, Prajo…...
FPGA的星辰大海
编者按 时下风头正盛的DeepSeek,正值喜好宏大叙事的米国大统领二次上岗就业,OpenAI、软银、甲骨文等宣布投资高达5000亿美元“星际之门”之际,对比尤为强烈。 某种程度上,,是低成本创新理念的直接落地。 包括来自开源社区的诸多赞誉是,并非体现技术有多“超越”,而是…...
【Black Mesa】黑山起源用服务器开服多人联机教程
1、登录服务器(百度莱卡云游戏面板) 进入控制面板后会出现正在安装的界面,安装大约10分钟(如长时间处于安装中请联系我们的客服人员) 2、修改端口 看到一下图片的界面时说明服务器已经安装完成,服务器需要…...
【学习笔记】深度学习网络-深度模型中的优化
作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程,深度学习领域研究生必读教材),开始深度学习领域学习,深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中…...
java八股文之Redis
1.Rdis常见的使用场景 缓存分布式锁(redision,setnx)计数器保存token消息队列延迟队列 2.说明一下缓存雪崩,缓存穿透和缓存击穿以及解决方式 1.缓存雪崩 定义: 缓存雪崩指的是当大量的缓存数据同时失效,…...
ubuntu系统下KVM设置桥接网络(失败)
20250216 - 概述 因实验需求,需要设置KVM下的虚拟机采用桥接模式进行通信,这种方式将使虚拟机与主机类似使用同一网段的IP。实际上,为了实现这个功能,我已经在自己mac上VMware使用过,虚拟机获得了自己独立的IP。 但…...
CentOS 7操作系统部署KVM软件和创建虚拟机
CentOS 7.9操作系统部署KVM软件和配置指南,包括如何创建一个虚拟机。 步骤 1: 检查硬件支持 首先,确认您的CPU支持虚拟化技术,并且已在BIOS中启用: egrep -c (vmx|svm) /proc/cpuinfo 如果输出大于0,则表示支持虚拟…...
驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布
一:概述 当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer,即画布)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。 虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与…...
Spring Boot过滤器链:从入门到精通
文章目录 一、过滤器链是什么?二、为什么需要过滤器链?三、Spring Boot中的过滤器链是如何工作的?(一)过滤器的生命周期(二)过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...
QT 读写锁
一、概述 1、读写锁是一种线程同步机制,用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁(共享访问),但只允许一个线程获取写锁(独占访问)。 3、这种机制可以提高并发性能&…...
C++中的智能指针
智能指针总结 智能指针其作⽤是管理⼀个指针,避免程序员申请的空间在函数结束时忘记释放,造成内存泄漏这种情况滴发⽣。使⽤智能指针可以很⼤程度上的避免这个问题,因为智能指针就是⼀个类,当超出了类的作⽤域是,类会…...
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)
IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini) 📊 引言 近年来,AI 编程助手已成为开发者的高效工具,它们可以加速代码编写、优化代码结构,并提供智能提示。本文介绍如何在 IntelliJ I…...
【R语言】非参数检验
一、Mann-Whitney检验 在R语言中,Mann-Whitney U检验(也称为Wilcoxon秩和检验)用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验,适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...
PyTorch 源码学习:阅读经验 代码结构
分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同,所以笔者在整理资料时尽可能按版本号升序,版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...
04运维实用篇(D4_日志)
目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1:添加日志记录操作 步骤2:设置日志输出级别 步骤3:设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...
Linux文件管理:硬链接与软链接
文章目录 1. 硬链接的设计目的(1)节省存储空间(2)提高文件管理效率(3)数据持久性(4)文件系统的自然特性 2. 软链接的设计目的**(1)跨文件系统引用****&#x…...
【零基础学Mysql】常用函数讲解,提升数据操作效率的利器
以耳倾听世间繁华,以语表达心中所想 大家好,我是whisperrrr. 前言: 大家好,我是你们的朋友whisrrr。在日常工作中,MySQL作为一款广泛使用的开源关系型数据库,其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...
小米平板怎么和电脑共享屏幕
最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的,需要下载一款电脑安装包:小米妙享 关于这个安装包,想吐槽的是: 没有找到官网渠道,是通过其他网络方式查到下载的 不附录链接,原因是因为地…...
宝藏软件系列 篇一:My APK(Android)
文章目录 系列文章官方网站特色功能同类软件 系列文章 官方网站 My APK 官方版本是在 谷歌商店 中上架的。 官方下载地址:Google Play 商店页面。(需要外网) 2025.2最新版本的CSDN本地下载地址(因为是Android App Bundle&…...
本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例
本地部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例 Ollama 部署 Deepseek R1 官网:https://www.deepseek.com/ Github:https://github.com/deepseek-ai Ollama:https://ollama.com/ Docker Compose 部署一个 Ollama 和…...
centos8.0 docker ngnix
问题1:镜像拉取不下来,用DAO云加速器 问题2:ngnix镜像不能运行, 无法检索OCI运行时错误 在CentOS上使用Docker来运行Nginx是一个常见的做法,因为它提供了快速、一致的环境配置方式,并且可以很容易地扩展。…...
位运算在数据库中的运用实践-以MySQL和PG为例
目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时,遇到一个很有意思的场景。首先先跟大家分享一下需…...
IoTDB 常见问题 QA 第五期
关于 IoTDB 的 Q & A 情人节之际,让 IoTDB Q&A 陪您一起共度解惑!我们将定期汇总我们将定期汇总社区讨论频繁的问题,并展开进行详细回答,通过积累常见问题“小百科”,方便大家使用 IoTDB。 Q1:导入…...
【kafka系列】日志存储设计 消息写入、读取
目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计,其结构包含目录组织、…...
Python实现语音识别详细教程【2025】最新教程
文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程,涵盖环境搭建、使…...
【一文读懂】HTTP与Websocket协议
HTTP协议 概述 HTTP (Hypertext Transfer Protocol),即超文本传输协议,是一种用于在客户端和服务器之间传输超文本(例如网页、图片、音频、视频等)的通信协议。它是万维网(WWW)的基础,负责在浏…...
SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)
感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以给我留言咨询,我会一一回复,希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下,人们的精神需求愈发凸显࿰…...
Windows逆向工程入门之堆栈结构与信息获取
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 1. 堆栈结构基础 堆栈的主要操作: 2. 代码功能解析 2.1 加载 ntdll.dll 2.2 获取 NtQueryInformationThread 函数指针 2.3 调用 NtQueryInformationThread 获取线程信息…...
springboot项目如何部署到tomcat中
1、使用springboot内部嵌入的tomcat 可以改一些tomcat的参数 2、可以把springboot项目打包为war包,然后部署到tomcat中去 Spring Boot 默认使用嵌入式 Tomcat 作为其 Web 容器,这使得 Spring Boot 应用可以作为一个独立的 JAR 文件运行。这种嵌入式服务…...
C语言之easyX
目录 概要 easyX整体架构 图形绘制 画布宽高 圆形 图片的贴图 加载图像 游戏框架 概要 easyX是一个轻量级的图形库,用于在Windows平台上进行简单的2D图形绘制。它提供了一组简单易用的函数,可以方便地绘制基本的图形元素,如线条、矩形、圆形…...
es6箭头函数和普通函数的区别
在JavaScript中,函数是执行特定任务的代码块。函数可以被定义并且随后被调用。JavaScript中有两种主要的函数定义方式:普通函数声明和箭头函数表达式。下面是这两种函数的定义方式及其区别和使用场景: 普通函数声明 普通函数可以通过函数声明…...