Python实现Web请求与响应
目录
一、Web 请求与响应基础
(一)Web 请求与响应的定义与组成
(二)HTTP 协议概述
(三)常见的 HTTP 状态码
二、Python 的 requests 库
(一)安装 requests 库
(二)发送 GET 请求
(三)发送 POST 请求
(四)处理响应头和状态码
(五)发送带查询参数的 GET 请求
(六)发送带表单数据的 POST 请求
三、处理 JSON 响应
四、文件操作
(一)打开文件的模式
(二)读取文件
(三)写入文件
(四)下载文件示例
(五)文件操作中的注意事项
(六)其他常用文件操作
五、错误处理与异常捕获
(一)try 语句的使用
(二)示例:捕获常见异常
(三)异常处理总结
六、try语句
(一) 基本语法与结构
(二)捕获多种异常
( 三)捕获所有异常
(四)主动抛出异常(raise)
(五)自定义异常
(六)异常链(raise ... from)
( 七)上下文管理器(with 语句)
(八) 常见异常类型
(九)最佳实践
(十)异常处理流程
(十一) 高级用法:try-except-else-finally 组合
(十二)异常与性能
一、Web 请求与响应基础
(一)Web 请求与响应的定义与组成
Web 请求与响应是 Web 通信的基础,其中 Web 请求由客户端发起,服务器处理后返回响应。
-
Web 请求的组成
- 请求行:包含请求方法(如 GET、POST、PUT、DELETE 等)、URL 以及 HTTP 协议版本(如 HTTP/1.1)。例如,一个 GET 请求的请求行可能是 “GET /index.html HTTP/1.1”。
- 请求头:包含关于客户端信息、请求体类型、浏览器类型等元数据。常见的请求头有 User - Agent(用于标识客户端类型)、Content - Type(表示请求体的数据类型)等。
- 请求体:在 POST 请求中通常包含用户提交的数据,如表单数据或文件等,而 GET 请求一般没有请求体。
-
Web 响应的组成
- 响应行:包括 HTTP 协议版本、状态码和状态消息。例如 “HTTP/1.1 200 OK”,其中 200 是状态码,OK 是状态消息。
- 响应头:包含关于响应的信息,如内容类型(Content - Type)、服务器信息(Server)等。
- 响应体:包含实际返回的数据,可能是 HTML 页面、JSON 数据等。
(二)HTTP 协议概述
HTTP(Hypertext Transfer Protocol)是 Web 上传输数据的协议,负责浏览器与服务器之间的通信。以下是常见的 HTTP 方法:
- GET:请求服务器获取资源,通常用于读取数据,其特点是请求参数会附加在 URL 后面,以 “?” 分隔,多个参数用 “&” 连接。例如 “https://example.com/search?keyword=python”。
- POST:提交数据到服务器,通常用于表单提交、文件上传等,数据通过请求体传输,不会显示在 URL 中,相对更安全。
- PUT:用于更新服务器上的资源。
- DELETE:用于删除服务器上的资源。
(三)常见的 HTTP 状态码
- 200 OK:表示请求成功,服务器返回所请求的数据。
- 301 Moved Permanently:表示资源已永久移动,客户端会自动重定向到新的 URL。
- 404 Not Found:表示请求的资源不存在。
- 500 Internal Server Error:表示服务器内部错误。
二、Python 的 requests 库
(一)安装 requests 库
在使用 requests 库之前,需要先进行安装。如果你的系统中已经安装了 Python 的包管理工具 pip,可以通过以下命令在命令行中安装:
pip install requests
(二)发送 GET 请求
GET 请求通常用于获取数据,我们可以通过 requests.get () 方法来发送 GET 请求,并处理返回的响应。以下是一个简单的示例代码:
import requests# 发送GET请求
response = requests.get("https://www.example.com")# 输出响应的状态码
print("Status Code:", response.status_code)# 输出响应的内容
print("Response Body:", response.text)# 输出响应头
print("Response Headers:", response.headers)# 获取响应内容的长度
print("Content Length:", len(response.text))
代码解释:
requests.get()
用于发送 GET 请求,括号内传入要请求的 URL,该方法会返回一个 Response 对象,包含了服务器返回的所有信息。response.status_code
用于获取 HTTP 响应状态码,通过该状态码可以判断请求是否成功。response.text
用于获取响应的正文内容,通常是 HTML 或 JSON 数据,返回的是字符串类型。response.headers
用于获取响应头,它是一个类似字典的对象,可以通过键来访问相应的值。len(response.text)
用于返回响应正文的长度,通过该值可以帮助我们了解返回内容的大小。
(三)发送 POST 请求
POST 请求用于将数据提交到服务器,通常用于表单提交或上传文件等场景,我们使用 requests.post () 方法来发送 POST 请求。以下是示例代码:
import requests# 发送POST请求
url = "https://httpbin.org/post"
data = {"name": "Alice", "age": 25}
response = requests.post(url, data=data)# 输出响应状态码
print("Status Code:", response.status_code)# 输出响应内容(JSON格式)
print("Response Body:", response.json())
代码解释:
requests.post()
用于发送 POST 请求,第一个参数是 URL,第二个参数 data 是一个字典,包含了要提交的数据。requests 库会自动将其编码为application/x-www-form-urlencoded
格式。response.json()
用于解析返回的 JSON 数据,它会将 JSON 格式的响应内容转换为 Python 的字典或列表等数据结构,方便我们进行处理。
(四)处理响应头和状态码
响应头提供了关于服务器的信息,状态码则告诉我们请求是否成功。我们可以通过以下代码来获取响应头和状态码:
import requests# 发送GET请求
response = requests.get("https://www.example.com")# 获取响应头
print("Response Headers:", response.headers)# 获取响应状态码
print("Status Code:", response.status_code)# 获取内容类型
print("Content - Type:", response.headers.get("Content - Type"))
代码解释:
response.headers
返回响应头,其中包含了如 Content - Type、Date、Server 等信息,我们可以通过字典的 get () 方法来获取指定键的值,如获取内容类型。response.status_code
返回 HTTP 状态码,通过判断该状态码是否为 200 等成功状态码,可以确定请求是否成功执行。
(五)发送带查询参数的 GET 请求
在 GET 请求中,我们可以通过 URL 传递查询参数。例如,访问一个包含参数的 URL,我们可以通过 requests.get () 方法的 params 参数来传递查询参数。以下是示例代码:
import requests# 发送带查询参数的GET请求
url = "https://httpbin.org/get"
params = {"name": "Alice", "age": 25}
response = requests.get(url, params=params)# 输出响应内容
print("Response Body:", response.json())
代码解释:
params
是一个字典,包含了要传递的查询参数。requests.get () 方法会自动将这些参数编码到 URL 中,生成的 URL 类似于 “https://httpbin.org/get?name=Alice&age=25”。
(六)发送带表单数据的 POST 请求
POST 请求可以用来提交表单数据,以下是使用 requests 发送带表单数据的 POST 请求的示例代码:
import requests# 发送带表单数据的POST请求
url = "https://httpbin.org/post"
data = {"username": "testuser", "password": "mypassword"}
response = requests.post(url, data=data)# 输出响应的内容
print("Response Body:", response.json())
代码解释:
data
参数是一个字典,包含了表单提交的数据,requests 库会自动将数据编码为application/x-www-form-urlencoded
格式,该格式是表单数据提交的常见格式。
三、处理 JSON 响应
许多 Web API 返回的数据格式是 JSON,Python 的 requests 库提供了方便的 JSON 处理方法。以下是示例代码:
import requests# 发送GET请求并获取JSON响应
url = "https://api.github.com/users/octocat"
response = requests.get(url)# 解析JSON数据
data = response.json()# 输出用户的GitHub信息
print("User Login:", data["login"])
print("User Name:", data["name"])
代码解释:
response.json()
方法会将响应的内容解析为 Python 字典,这样我们就可以像操作普通字典一样方便地处理 JSON 数据,通过键来获取相应的值。
四、文件操作
(一)打开文件的模式
Python 使用内置的 open () 函数来打开文件,打开文件时需要指定文件模式(即操作文件的方式)。以下是常见的文件打开模式:
- 只读模式(r):默认模式,文件必须存在。如果文件不存在,会抛出 FileNotFoundError 异常。
- 写入模式(w):如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
- 追加模式(a):如果文件存在,写入的数据会追加到文件末尾;如果文件不存在,会创建新文件。
- 独占创建模式(x):若文件已存在,操作会失败并抛出 FileExistsError 异常,此模式通常用于创建文件时防止覆盖现有文件。
- 二进制读取模式(rb):用于读取非文本文件(如图片、音频文件)。
- 二进制写入模式(wb):用于写入非文本文件。
- 读写模式(+):文件必须存在,既可以读取文件内容,也可以写入数据。
- w + 模式:读写模式,如果文件存在,会覆盖文件内容;如果文件不存在,会创建新文件。
- a + 模式:读写模式,文件存在时,数据会追加到文件末尾;如果文件不存在,会创建新文件。
- rb + 模式:二进制读写模式。
以下是使用不同模式打开文件的示例代码:
# 以只读模式打开文件
with open('example.txt', 'r') as file:content = file.read()print(content)# 以写入模式打开文件,文件内容会被覆盖
with open('example.txt', 'w') as file:file.write("这是新的文件内容。\n")# 以追加模式打开文件,新的内容会追加到文件末尾
with open('example.txt', 'a') as file:file.write("追加的内容。\n")# 以二进制模式打开文件(例如读取图片)
with open('image.jpg', 'rb') as file:binary_data = file.read()print("读取到的二进制数据:", binary_data[:20])
(二)读取文件
Python 中的文件读取功能非常强大,以下是几种常见的读取方式:
- read () 方法:用于读取文件中的所有内容,读取后的内容会作为字符串返回。示例代码如下:
with open('example.txt', 'r') as file:content = file.read()print(content)
- readline () 方法:每次读取一行文件内容,适用于需要逐行处理文件的情况。示例代码如下:
with open('example.txt', 'r') as file:line = file.readline()while line:print(line.strip()) # strip()用来去除行末的换行符line = file.readline()
- readlines () 方法:会一次性读取文件中的所有行,并将每行数据存储为一个列表的元素,适用于需要读取整个文件并进行行处理的情况。示例代码如下:
with open('example.txt', 'r') as file:lines = file.readlines()for line in lines:print(line.strip())
(三)写入文件
Python 提供了几种方法将数据写入文件,写入操作常用于日志记录、数据导出等场景。
- 使用 write () 方法写入文件:该方法将指定的字符串写入文件。若文件以 “w” 模式打开,原文件内容会被覆盖;若以 “a” 模式打开,内容会被追加到文件末尾。示例代码如下:
with open('output.txt', 'w') as file:file.write("这是第一行数据。\n")file.write("这是第二行数据。\n")
- 使用 writelines () 方法写入多行数据:该方法接受一个可迭代对象(如列表、元组等),将其元素写入文件中,每个元素将作为一行写入文件。示例代码如下:
lines = ["第一行数据。\n", "第二行数据。\n", "第三行数据。\n"]
with open('output.txt', 'w') as file:file.writelines(lines)
(四)下载文件示例
我们可以通过 requests 库来下载文件,并将其保存到本地。以下是下载一个图片文件的示例代码:
import requestsurl = "https://www.example.com/image.jpg" # 图片URL
response = requests.get(url)# 检查请求是否成功
if response.status_code == 200:# 使用二进制模式写入文件with open('downloaded_image.jpg', 'wb') as file:file.write(response.content)print("图片下载成功!")
else:print(f"下载失败,状态码:{response.status_code}")
代码解释:
- 首先使用 requests.get () 方法发送 GET 请求获取图片文件的内容,设置 URL 为图片的地址。
- 通过判断响应的状态码是否为 200,来确定请求是否成功。
- 如果请求成功,使用 with open () 语句以二进制写入模式('wb')打开文件,然后通过 file.write (response.content) 将响应的内容(二进制数据)写入文件中。response.content 返回的是字节流数据,适合用于处理二进制文件。
(五)文件操作中的注意事项
- 文件是否存在:在打开文件时,必须确保文件路径正确。如果文件不存在,可以使用 os.path.exists () 函数检查文件是否存在,或者使用 try - except 语句捕获 FileNotFoundError 异常。示例代码如下:
import osif os.path.exists('example.txt'):with open('example.txt', 'r') as file:content = file.read()
else:print("文件不存在!")
- 文件权限:在操作文件时,可能会遇到权限不足的问题。例如,尝试写入只读文件,或访问没有读取权限的文件。在这种情况下,可以使用 try - except 语句来捕获 PermissionError 异常。示例代码如下:
try:with open('readonly_file.txt', 'w') as file:file.write("尝试写入只读文件")
except PermissionError:print("权限不足,无法写入文件。")
- 文件自动关闭:使用 with open () 语句时,Python 会自动管理文件的打开和关闭,无需显式调用 file.close () 方法,这有助于避免文件未关闭的问题,减少资源泄漏的风险。
(六)其他常用文件操作
- 获取文件信息:Python 提供了 os 和 os.path 模块,可以获取文件的大小、修改时间等信息。示例代码如下:
import osfile_path = 'example.txt'
print("文件大小:", os.path.getsize(file_path), "字节")
print("文件修改时间:", os.path.getmtime(file_path))
- 删除文件:使用 os.remove () 函数可以删除文件。示例代码如下:
import osfile_path = 'example.txt'
if os.path.exists(file_path):os.remove(file_path)print(f"{file_path}已删除!")
else:print("文件不存在!")
五、错误处理与异常捕获
在进行 Web 请求时,可能会发生各种错误,例如网络超时、服务器错误等。requests 库通过异常处理机制帮助我们捕获这些错误,Python 的 try 语句能够捕获和处理代码块中的异常,从而避免程序崩溃,并且提供了处理错误的机会。
(一)try 语句的使用
try 语句用于捕获和处理异常,它由以下三部分组成(其中 else 块和 finally 块可选):
- try 块:包含可能会引发异常的代码。当代码运行过程中发生错误时,程序会跳到相应的 except 块进行处理。
- except 块:当 try 块中的代码出现异常时,程序会跳转到 except 块执行。在 except 中可以指定要捕获的异常类型,如 Timeout、HTTPError 等。
- else 块(可选):如果 try 块中的代码没有抛出异常,则会执行 else 块中的代码。
- finally 块(可选):无论是否发生异常,finally 块中的代码都会执行,通常用于清理资源(如关闭文件、数据库连接等)。
(二)示例:捕获常见异常
以下是捕获常见异常的示例代码:
import requests
from requests.exceptions import RequestException, Timeout, HTTPErrortry:# 发送GET请求,并设置超时时间为5秒response = requests.get("https://www.example.com", timeout=5)# 如果状态码不是200,抛出HTTPError异常response.raise_for_status() # 如果状态码是4xx或5xx,抛出异常# 如果请求成功,则输出响应内容print("Response Body:", response.text)# 捕获请求超时异常
except Timeout:print('Request timed out')# 捕获HTTP错误(如状态码404、500等)
except HTTPError as http_err:print(f'HTTP error occurred: {http_err}')# 捕获其他网络相关的错误
except RequestException as req_err:print(f'Request error occurred: {req_err}')# 可以在finally块中清理资源(如关闭文件或连接)
finally:print("Request attempt completed.")
代码解释:
- try 块:首先发起 HTTP 请求,通过 timeout=5 参数设置超时时间为 5 秒。然后使用 response.raise_for_status () 方法来检查响应的状态码,如果服务器返回了错误的状态码(如 404、500 等,即 4xx 或 5xx 的状态码),该方法会抛出 HTTPError 异常。如果如果状态码为 200 等成功状态码,则执行后续的打印响应内容的操作。
-
except 块:
- Timeout:当请求超时(超过设置的 5 秒)时,程序会捕获到 Timeout 异常,并打印 “Request timed out”,提示用户请求超时。
- HTTPError:若响应的状态码表明出现 HTTP 错误(例如 404 表示未找到页面,500 表示服务器内部错误等),程序会捕获到 HTTPError 异常,并打印相关错误信息,如 “HTTP error occurred: 404 Client Error: Not Found for url: https://www.example.com”,其中包含具体的错误状态码和错误描述,方便用户了解出错原因。
- RequestException:该异常是所有 requests 库异常的基类,可以捕获任何 requests 库抛出的异常,例如连接问题、DNS 解析失败等。当发生其他网络相关错误时,程序会捕获到 RequestException 异常,并打印 “Request error occurred: [具体错误信息]”,让用户知晓发生了网络请求相关的错误。
-
finally 块:其中的代码无论是否发生异常都会被执行,这里仅打印 “Request attempt completed.”,用于表示请求的结束,通常在此处可以进行一些资源清理工作,如关闭文件、数据库连接等,确保程序的资源得到合理释放。
(三)异常处理总结
- 避免程序崩溃:异常处理机制让我们在程序运行中能够捕获到错误并做出相应处理,避免程序因为遇到异常而突然崩溃,提高了程序的稳定性和可靠性。
- 精确处理异常:通过 try...except 结构,可以根据不同的异常类型进行精确的捕获和处理,针对不同的错误情况执行不同的处理逻辑,使程序能够更灵活地应对各种异常情况。例如,对于超时异常可以重新发起请求,对于 HTTP 错误可以提示用户检查请求的 URL 是否正确等。
- 资源清理:finally 块用于执行清理工作,无论是否发生异常,都会在请求处理完成后执行其中的代码,确保资源(如文件句柄、网络连接等)能够被正确释放,避免资源泄漏问题的发生,这对于长时间运行的程序尤为重要。
六、try语句
(一) 基本语法与结构
try:# 可能引发异常的代码块result = 10 / 0 # 除零错误
except ZeroDivisionError as e:# 捕获特定异常并获取错误对象print(f"错误: {e}") # 输出: division by zero
else:# 仅在 try 块无异常时执行print("计算成功:", result)
finally:# 无论是否异常都执行(常用于资源清理)print("执行完毕")
(二)捕获多种异常
1 .分别处理不同异常
try:num = int("abc") # ValueErrorresult = 10 / num # ZeroDivisionError
except ValueError:print("输入不是有效整数")
except ZeroDivisionError:print("除数不能为零")
2 .合并处理同类异常
try:file = open("nonexistent.txt") # FileNotFoundErrordata = json.load(file) # JSONDecodeError
except (FileNotFoundError, json.JSONDecodeError) as e:print(f"文件错误: {e}")
( 三)捕获所有异常
⚠️ 不推荐滥用,可能掩盖严重问题:
try:# 任意代码
except Exception as e:print(f"未知错误: {e}")# 推荐记录堆栈信息用于调试import tracebackprint(traceback.format_exc())
(四)主动抛出异常(raise
)
def validate_age(age):if age < 0:raise ValueError("年龄不能为负数")return agetry:validate_age(-5)
except ValueError as e:print(e) # 输出: 年龄不能为负数
(五)自定义异常
class AuthError(Exception):"""自定义认证错误"""def __init__(self, message="认证失败"):self.message = messagesuper().__init__(self.message)# 使用示例
try:if not user_authenticated():raise AuthError("无效令牌")
except AuthError as e:print(f"认证异常: {e}")
(六)异常链(raise ... from
)
保留原始异常信息,便于定位问题:
try:data = json.loads("invalid json")
except json.JSONDecodeError as e:raise RuntimeError("配置解析失败") from e
输出:
Traceback (most recent call last):File "<stdin>", line 2, in <module>
json.JSONDecodeError: Expecting value...The above exception was the direct cause of the following exception:Traceback (most recent call last):File "<stdin>", line 4, in <module>
RuntimeError: 配置解析失败
( 七)上下文管理器(with
语句)
替代 try-finally
进行自动资源管理:
try:with open("data.txt", "r") as file:content = file.read()
except FileNotFoundError:print("文件不存在")
# 文件会自动关闭,无需手动调用 file.close()
(八) 常见异常类型
异常类型 | 触发场景 |
---|---|
ZeroDivisionError | 除零错误 |
TypeError | 类型不匹配(如字符串 + 整数) |
ValueError | 值不符合预期(如 int("abc") ) |
FileNotFoundError | 文件不存在 |
KeyError | 字典键不存在 |
IndexError | 索引越界 |
PermissionError | 权限不足 |
TimeoutError | 操作超时 |
(九)最佳实践
1 .精确捕获异常
try:result = 10 / num
except (ZeroDivisionError, TypeError) as e:print(f"计算错误: {e}")
2 .使用 logging
记录异常
import loggingtry:# 危险操作
except Exception as e:logging.error(f"系统异常: {e}", exc_info=True)
3 .自定义异常分层
class AppError(Exception):"""应用基础异常"""class DatabaseError(AppError):"""数据库操作异常"""class ConnectionError(DatabaseError):"""连接异常"""
4 .资源清理优先用 with
# 不推荐
file = open("data.txt")
try:data = file.read()
finally:file.close()# 推荐
with open("data.txt") as file:data = file.read()
(十)异常处理流程
- 执行
try
块:若有异常,跳转到第一个匹配的except
- 匹配
except
:按顺序检查,找到则执行对应代码块 - 执行
else
:若try
无异常 - 执行
finally
:无论是否异常,最终执行
(十一) 高级用法:try-except-else-finally
组合
try:# 尝试操作file = open("config.json", "r")
except FileNotFoundError:# 处理缺失配置print("使用默认配置")config = DEFAULT_CONFIG
else:# 无异常时读取配置try:config = json.load(file)except json.JSONDecodeError:print("配置格式错误,使用默认值")config = DEFAULT_CONFIGfinally:file.close() # 确保文件关闭
finally:# 应用配置apply_config(config)
(十二)异常与性能
- 异常处理本身不慢,但频繁抛出 / 捕获会影响性能
- 避免用异常控制常规流程(如循环读取文件)
- 优先使用条件判断(如
if os.path.exists(file)
)
相关文章:
Python实现Web请求与响应
目录 一、Web 请求与响应基础 (一)Web 请求与响应的定义与组成 (二)HTTP 协议概述 (三)常见的 HTTP 状态码 二、Python 的 requests 库 (一)安装 requests 库 (二…...
AI与.NET技术实操系列(六):实现图像分类模型的部署与调用
引言 人工智能(AI)技术的迅猛发展推动了各行各业的数字化转型。图像分类,作为计算机视觉领域的核心技术之一,能够让机器自动识别图像中的物体、场景或特征,已广泛应用于医疗诊断、安防监控、自动驾驶和电子商务等领域…...
PP-YOLOE-SOD学习笔记1
项目:基于PP-YOLOE-SOD的无人机航拍图像检测案例全流程实操 - 飞桨AI Studio星河社区 一、安装环境 先准备新环境py>3.9 1.先cd到源代码的根目录下 2.pip install -r requirements.txt 3.python setup.py install 这一步需要看自己的GPU情况,去飞浆…...
Axure系统原型设计列表版方案
列表页面是众多系统的核心组成部分,承担着数据呈现与基础交互的重要任务。一个优秀的列表版设计,能够极大提升用户获取信息的效率,优化操作体验。下面,我们将结合一系列精心设计的列表版方案图片,深入探讨如何打造出实…...
腾讯音乐二面
ReentrantLock 的源码及实现 ReentrantLock 是 Java 中的一种可重入的互斥锁。它通过 AQS(AbstractQueuedSynchronizer)框架来实现。AQS 使用一个 FIFO 队列来管理获取锁的线程。ReentrantLock 有公平锁和非公平锁两种模式。非公平锁:当线程尝…...
服务器操作系统调优内核参数(方便查询)
fs.aio-max-nr1048576 #此参数限制并发未完成的异步请求数目,应该设置避免I/O子系统故障 fs.file-max1048575 #该参数决定了系统中所允许的文件句柄最大数目,文件句柄设置代表linux系统中可以打开的文件的数量 fs.inotify.max_user_watches8192000 #表…...
MySQL5.7导入MySQL8.0的文件不成功
文章目录 问题检查原因及解决方法原因解决办法 问题 检查 检查自己的mysql版本自己检查,搜索“0900_ai_ci”,如果能搜索到,说明这个sql文件是从8的版本导出的 原因及解决方法 原因 MySQL 8.0默认使用utf8mb4字符集和utf8mb4_0900_ai_ci排…...
vscode连接WSL卡住
原因:打开防火墙 解决: 使用sudo ufw disable关闭防火墙...
springAI调用deepseek模型使用硅基流动api的配置信息
查看springai的官方文档,调用deepseek的格式如下: spring.ai.deepseek.api-key${your-api-key} spring.ai.deepseek.chat.options.modeldeepseek-chat spring.ai.deepseek.chat.options.temperature0.8 但是硅基流动的格式不是这样,这个伞兵…...
symbol【ES6】
你一闭眼世界就黑了,你不是主角是什么? 目录 什么是Symbol?Symbol特点:创建方法:注意点:不能进行运算:显示调用toString() --没有意义隐式转换boolean 如果属性名冲突了怎么办?o…...
如何用数据可视化提升你的决策力?
在数字化浪潮席卷全球的当下,数据已然成为企业和组织发展的核心资产。然而,单纯的数据堆积犹如未经雕琢的璞玉,难以直接为决策提供清晰有力的支持。数据可视化作为一种强大的工具,能够将海量、复杂的数据转化为直观、易懂的图形、…...
【C++】vector容器实现
目录 一、vector的成员变量 二、vector手动实现 (1)构造 (2)析构 (3)尾插 (4)扩容 (5)[ ]运算符重载 5.1 迭代器的实现: (6&…...
C语言求1到n的和(附带源码和解析)
在C语言中,使用 for 循环求 1 到 n 的和是一个常见的编程任务。这个任务不仅可以帮助初学者理解循环的基本概念,还能培养他们的逻辑思维能力。 要计算 1 到 n 的和,我们需要创建一个循环,从 1 开始,一直累加到 n。for…...
springboot3+vue3融合项目实战-大事件文章管理系统-文章分类也表查询(条件分页)
在pojo实体类中增加pagebean实体类 Data NoArgsConstructor AllArgsConstructor public class PageBean <T>{private Long total;//总条数private List<T> items;//当前页数据集合 }articlecontroller增加代码 GetMappingpublic Result<PageBean<Article&g…...
java中定时任务的实现及使用场景
在 Java 需要中,定时任务的实现方式有单线程模型的 Timer 类、线程池定时任务的 ScheduleExecutorService、spring 框架提供的注解Schedule 定时任务,第三个框架定时任务比如 XX-Job,Quartz 等。 Java 任务调度组件对比与使用指南 一、核心功能对比 特…...
使用 OpenCV 实现哈哈镜效果
在计算机视觉和图像处理领域,OpenCV 提供了非常强大的图像几何变换能力,不仅可以用于纠正图像,还能制造各种“有趣”的视觉效果。今天,我们就来实现一个经典的“哈哈镜”效果,让图像像在游乐园里一样被拉伸、压缩、扭曲…...
【Java高阶面经:微服务篇】9.微服务高可用全攻略:从架构设计到自动容灾
一、架构层:构建抗故障的分布式基石 1.1 多维度冗余设计 1.1.1 跨可用区部署策略 # Kubernetes跨可用区反亲和性配置 apiVersion: apps/v1 kind: Deployment metadata:name: product-service spec:replicas: 3template:spec:affinity:podAntiAffinity:requiredDuringSchedu…...
读一本书第一遍是快读还是细读?
在时间充足且计划对重要书籍进行多遍阅读的前提下,第一遍阅读的策略可以结合**「快读搭建框架」与「标记重点」**,为后续细读奠定基础。以下是具体建议及操作逻辑: 一、第一遍:快读为主,目标是「建立全局认知」 1. 快…...
COMPUTEX 2025 | 广和通5G AI MiFi解决方案助力移动宽带终端迈向AI新未来
随着5G与AI不断融合,稳定高速、智能的移动网络已成为商务、旅行、户外作业等场景的刚需。广和通5G AI MiFi方案凭借领先技术与创新设计,重新定义5G移动网络体验。 广和通5G AI MiFi 方案搭载高通 4nm制程QCM4490平台,融合手机级超低功耗技术…...
JAVA批量发送邮件(含excel内容)
EmailSenderHtmlV1 是读取配置文件《批量发送邮件.xlsx》,配置sheet获取 发件人邮箱 邮箱账号 口令,发送excel数据sheet获取收件人邮箱 抄送人邮箱 邮件标题 第N行开始(N>1,N0默认表头) 第M行结束(M>1,M0默认表头) 附件文件夹…...
MyBatis 关联映射深度解析:_association_ 与 _collection_ 实战教程
一、核心概念与适用场景 在 MyBatis 中,<association> 和 <collection> 用于处理对象间的关联关系,简化复杂查询到对象结构的映射。 标签用途对应关系示例场景<association>映射 单个嵌套对象(“有一个”关系)一对一、多对一员工 (Emp) 属于一个部门 (D…...
NSSCTF [watevrCTF 2019]Wat-sql
90.[watevrCTF 2019]Wat-sql(逻辑漏洞) [watevrCTF 2019]Wat-sql (1) 1.准备 motalymotaly-VMware-Virtual-Platform:~$ file sql sql: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linu…...
C++ 前缀和数组
一. 一维数组前缀和 1.1. 定义 前缀和算法通过预处理数组,计算从起始位置到每个位置的和,生成一个新的数组(前缀和数组)。利用该数组,可以快速计算任意区间的和,快速求出数组中某一段连续区间的和。 1.2. …...
免费使用GPU的探索笔记
多种有免费时长的平台 https://www.cnblogs.com/java-note/p/18760386 Kaggle免费使用GPU的探索 https://www.kaggle.com/ 注册Kaggle账号 访问Kaggle官网,使用邮箱注册账号。 发现gpu都是灰色的 返回home,右上角的头像点开 验证手机号 再次code-you…...
【css】 flex布局基本知识
Flexible Box 模型,是一种一维的布局模型。一个 flexbox 一次只能处理一个维度上的元素布局,一行或者一列。 轴线 flex 属性与主轴和交叉轴有关,通过flex-direction定义 主轴由 flex-direction 定义,可以取 4 个值:…...
3D Gaussian Splatting for Real-Time Radiance Field Rendering——文章方法精解
SfM → Point-NeRF → 3D Gaussian Splatting 🟦SfM Structure-from-Motion(运动恢复结构,简称 SfM)是一种计算机视觉技术,可以: 利用多张从不同角度拍摄的图像,恢复出场景的三维结构和相机的…...
RestTemplate 发送的字段第二个大写字母变成小写的问题探究
在使用RestTemplate 发送http 请求的时候,发现nDecisonVar 转换成了ndecisonVar ,但是打印日志用fastjson 打印的没有问题,换成jackson 打印就有问题。因为RestTemplate 默认使用的jackson 作为json 序列化方式,导致的问题,但是为…...
第二次中医知识问答微调
由于昨天微调效果并不理想,因此更换数据集和参数进行重新进行了微调 本次微调参数如下: llamafactory-cli train \ --stage sft \ --do_train True \ --model_name_or_path /home/qhyz/zxy/LLaMA-Factory/model \ --preprocessing_num_workers 16 \ --…...
Linux查 ssh端口号和服务状态
一、检查SSH服务运行状态 通过进程查看命令验证服务是否启动: ps -ef | grep ssh当输出包含sshd进程时,表示SSH服务正在运行。示例输出: root 1234 1 0 10:00 ? 00:00:00 /usr/sbin/sshd二、查看服务监听端口 使用网络…...
C++ 11(1):
C11的发展史: C11中的{}: 看这个图片,我们的C11是所有的对象都可以使用{}来进行初始化,之前我们的int类型的数据要使用赋值符号来进行初始化,现在的话我们可以直接使用花括号来进行,并且连赋值符号都可以去…...
数据结构(4)线性表-链表-双链表
一、链表的分类 迟来的分类,主要如果在学习单链表前去讲分类,可能就云里雾里的,所以放在讲完单链表后讲。 划分链表的标准如下: 有没有头结点、指针的方向、循环与否 头结点就是一个占位结点,也被叫做哨兵位&#x…...
Spring Framework 的 spring-core 和 Spring Security 兼容版本
Spring Framework 的 spring-core 和 Spring Security 兼容版本 Spring Framework 的 spring-core 和 Spring Security 的版本需要保持兼容性,尤其是在旧版本(如 Spring 4.x)中。以下是它们的版本对应关系: Spring 4.x (spring-c…...
《国家职业教育平台:点亮职业教育新灯塔》
职教新航标:平台诞生记 国家职业教育智慧教育平台 在科技飞速发展的今天,数字化浪潮席卷全球,深刻地改变着我们生活的方方面面,教育领域也不例外。随着信息技术的不断进步,教育数字化已成为当今世界教育发展的重要趋势…...
Java多线程深度解析:从核心机制到高阶实战
Java多线程深度解析:从核心机制到高阶实战 摘要:本文系统解析Java多线程全体系知识,涵盖线程实现原理、并发工具实战、锁机制底层实现、线程池参数调优策略,并提供20可运行代码片段。附内存模型原理与性能优化指南。 目录 线程基…...
大量程粗糙度轮廓仪适用于哪些材质和表面?
大量程粗糙度轮廓仪是一种能够在广泛的测量范围内对工件表面进行粗糙度分析的精密仪器。它通常采用接触式或非接触式传感器,通过对工件表面的扫描,捕捉表面微观的起伏和波动,从而获取粗糙度数据。该仪器不仅能测量微小的表面细节,…...
NC028NQ472美光固态颗粒NQ484NQ485
深度解析:NC028NQ472、NQ484与NQ485美光固态颗粒 技术架构解析:堆叠式存储与算法优化 美光NC028NQ472、NQ484及NQ485系列固态颗粒均采用自研3D TLC NAND闪存技术,其核心架构通过垂直堆叠存储单元实现高密度集成。以NQ472为例,采…...
Cursor神一样的存在,核心能力codebase是如何工作的?
最近宣布达到 3 亿美元年度经常性收入,已经成为vibe coding标配。核心能力来自于Codebase。根据官方说法,codebase实现是依赖使用 Merkle 树来快速索引代码。但是没有竞品模仿这种方法。 Merkle是如何工作的那? Merkle 树简单解释 Merkle …...
python代码绘制某只股票最近90天的K线图、均线、量能图
运行代码,要求输入股票代码和名称,其他参数可省略 import akshare as ak import matplotlib.pyplot as plt import pandas as pd import mplfinance as mpf import matplotlib.dates as mdates import numpy as np import os from datetime import date…...
upload-labs通关笔记-第15关 文件上传之getimagesize绕过(图片马)
目录 一、图片马 二、文件包含 三、文件包含与图片马 四、图片马制作方法 五、源码分析 六、制作图片马 1、创建脚本并命名为test.php 2、准备制作图片马的三类图片 3、 使用copy命令制作图片马 七、渗透实战 1、GIF图片马渗透 (1)上传gif图…...
反弹shell
shell了解 shell其xxxx是交互,点鼠标敲键盘与计算机进行交互,还有常见的shell(cmd,powershell) shell反弹 当远程连接shell(windows远程桌面,linux有SSH之类),从外面远…...
【动手学深度学习】1.3. 各种机器学习问题
目录 1.3. 各种机器学习问题1)监督学习(supervisedlearning)(1)回归(regression)(2)分类(classification)(3)标记问题&…...
OS进程调度
tss Q1:你是如何保证两个进程不能同时访问共享资源的? ✅ 推荐回答: 我实现了基于结构体的互斥锁,使用 mutex_lock() 来加锁资源。如果已有任务持有锁,则当前任务会被阻塞并加入等待队列,直到被唤醒。解锁…...
MCP和 AI agent 有什么区别和联系
MCP 是什么? MCP(Model Context Protocol,模型上下文协议)是一种开源通信协议,旨在为大型语言模型(LLM)与外部数据源、工具或服务之间建立标准化、安全且灵活的双向连接。它类似于“AI 的 USB-…...
用Recommenders,实现个性化推荐
文章目录 引言一、Recommenders简介二、选择Recommenders的原因三、智能推荐系统的设计与实现四、总结 引言 在这个信息如洪流般涌来的时代,你是否常常在茫茫的信息海洋中迷失方向,为找不到自己心仪的内容而苦恼?今天咱们就来聊聊基于Micros…...
MCP-1:MCP组件与工作流程
MCP-1:MCP组件与工作流程 1.什么是MCP2.MCP架构组件2.1.MCP Hosts2.2.MCP Client2.3.MCP Server3.交互流程3.1.用户提问3.2.LLM 推理选择MCP Server(大模型规划)3.3.调用 MCP Tool3.4.返回结果3.5.数据清洗3.6.反馈信息给用户1.什么是MCP MCP(Model Context Proto…...
NVIDIA GPU 性能调优与诊断完全指南
本文为多 GPU 用户(如 3*RTX A4000 系统)提供一份全面的调优与诊断手册,涵盖功率限制、风扇控制、频率锁定、缓存清理、GPU 重置与性能测试工具等操作命令,适合开发者与研究人员在部署前进行系统级优化与验证。 📌 目录…...
从运维告警到业务决策:可观测性正在重新定义企业数据基础设施
可观测性(Observability)与传统监控(Monitoring)的核心差异,本质上是一种数据维度的主动暴露与被动采集的范式转变。传统监控就像在黑暗森林中设置有限的探照灯,运维人员必须预先假设可能的故障路径&#x…...
配电网运行状态综合评估方法研究
1评估指标体系的构建 [1]冷华,童莹,李欣然,等.配电网运行状态综合评估方法研究[J].电力系统保护与控制,2017,45(01):53-59. 1.1评估范围 图1为配电系统组成示意图,其中A、B、C分别表示高、中、低压配电系统。高压配变(也称主变)将35kV或110kV的电压降到10kV&#…...
Linux中I/O复用机制epoll
1. 为什么会出现 epoll? 在早期的网络编程中,select 是一个非常常用的 I/O 复用机制,用于在多个文件描述符(如套接字)上进行 I/O 操作的检测。select 会将多个文件描述符传入,轮询检查它们的状态ÿ…...
数据库表关系详解
一、一对多关系 特征:表A的一条记录对应表B的多条记录,表B的一条记录仅对应表A的一条记录 示例: 学生表(子表) | id | name | class_id | |-----|------|----------| |1001| 张三 | 111 | |1002| 张四 | 222 | 班级表…...