【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 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取ÿ…...
Java中的分布式(概念说明)
1. 分布式的基本概念 1.1 什么是分布式系统? 分布式系统(Distributed System):由多台服务器(或节点)协同工作,对外提供一个整体服务。不同节点之间通过网络通信来协同处理请求或共享数据&…...

Field ‘id‘ doesn‘t have a default value
1.程序测试时,运行到向数据库插入数据时,报以下异常 是id没有默认值; 在测试单元内单独向该数据库插入数据,报同样的异常,确定了异常的定位 2.项目时采用mybatisPlus操作数据库,报异常的数据库和另外一个数据库关联,主键ID和另外一个数据库相同,通过读取另外一个数据库的ID获…...
蓝桥杯 Java B 组之栈的应用(括号匹配、表达式求值)
一、栈的基本概念 栈(Stack)是一种特殊的线性数据结构,遵循后进先出(Last In First Out,LIFO)的原则。就像一摞盘子,最后放上去的盘子总是最先被拿走。栈有两个主要操作: 入栈&…...

Hive之分区表
Hive之分区表 文章目录 Hive之分区表写在前面分区表分区表基本操作引入分区表创建分区表语法加载数据到分区表中查询分区表中数据增加分区删除分区查看分区表有多少分区查看分区表结构 二级分区正常的加载数据分区表和数据产生关联 动态分区开启动态分区参数设置案例实操 写在前…...

Redis之持久化
1.前言 Redis⽀持RDB和AOF两种持久化机制,持久化功能有效地避免因进程退出造成数据丢失问题, 当下次重启时利⽤之前持久化的⽂件即可实现数据恢复。本文内容: • 介绍RDB、AOF的配置和运⾏流程,以及控制持久化的命令,…...
有关计算机的英语单词、短语、句子
基本计算机术语 Computer – 计算机 Hardware – 硬件 Software – 软件 Operating System (OS) – 操作系统 Processor (CPU) – 处理器(中央处理单元) Memory (RAM) – 内存(随机存取存储器) Storage – 存储 Disk Drive – 硬…...
String、StringBuffer、StringBuilder 区别
在 Java 编程中,String、StringBuffer 和 StringBuilder 是处理字符串时常用的类。它们在功能上有相似之处,但在内部实现、性能、线程安全性等方面存在显著差异。理解这些差异有助于开发者在不同的场景下做出合适的选择,提高代码的性能和效率…...

shell——分支语句
文章目录 基本语法常用判断条件(1)两个整数之间比较(2)按照文件权限进行判断(3)按照文件类型进行判断(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令…...

【vue3】实现pdf在线预览的几种方式
今天一天对当前可用的pdf预览插件做了测试,主要需求是只能预览不能下载,但对于前端来说,没有绝对的禁止,这里只罗列实现方式。 目前采用vue3版本为:3.2.37 iframevue-officepdfjs-dist iframe 先说最简单的…...
(学习总结22)Linux 基本指令1
Linux 基本指令1 基本指令当前目录信息指令 ls查看路径指令 pwd改变当前所在目录指令 cd创建或更改文件时间指令 touch创建目录指令 mkdir删除空目录指令 rmdir删除指令 rm查阅手册指令 man拷贝文件指令 cp移动文件指令 mv打印内容指令 echo 查看指令查找文件指令 find查看指令…...

Linux:用 clang 编译带 sched_ext 功能内核
文章目录 1. 前言2. 编译过程2.1 准备内核源代码2.2 安装编译工具2.3 配置、编译、运行2.3.1 配置2.3.2 编译2.3.3 运行 3. 参考资料 1. 前言 限于作者能力水平,本文可能存在谬误,因此而给读者带来的损失,作者不做任何承诺。 2. 编译过程 …...

Redis 的集群 --- 数据分开扛
序言 上一章内容中我们介绍到了 哨兵 来保证我们主机在发生故障时能够及时地选出一个新的主机,但是哨兵地加入只是提供了 高可用性 和 故障转移,并没有真正的提升架构的性能。如果不断地加入新的数据的话,主机的压力会很大,一方面…...
微信小程序中缓存数据全方位解惑
微信小程序中缓存数据全方位解惑 微信小程序中的数据缓存是提升用户体验和优化性能的重要手段,跟电脑浏览器中的Local Storage的性质一样。以下是关于微信小程序数据缓存的相关知识点和示例的详细介绍: 1. 数据缓存的类型 微信小程序提供了两种数据缓…...
LeetCode 每日一题 2025/2/10-2025/2/16
记录了初步解题思路 以及本地实现代码;并不一定为最优 也希望大家能一起探讨 一起进步 目录 2/10 913. 猫和老鼠2/11 1728. 猫和老鼠 II2/12 1760. 袋子里最少数目的球2/13 1742. 盒子中小球的最大数量2/14 1552. 两球之间的磁力2/15 1706. 球会落何处2/16 1299. 将…...
使用 Shiro 和 JPA 结合 MySQL 实现一个简易权限管理系统
1. 项目设置 首先,确保你的项目已经配置好 Maven 或 Gradle 依赖管理工具,并添加以下依赖: Maven 依赖 <dependencies><!-- Shiro 核心库 --><dependency><groupId>org.apache.shiro</groupId><artifactI…...

DeepSeek与医院电子病历的深度融合路径:本地化和上云差异化分析
一、引言 1.1 研究背景与意义 在医疗信息化快速发展的当下,电子病历系统已成为医院信息管理的核心构成。电子病历(EMR)系统,是指医务人员在医疗活动过程中,使用医疗机构信息系统生成的文字、符号、图标、图形、数据、影像等数字化信息,并能实现存储、管理、传输和重现的…...
设计模式:代理模式
代理模式是很常见的设计模式,即使没有专门学习过这种设计模式,在工作中也一定用过这种设计模式。在实际生活中,代理模式也是常见的,比如内阁首辅相对于皇帝,前者是后者的代理,内阁首辅收到奏折时࿰…...

141,【1】buuctf web [SUCTF 2019]EasyWeb
进入靶场 代码审计 <?php // 定义函数get_the_flag,功能是处理文件上传相关操作 function get_the_flag() {// 注释说明:webadmin会每隔20分钟删除用户上传的文件$userdir "upload/tmp_" . md5($_SERVER[REMOTE_ADDR]);// 检查用户目录…...
破解微服务疑难杂症:2025年全解决方案
微服务架构已经成为现代软件开发的主流选择,其优势在于能够将复杂的系统拆分为独立的服务模块,方便开发和维护。然而,在微服务的实施过程中,开发者往往会面临许多挑战,如服务间通信、数据一致性、性能优化和故障处理等…...

使用VSCode开发Django指南
使用VSCode开发Django指南 一、概述 Django 是一个高级 Python 框架,专为快速、安全和可扩展的 Web 开发而设计。Django 包含对 URL 路由、页面模板和数据处理的丰富支持。 本文将创建一个简单的 Django 应用,其中包含三个使用通用基本模板的页面。在此…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...

练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...

Java-41 深入浅出 Spring - 声明式事务的支持 事务配置 XML模式 XML+注解模式
点一下关注吧!!!非常感谢!!持续更新!!! 🚀 AI篇持续更新中!(长期更新) 目前2025年06月05日更新到: AI炼丹日志-28 - Aud…...

Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...

九天毕昇深度学习平台 | 如何安装库?
pip install 库名 -i https://pypi.tuna.tsinghua.edu.cn/simple --user 举个例子: 报错 ModuleNotFoundError: No module named torch 那么我需要安装 torch pip install torch -i https://pypi.tuna.tsinghua.edu.cn/simple --user pip install 库名&#x…...

华为OD机考-机房布局
import java.util.*;public class DemoTest5 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseSystem.out.println(solve(in.nextLine()));}}priv…...

若依登录用户名和密码加密
/*** 获取公钥:前端用来密码加密* return*/GetMapping("/getPublicKey")public RSAUtil.RSAKeyPair getPublicKey() {return RSAUtil.rsaKeyPair();}新建RSAUti.Java package com.ruoyi.common.utils;import org.apache.commons.codec.binary.Base64; im…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践
01技术背景与业务挑战 某短视频点播企业深耕国内用户市场,但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大,传统架构已较难满足当前企业发展的需求,企业面临着三重挑战: ① 业务:国内用户访问海外服…...