当前位置: 首页 > news >正文

【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 数据类型

  1. 整型(int):用来表示整数,没有小数部分,如age = 25,count = -10。在 Python 中,整型的范围很大,基本可以满足我们日常的计算需求。
  2. 浮点型(float):表示带有小数部分的数字,比如pi = 3.14,salary = 5000.5 。需要注意的是,浮点数在计算机中存储时可能存在精度问题,例如0.1 + 0.2在数学上等于0.3,但在 Python 中输出结果可能是0.30000000000000004,这是因为浮点数在计算机中是以二进制形式存储的,某些十进制小数无法精确地用二进制表示。
  3. 布尔型(bool):只有两个值,True和False,常用于条件判断和逻辑运算。比如is_student = True,is_adult = False 。在 Python 中,True本质上是 1,False本质上是 0,所以布尔型也可以参与一些算术运算,如True + 1结果为 2,False + 5结果为 5。
  4. 字符串(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’ 。
  5. 列表(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’] 。
  6. 元组(tuple):与列表类似,也是有序的序列,但元组是不可变的,一旦创建就不能修改其内容,用圆括号()表示,例如coordinates = (10, 20),colors = (‘red’, ‘green’, ‘blue’) 。虽然元组不能修改元素,但可以通过索引访问元素,coordinates[0]得到 10。元组通常用于存储一些固定的数据,比如坐标、日期等。
  7. 字典(dict):是一种可变的无序映射类型,用于存储键值对,用花括号{}表示,每个键值对之间用冒号:分隔,不同键值对之间用逗号,分隔,如person = {‘name’: ‘Bob’, ‘age’: 30, ‘city’: ‘New York’} 。可以通过键来访问对应的值,person[‘name’]得到’Bob’ ,也可以修改值person[‘age’] = 31 ,还能添加新的键值对person[‘job’] = ‘Engineer’ 。
  8. 集合(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 运算符

  1. 算术运算符:用于基本的数学运算,包括+(加)、-(减)、*(乘)、/(除)、%(取模,即取除法的余数)、**(幂运算)、//(取整除,返回商的整数部分)。例如:
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
  1. 比较运算符:用于比较两个值的大小或是否相等,返回布尔值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
  1. 逻辑运算符:用于逻辑运算,返回布尔值,包括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
  1. 位运算符:对二进制位进行操作,包括&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(左移位)、>>(右移位)。例如:
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
  1. 赋值运算符:用于给变量赋值,最基本的是=,还有一些复合赋值运算符,如+=(加法赋值)、-=(减法赋值)、*=(乘法赋值)、/=(除法赋值)、%=(取模赋值)、**=(幂赋值)、//=(取整除赋值)。例如:
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语句用于根据条件来决定执行哪部分代码,它有三种常见的形式:单分支、双分支和多分支

  1. 单分支
    • 语法:
if 条件表达式:语句块
    • 说明:当条件表达式的值为True时,执行语句块中的代码;否则,跳过语句块。
    • 示例:判断一个数是否大于 10。
num = 15
if num > 10:print(f"{num} 大于10")
  1. 双分支
    • 语法:
if 条件表达式:语句块1
else:语句块2
    • 说明:如果条件表达式的值为True,执行语句块 1;否则,执行语句块 2。
    • 示例:判断一个数是奇数还是偶数。
num = 8
if num % 2 == 0:print(f"{num} 是偶数")
else:print(f"{num} 是奇数")
  1. 多分支
    • 语法:
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变量,然后打印出结果。

函数调用时,参数的传递方式有两种

  1. 按位置传参:按照参数定义的顺序依次传入参数值,如上面的add_numbers(3, 5),3对应参数a,5对应参数b。
  2. 按名称传参:通过参数名来指定参数值,这种方式可以不按照参数定义的顺序传参 ,例如add_numbers(b = 5, a = 3),结果与按位置传参相同。

4.3 函数参数

  1. 必备参数:调用函数时必须传入的参数,数量和顺序都要与函数定义时一致,否则会报错。例如上面的add_numbers函数,a和b就是必备参数。
  2. 默认参数:在定义函数时可以为参数指定默认值,调用函数时如果没有传入该参数的值,就会使用默认值。例如:
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!
  1. 不定长参数
  • *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 局部变量和全局变量

  1. 局部变量:在函数内部定义的变量,只在函数内部有效,函数执行结束后,局部变量就会被销毁。例如:
def my_function():local_var = 10  # 局部变量print(local_var)my_function()
# print(local_var)  # 这行会报错,因为local_var在函数外不可见
  1. 全局变量:在函数外部定义的变量,在整个程序中都可以访问。例如:
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爬虫】专栏简介&#xff1a;本专栏是 Python 爬虫领域的集大成之作&#xff0c;共 100 章节。从 Python 基础语法、爬虫入门知识讲起&#xff0c;深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑&#xff0c;覆盖网页、图片、音频等各类数据爬取&#xff…...

低代码组态软件-BY组态

引言 在工业4.0与智能制造浪潮的推动下&#xff0c;组态软件作为工业自动化的核心工具&#xff0c;正逐步从传统单机模式向Web化、智能化方向演进。BY组态作为一款基于Web的嵌入式组态插件工具&#xff0c;凭借其低代码、高灵活性和跨平台特性&#xff0c;成为工业物联网&#…...

【计算机网络】数据链路层数据帧(Frame)格式

在计算机网络中&#xff0c;数据帧&#xff08;Frame&#xff09; 是数据链路层的协议数据单元&#xff08;PDU&#xff09;&#xff0c;用于在物理介质上传输数据。数据帧的格式取决于具体的链路层协议&#xff08;如以太网、PPP、HDLC 等&#xff09;。以下是常见数据帧格式的…...

[特殊字符] C语言中打开和关闭文件的两种方法:标准库 VS 系统调用

C语言中对文件打开关闭操作 前言方法一&#xff1a;标准输入输出库&#xff08;stdio.h&#xff09;—— 高级文件操作的利器打开文件&#x1f4a1; 关闭文件&#xff1a;fclose示例代码&#x1f4dd; 个人见解 方法一&#xff1a;系统调用&#xff08;fcntl.h 和 unistd.h&…...

如何将ubuntu下的一个目录,保存目录结构为一个git仓库并上传

目录 1. 初始化本地Git仓库 2. 添加文件到仓库 3. 提交更改 4. 创建并关联远程仓库 5. 推送代码到远程仓库 完整流程总结 要将Ubuntu下的一个目录&#xff08;例如rpc&#xff09;保存为一个Git仓库并上传到远程仓库&#xff0c;您可以遵循以下步骤&#xff1a; 1. 初始…...

应用分层、三层架构和MVC架构

前言 在前面中&#xff0c;我们已经学习了Spring MVC 的一些基础操作&#xff0c;那么后面就用一些简单的案例来巩固一下。 在开始学习做案例之前&#xff0c;我们先来了解一下在软件开发中常见的设计模式和架构。 应用分层 含义 应用分层是一种软件开发设计思想&#xff0…...

前端实现防抖功能的详细解读

在前端开发中&#xff0c;防抖&#xff08;Debounce&#xff09; 是一种优化技术&#xff0c;用于限制某个函数在短时间内被频繁调用的次数。它的核心思想是&#xff1a;在一定时间内&#xff0c;无论触发多少次事件&#xff0c;只执行最后一次操作。防抖通常用于处理用户输入、…...

VUE3环境搭建

最近准备用Vue编写一点前端页面&#xff0c;我在前端一直是个小白&#xff0c;之前用的Vue2写了几个页面&#xff0c;现在已经是VUE3了&#xff0c;重新安装下环境开始。 1.npm安装 Vue需要用npm安装&#xff0c;npm是nodejs的package manager&#xff0c;这里我们安装下node…...

1-16 tortoiseGit分支与Git操作

1-1 创建分支 什么时候需要开分支&#xff1f; - 隔离线上版本和开发版本 - 大功能开发&#xff0c;不想影响到其他人&#xff0c;自己独立开个分支去开发 SVN经典目录结构&#xff1a; - trunk-------------------------开发中的文件 - bran…...

【VB语言】EXCEL中VB宏的应用

【VB语言】EXCEL中VB宏的应用 文章目录 [TOC](文章目录) 前言一、EXCEL-VB1.实验过程2.代码 二、EXCEL-VB 生成.c.h文件1.实验过程2.代码 四、参考资料总结 前言 1.WPS-VB扩展包 提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、EXCEL-VB 1.实验过…...

前端优化可以从哪些方面下手及优化方案

前端优化是提升网页性能、提升用户体验和降低服务器负担的重要手段。可以从多个角度入手&#xff0c;以下是一些常见的优化方向和方案&#xff1a; 1. 性能优化 减少请求数量&#xff1a;尽量减少页面加载时发起的 HTTP 请求&#xff0c;例如使用合并文件&#xff08;CSS 和 …...

类和对象(5)——抽象类和接口

目录 1. 抽象类 1.1 抽象类的概念 1.2 抽象类语法&#xff1a;abstract关键字 1.3 抽象类的特性 1.4 抽象类的作用 2. 接口 2.1 接口的概念 2.2 接口语法&#xff1a;interface关键字 2.3 接口的实现&#xff1a;implements关键字 2.4 接口的特性 2.5 实现多个接口 …...

海康摄像头IPV6模式,手动,自动,路由公告

海康摄像头DS-2DC7220IW-A 网络设置中的IPv6配置选项。IPv6是互联网协议&#xff08;IP&#xff09;的第六版&#xff0c;用于替代IPv4&#xff0c;提供更多的IP地址和改进的网络功能。图片中的选项允许用户选择如何配置设备的IPv6网络连接&#xff1a; 手动&#xff1a;用户可…...

LabVIEW与USB设备开发

开发一台USB设备并使用LabVIEW进行上位机开发&#xff0c;涉及底层驱动的编写、USB通信协议的实现以及LabVIEW与设备的接口设计。本文将详细介绍如何开发USB设备驱动、实现LabVIEW与USB设备的通信以及优化数据传输&#xff0c;帮助用户顺利完成项目开发。下面是一个详细的说明&…...

BY组态:工业自动化的未来,触手可及

在工业4.0的浪潮下&#xff0c;智能化、数字化已成为制造业发展的核心驱动力。作为工业自动化领域的重要工具&#xff0c;组态软件在实现设备监控、数据采集、流程控制等方面发挥着不可替代的作用。然而&#xff0c;传统的组态软件往往存在开发周期长、学习成本高、灵活性不足等…...

深入理解Python多进程编程 multiprocessing

深入理解Python多进程编程 multiprocessing flyfish Python 的 multiprocessing 模块允许创建多个进程&#xff0c;从而可以利用多核处理器的能力来并行执行任务。这意味着程序的不同部分可以在不同的CPU核心上同时运行&#xff0c;极大地提高了处理效率&#xff0c;特别是在…...

使用DeepSeek建立一个智能聊天机器人0.12

为了确保这段代码能够在Windows和Linux系统上都能正常运行,我考虑以下几个方面: 路径分隔符:在Windows和Linux中,文件路径的分隔符不同。Windows使用反斜杠(\),而Linux使用正斜杠(/)。我们可以使用 os.path.join 来处理路径,以确保跨平台兼容性。 消息框:tkinter.…...

基于VLC的Unity视频播放器(三)

关于UMP插件 UMP插件不更新了&#xff0c;我测试在Ubuntu24.04上编辑器和运行时都无法正常播放&#xff0c;在替换lib之后编辑器可以播放&#xff0c;但打包后不行……很奇怪 继续更新了一下UnityVLC 添加了对Linux的支持&#xff0c;勉强都可以播放了…… Win截图 Ubuntu2…...

每日一题——把数字翻译成字符串

把数字翻译成字符串 题目描述示例示例1示例2 题解动态规划代码实现复杂度分析 总结 题目描述 有一种将字母编码成数字的方式&#xff1a;‘a’->1, ‘b’->2, … , ‘z’->26。 现在给一串数字&#xff0c;返回有多少种可能的译码结果。 数据范围&#xff1a;字符串…...

基于状态观测器和物联网基础设施的智能电网高速孤岛检测

论文标题 中文标题&#xff1a; 基于状态观测器和物联网基础设施的智能电网高速孤岛检测 英文标题&#xff1a; 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、登录服务器&#xff08;百度莱卡云游戏面板&#xff09; 进入控制面板后会出现正在安装的界面&#xff0c;安装大约10分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、修改端口 看到一下图片的界面时说明服务器已经安装完成&#xff0c;服务器需要…...

【学习笔记】深度学习网络-深度模型中的优化

​ 作者选择了由 Ian Goodfellow、Yoshua Bengio 和 Aaron Courville 三位大佬撰写的《Deep Learning》(人工智能领域的经典教程&#xff0c;深度学习领域研究生必读教材),开始深度学习领域学习&#xff0c;深入全面的理解深度学习的理论知识。 在之前的文章中介绍了深度学习中…...

java八股文之Redis

1.Rdis常见的使用场景 缓存分布式锁&#xff08;redision&#xff0c;setnx&#xff09;计数器保存token消息队列延迟队列 2.说明一下缓存雪崩&#xff0c;缓存穿透和缓存击穿以及解决方式 1.缓存雪崩 定义&#xff1a; 缓存雪崩指的是当大量的缓存数据同时失效&#xff0c…...

ubuntu系统下KVM设置桥接网络(失败)

20250216 - 概述 因实验需求&#xff0c;需要设置KVM下的虚拟机采用桥接模式进行通信&#xff0c;这种方式将使虚拟机与主机类似使用同一网段的IP。实际上&#xff0c;为了实现这个功能&#xff0c;我已经在自己mac上VMware使用过&#xff0c;虚拟机获得了自己独立的IP。 但…...

CentOS 7操作系统部署KVM软件和创建虚拟机

CentOS 7.9操作系统部署KVM软件和配置指南&#xff0c;包括如何创建一个虚拟机。 步骤 1: 检查硬件支持 首先&#xff0c;确认您的CPU支持虚拟化技术&#xff0c;并且已在BIOS中启用&#xff1a; egrep -c (vmx|svm) /proc/cpuinfo 如果输出大于0&#xff0c;则表示支持虚拟…...

驱动开发系列38 - Linux Graphics 3D 绘制流程(一)- 创建画布

一:概述 当应用程序创建 OpenGL 上下文时,它通常需要申请帧缓冲(Framebuffer,即画布)。在 X11 体系下,应用程序不会直接向内核的 DRM 模块请求创建帧缓冲,而是通过 X 服务器进行申请。 虽然从技术上讲,应用程序可以直接使用 DRM 接口创建帧缓冲对象(BO),但为了将其与…...

Spring Boot过滤器链:从入门到精通

文章目录 一、过滤器链是什么&#xff1f;二、为什么需要过滤器链&#xff1f;三、Spring Boot中的过滤器链是如何工作的&#xff1f;&#xff08;一&#xff09;过滤器的生命周期&#xff08;二&#xff09;过滤器链的执行流程 四、如何在Spring Boot中定义自己的过滤器&#…...

QT 读写锁

一、概述 1、读写锁是一种线程同步机制&#xff0c;用于解决多线程环境下的读写竞争问题。 2、读写锁允许多个线程同时获取读锁&#xff08;共享访问&#xff09;&#xff0c;但只允许一个线程获取写锁&#xff08;独占访问&#xff09;。 3、这种机制可以提高并发性能&…...

C++中的智能指针

智能指针总结 智能指针其作⽤是管理⼀个指针&#xff0c;避免程序员申请的空间在函数结束时忘记释放&#xff0c;造成内存泄漏这种情况滴发⽣。使⽤智能指针可以很⼤程度上的避免这个问题&#xff0c;因为智能指针就是⼀个类&#xff0c;当超出了类的作⽤域是&#xff0c;类会…...

IntelliJ IDEA 接入 AI 编程助手(Copilot、DeepSeek、GPT-4o Mini)

IntelliJ IDEA 接入 AI 编程助手&#xff08;Copilot、DeepSeek、GPT-4o Mini&#xff09; &#x1f4ca; 引言 近年来&#xff0c;AI 编程助手已成为开发者的高效工具&#xff0c;它们可以加速代码编写、优化代码结构&#xff0c;并提供智能提示。本文介绍如何在 IntelliJ I…...

【R语言】非参数检验

一、Mann-Whitney检验 在R语言中&#xff0c;Mann-Whitney U检验&#xff08;也称为Wilcoxon秩和检验&#xff09;用于比较两个独立样本的中位数是否存在显著差异。它是一种非参数检验&#xff0c;适用于数据不满足正态分布假设的情况。 1、独立样本 # 创建两个独立样本数据…...

PyTorch 源码学习:阅读经验 代码结构

分享自己在学习 PyTorch 源码时阅读过的资料。本文重点关注阅读 PyTorch 源码的经验和 PyTorch 的代码结构。因为 PyTorch 不同版本的源码实现有所不同&#xff0c;所以笔者在整理资料时尽可能按版本号升序&#xff0c;版本号见标题前[]。最新版本的源码实现还请查看 PyTorch 仓…...

04运维实用篇(D4_日志)

目录 一、简介 二、代码中使用日志工具记录日志 1. 操作步骤 步骤1&#xff1a;添加日志记录操作 步骤2&#xff1a;设置日志输出级别 步骤3&#xff1a;设置日志组 2. 知识小结 三、优化日志对象创建代码 1. 实例 2. 总结 四、日志输出格式控制 1. 实例 2. 总结 …...

Linux文件管理:硬链接与软链接

文章目录 1. 硬链接的设计目的&#xff08;1&#xff09;节省存储空间&#xff08;2&#xff09;提高文件管理效率&#xff08;3&#xff09;数据持久性&#xff08;4&#xff09;文件系统的自然特性 2. 软链接的设计目的**&#xff08;1&#xff09;跨文件系统引用****&#x…...

【零基础学Mysql】常用函数讲解,提升数据操作效率的利器

以耳倾听世间繁华&#xff0c;以语表达心中所想 大家好,我是whisperrrr. 前言&#xff1a; 大家好&#xff0c;我是你们的朋友whisrrr。在日常工作中&#xff0c;MySQL作为一款广泛使用的开源关系型数据库&#xff0c;其强大的功能为我们提供了便捷的数据存储和管理手段。而在…...

小米平板怎么和电脑共享屏幕

最近尝试使用小米平板和电脑屏幕分屏互联 发现是需要做特殊处理的&#xff0c;需要下载一款电脑安装包&#xff1a;小米妙享 关于这个安装包&#xff0c;想吐槽的是&#xff1a; 没有找到官网渠道&#xff0c;是通过其他网络方式查到下载的 不附录链接&#xff0c;原因是因为地…...

宝藏软件系列 篇一:My APK(Android)

文章目录 系列文章官方网站特色功能同类软件 系列文章 官方网站 My APK 官方版本是在 谷歌商店 中上架的。 官方下载地址&#xff1a;Google Play 商店页面。&#xff08;需要外网&#xff09; 2025.2最新版本的CSDN本地下载地址&#xff08;因为是Android App Bundle&…...

本地 Ollama 部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例

本地部署 Deepseek R1 并使用 Spring AI Alibaba 构建 Chat 应用示例 Ollama 部署 Deepseek R1 官网&#xff1a;https://www.deepseek.com/ Github&#xff1a;https://github.com/deepseek-ai Ollama&#xff1a;https://ollama.com/ Docker Compose 部署一个 Ollama 和…...

centos8.0 docker ngnix

问题1&#xff1a;镜像拉取不下来&#xff0c;用DAO云加速器 问题2&#xff1a;ngnix镜像不能运行&#xff0c; 无法检索OCI运行时错误 在CentOS上使用Docker来运行Nginx是一个常见的做法&#xff0c;因为它提供了快速、一致的环境配置方式&#xff0c;并且可以很容易地扩展。…...

位运算在数据库中的运用实践-以MySQL和PG为例

目录 前言 一、两种不同的数据库设计 1、状态字段存储JSON 2、使用位运算 二、数据库中的位运算实践 1、MySQL中的位运算实践 2、PostgreSQL中位运算实践 三、总结 前言 最近在解决某用户的一个业务需求时&#xff0c;遇到一个很有意思的场景。首先先跟大家分享一下需…...

IoTDB 常见问题 QA 第五期

关于 IoTDB 的 Q & A 情人节之际&#xff0c;让 IoTDB Q&A 陪您一起共度解惑&#xff01;我们将定期汇总我们将定期汇总社区讨论频繁的问题&#xff0c;并展开进行详细回答&#xff0c;通过积累常见问题“小百科”&#xff0c;方便大家使用 IoTDB。 Q1&#xff1a;导入…...

【kafka系列】日志存储设计 消息写入、读取

目录 日志存储设计 1. 日志存储的目录结构 2. 日志内容格式设计 3. 日志索引设计 4. 设计优势 消息写入流程 示例 流程图 消息读取流程 示例 关键设计细节 流程图 日志存储设计 Kafka的日志存储是其高吞吐、持久化能力的核心设计&#xff0c;其结构包含目录组织、…...

Python实现语音识别详细教程【2025】最新教程

文章目录 前言一、环境搭建1. 下载 Python2. 安装 Python3 使用 pip 安装必要的库 二、使用 SpeechRecognition 库进行语音识别1.识别本地音频文件2.实时语音识别3. 使用其他语音识别引擎 注意事项 前言 以下是一份较为完整的 Python 语音识别教程&#xff0c;涵盖环境搭建、使…...

【一文读懂】HTTP与Websocket协议

HTTP协议 概述 HTTP (Hypertext Transfer Protocol)&#xff0c;即超文本传输协议&#xff0c;是一种用于在客户端和服务器之间传输超文本&#xff08;例如网页、图片、音频、视频等&#xff09;的通信协议。它是万维网&#xff08;WWW&#xff09;的基础&#xff0c;负责在浏…...

SpringBoot+微信小程序+数据可视化的宠物到家喂宠服务(程序+论文+讲解+安装+调试+售后等)

感兴趣的可以先收藏起来&#xff0c;还有大家在毕设选题&#xff0c;项目以及论文编写等相关问题都可以给我留言咨询&#xff0c;我会一一回复&#xff0c;希望帮助更多的人。 系统介绍 在经济高速发展、物质生活极大丰富的当下&#xff0c;人们的精神需求愈发凸显&#xff0…...

Windows逆向工程入门之堆栈结构与信息获取

公开视频 -> 链接点击跳转公开课程博客首页 -> ​​​链接点击跳转博客主页 目录 1. 堆栈结构基础 堆栈的主要操作&#xff1a; 2. 代码功能解析 2.1 加载 ntdll.dll 2.2 获取 NtQueryInformationThread 函数指针 2.3 调用 NtQueryInformationThread 获取线程信息…...

springboot项目如何部署到tomcat中

1、使用springboot内部嵌入的tomcat 可以改一些tomcat的参数 2、可以把springboot项目打包为war包&#xff0c;然后部署到tomcat中去 Spring Boot 默认使用嵌入式 Tomcat 作为其 Web 容器&#xff0c;这使得 Spring Boot 应用可以作为一个独立的 JAR 文件运行。这种嵌入式服务…...

C语言之easyX

目录 概要 easyX整体架构 图形绘制 画布宽高 圆形 图片的贴图 加载图像 游戏框架 概要 easyX是一个轻量级的图形库&#xff0c;用于在Windows平台上进行简单的2D图形绘制。它提供了一组简单易用的函数&#xff0c;可以方便地绘制基本的图形元素&#xff0c;如线条、矩形、圆形…...

es6箭头函数和普通函数的区别

在JavaScript中&#xff0c;函数是执行特定任务的代码块。函数可以被定义并且随后被调用。JavaScript中有两种主要的函数定义方式&#xff1a;普通函数声明和箭头函数表达式。下面是这两种函数的定义方式及其区别和使用场景&#xff1a; 普通函数声明 普通函数可以通过函数声明…...