Python Requests库详解

        大家好,在现代网络开发中,与Web服务器进行通信是一项至关重要的任务。Python作为一种多才多艺的编程语言,提供了各种工具和库来简化这一过程。其中,Requests库作为Python中最受欢迎的HTTP库之一,为开发人员提供了简单而强大的方式来发送HTTP请求和处理响应。

        从最基本的GET请求到复杂的身份验证和代理设置,Requests库为我们提供了丰富的功能和灵活的接口。无论是爬虫、Web开发还是测试,Requests都是一个不可或缺的工具。

        本文将带领您深入探索Python Requests库的世界。我们将从基础知识开始,逐步深入,覆盖各种高级用法和技巧。无论您是初学者还是有经验的开发者,本文都将为您提供有价值的信息和实用的技巧,帮助您更好地利用Python Requests库构建强大的网络应用。

一、介绍

        在现代网络通信中,发送HTTP请求和处理响应是编程中常见的任务之一。而Python中的Requests库为开发人员提供了一种简单、优雅且功能丰富的方法来处理这些任务。

Requests是什么?

        Requests是一个优雅且简洁的HTTP库,专门设计用于发送各种类型的HTTP请求。它由Kenneth Reitz于2010年创建,并迅速成为Python社区中最受欢迎的HTTP客户端库之一。Requests库构建在Python的标准库urllib之上,提供了更简洁、更人性化的接口。

Requests库的作用

        Requests库的主要作用是简化HTTP请求的发送和响应的处理。通过Requests,开发人员可以轻松地执行GET、POST、PUT、DELETE等各种类型的HTTP请求,并处理服务器返回的响应数据。不仅如此,Requests还提供了许多方便的功能,比如自动处理重定向、会话管理、身份验证、代理设置等,使得网络通信变得更加简单和灵活。

为什么Requests库如此流行?

Requests库之所以如此流行,是因为它具有以下几个显著的优点:

  1. 简单易用:Requests提供了简洁而直观的API,使得发送HTTP请求变得非常容易。开发人员无需处理复杂的细节,只需几行代码就可以完成常见的网络通信任务。

  2. 功能丰富:尽管Requests提供了简单的接口,但它同时也提供了许多强大的功能和高级选项,满足了各种复杂场景下的需求。无论是处理会话、处理重定向、进行身份验证还是设置代理,Requests都能轻松胜任。

  3. 文档齐全:Requests拥有清晰、详细的官方文档,涵盖了库的各个方面,包括基本用法、高级功能、示例代码等。这使得开发人员可以轻松查阅文档,解决各种问题。

  4. 活跃的社区支持:Requests库拥有一个庞大且活跃的社区,开发人员可以在社区中获得及时的帮助和支持。无论是提出问题、报告Bug还是贡献代码,社区都是一个宝贵的资源。

        Requests库因其简单易用、功能丰富且受到活跃的社区支持而在Python开发中广受欢迎。它成为了许多开发人员处理HTTP请求的首选工具,为他们节省了大量的时间和精力。

二、安装

        安装Requests库是开始使用它的第一步。在这一部分,我们将详细说明如何安装Requests库,并提供一些可能遇到的安装问题及其解决方案。

1. 使用pip安装

        大多数情况下,使用Python的包管理工具pip来安装Requests库是最简单的方法。如果你使用的是Python 3,通常pip已经随着Python的安装而包含在内。以下是安装Requests库的命令:

pip install requests

2. 使用conda安装

如果你使用的是Anaconda Python发行版,你也可以使用conda来安装Requests库:

conda install requests

3. 可能的安装问题及解决方案

        尽管安装Requests库通常是一件简单的事情,但有时你可能会遇到一些问题。以下是一些可能的安装问题及其解决方案:

问题1:SSL证书验证失败

        有时在安装Requests库时可能会出现SSL证书验证失败的问题,这可能是因为缺少适当的SSL证书或网络环境的问题。

解决方案:你可以尝试在安装时禁用SSL证书验证。在pip安装时,你可以使用--trusted-host参数,如下所示:

pip install --trusted-host pypi.org --trusted-host pypi.python.org --trusted-host=files.pythonhosted.org requests

问题2:安装过程慢或失败

有时由于网络问题或服务器问题,安装过程可能会变得缓慢或失败。

解决方案:你可以尝试更换pip的镜像源来加速安装过程,或者尝试多次运行安装命令以解决服务器问题。

问题3:权限问题

在某些操作系统中,可能会由于权限问题而导致安装失败。

解决方案:你可以尝试使用管理员权限或者使用虚拟环境来避免权限问题。

问题4:依赖冲突

有时安装Requests库可能会与其他依赖冲突。

解决方案:你可以尝试升级或降级pip、Python或其他相关的依赖包,以解决依赖冲突。

三、发送基本的 GET 和 POST 请求

        在网络通信中,最常见的两种HTTP请求是GET请求和POST请求。GET请求用于从服务器获取资源,而POST请求用于向服务器提交数据。在这一部分,我们将演示如何使用Requests库发送最基本的GET和POST请求,并解释它们之间的区别。

1. 发送GET请求

        使用Requests库发送GET请求非常简单。你只需要使用requests.get()函数,并传入目标URL即可。下面是一个简单的示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 打印响应内容
print(response.text)

上面的代码发送了一个GET请求到https://api.example.com/data,并打印了服务器响应的内容。

2. 发送POST请求

与GET请求类似,发送POST请求也非常简单。你只需要使用requests.post()函数,并传入目标URL和要提交的数据即可。下面是一个简单的示例:

import requests

# 要提交的数据
data = {'username': 'user', 'password': '123456'}

# 发送POST请求
response = requests.post('https://api.example.com/login', data=data)

# 打印响应内容
print(response.text)

        上面的代码发送了一个POST请求到https://api.example.com/login,并提交了用户名和密码数据。服务器接收到数据后,会进行处理,并返回相应的响应。

3. GET请求和POST请求的区别

GET请求和POST请求的主要区别在于数据的传输方式和安全性:

  • GET请求:通过URL参数传递数据,数据以明文形式出现在URL中,因此不适合传输敏感信息。GET请求通常用于获取资源,比如网页、图片等。

  • POST请求:通过请求体传递数据,数据以密文形式传输,因此更安全,适合传输敏感信息。POST请求通常用于向服务器提交数据,比如用户登录、提交表单等。

        总的来说,GET请求适合用于获取资源,而POST请求适合用于提交数据。在实际开发中,你需要根据具体的需求选择合适的请求方式。

四、请求头和请求体

        在发送HTTP请求时,除了URL以外,还可以设置请求头和请求体。请求头用于传递一些额外的信息给服务器,比如用户代理、授权信息等。请求体则用于向服务器提交数据,比如表单数据、JSON数据等。在这一部分,我们将详细说明如何设置请求头和请求体,并解释它们的作用。

1. 设置请求头

        使用Requests库设置请求头非常简单,你只需要传递一个字典给headers参数即可。下面是一个示例:

import requests

# 设置请求头
headers = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36',
    'Authorization': 'Bearer your_access_token'
}

# 发送带有自定义请求头的GET请求
response = requests.get('https://api.example.com/data', headers=headers)

# 打印响应内容
print(response.text)

上面的代码设置了两个常见的请求头:User-Agent用于指定用户代理,Authorization用于进行身份验证。你可以根据需要设置其他请求头。

2. 设置请求体

发送POST请求时,你可以通过data参数设置请求体,传递要提交的数据。如果要发送JSON数据,可以使用json参数。下面是一个示例:

import requests

# 要提交的数据
data = {
    'username': 'user',
    'password': '123456'
}

# 发送带有请求体的POST请求
response = requests.post('https://api.example.com/login', data=data)

# 打印响应内容
print(response.text)

上面的代码设置了一个请求体,包含了用户名和密码数据。服务器收到数据后,会进行处理,并返回相应的响应。

3. 请求头和请求体的作用

  • 请求头:请求头包含了一些附加的信息,用于告诉服务器关于请求的一些额外信息,比如客户端类型、接受的数据类型等。它可以用于实现用户代理识别、身份验证、设置Cookie等功能。

  • 请求体:请求体用于向服务器提交数据,比如表单数据、JSON数据等。它通常用于向服务器发送需要处理的数据,比如用户登录信息、搜索关键字等。

总的来说,请求头和请求体都是HTTP请求的重要组成部分,可以通过设置它们来实现各种功能和需求。

五、处理响应

        处理HTTP响应是使用Requests库的关键部分之一。在发送HTTP请求后,服务器将返回一个响应,其中包含了状态码、响应头和响应体等信息。在这一部分,我们将讨论如何处理HTTP响应,包括获取状态码、响应头和响应体,并给出相应的示例。

1. 获取状态码

        状态码是服务器对请求的响应的一个数字编码,用于指示请求的成功或失败以及失败的原因。你可以通过status_code属性来获取响应的状态码。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取状态码
status_code = response.status_code

# 打印状态码
print("状态码:", status_code)

        上面的代码发送了一个GET请求,并获取了响应的状态码。你可以根据状态码来判断请求是否成功以及如何进一步处理响应。

2. 获取响应头

        响应头包含了一些关于响应的元信息,比如服务器类型、内容类型、内容长度等。你可以通过headers属性来获取响应头。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取响应头
headers = response.headers

# 打印响应头
print("响应头:", headers)

        上面的代码发送了一个GET请求,并获取了响应的头部信息。你可以从中获取到各种有用的信息,比如内容类型、服务器类型等。

3. 获取响应体

        响应体包含了服务器返回的实际数据内容。你可以通过text属性来获取响应体的文本内容,或者使用content属性获取二进制内容。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 获取响应体文本内容
body_text = response.text

# 获取响应体二进制内容
body_binary = response.content

# 打印响应体文本内容
print("响应体文本内容:", body_text)

# 打印响应体二进制内容
print("响应体二进制内容:", body_binary)

        上面的代码发送了一个GET请求,并获取了响应的文本内容和二进制内容。你可以根据实际需求选择使用响应体的文本内容或二进制内容。

六、处理响应内容

        在使用Requests库时,我们经常需要处理不同类型的响应内容,包括JSON、文本和二进制等。在这一部分,我们将展示如何使用Requests库处理这些不同类型的响应内容,并给出相应的示例。

1. 处理JSON响应内容

        如果服务器返回的是JSON格式的数据,我们可以使用json()方法将响应内容解析为Python字典。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/data')

# 解析JSON响应内容
json_data = response.json()

# 打印解析后的数据
print("解析后的JSON数据:", json_data)

        上面的代码发送了一个GET请求,并将响应内容解析为Python字典。你可以直接使用json_data变量来访问和操作解析后的JSON数据。

2. 处理文本响应内容

        如果服务器返回的是文本格式的数据,我们可以使用text属性来获取响应内容的文本表示。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/text')

# 获取文本响应内容
text_data = response.text

# 打印文本内容
print("文本内容:", text_data)

        上面的代码发送了一个GET请求,并获取了响应内容的文本表示。你可以直接使用text_data变量来访问和操作文本内容。

3. 处理二进制响应内容

        有时服务器返回的是二进制格式的数据,比如图片、音频等。我们可以使用content属性来获取响应内容的二进制表示。下面是一个示例:

import requests

# 发送GET请求
response = requests.get('https://api.example.com/image')

# 获取二进制响应内容
binary_data = response.content

# 将二进制内容写入文件
with open('image.jpg', 'wb') as f:
    f.write(binary_data)

        上面的代码发送了一个GET请求,并获取了响应内容的二进制表示。然后,我们将二进制内容写入到名为image.jpg的文件中,以保存图片文件。

七、高级功能

        Requests库不仅提供了基本的HTTP请求功能,还支持许多高级功能,包括会话管理、身份验证、代理设置、SSL验证等。在这一部分,我们将介绍这些高级功能,并给出相应的示例。

1. 会话管理

        会话管理允许你在多个请求之间保持会话状态。这对于模拟登录过程或者保持持久连接非常有用。你可以使用Session对象来创建一个持久的会话,并在此会话中发送多个请求。下面是一个示例:

import requests

# 创建会话对象
session = requests.Session()

# 发送第一个请求
response1 = session.get('https://api.example.com/login')

# 发送第二个请求
response2 = session.get('https://api.example.com/data')

# 关闭会话
session.close()

# 打印响应内容
print("第一个请求响应内容:", response1.text)
print("第二个请求响应内容:", response2.text)

        上面的代码创建了一个会话对象session,然后使用这个会话对象发送了两个请求。由于这两个请求共享同一个会话,因此可以保持会话状态。

2. 身份验证

        Requests库支持多种身份验证方式,包括基本身份验证、摘要身份验证、OAuth身份验证等。你可以在发送请求时,通过auth参数来指定身份验证方式。下面是一个示例:

import requests

# 基本身份验证
response = requests.get('https://api.example.com/data', auth=('username', 'password'))

# 打印响应内容
print("响应内容:", response.text)

        上面的代码使用基本身份验证方式发送了一个GET请求,其中用户名为username,密码为password

3. 代理设置

        有时候我们需要通过代理服务器来发送HTTP请求。Requests库允许你通过proxies参数来设置代理服务器。下面是一个示例:

import requests

# 设置代理服务器
proxies = {
    'http': 'http://10.10.1.10:3128',
    'https': 'https://10.10.1.10:1080',
}

# 发送请求通过代理服务器
response = requests.get('https://api.example.com/data', proxies=proxies)

# 打印响应内容
print("响应内容:", response.text)

        上面的代码设置了一个HTTP代理服务器和一个HTTPS代理服务器,并使用这些代理服务器发送了一个GET请求。

4. SSL验证

        Requests库默认会对HTTPS请求进行SSL证书验证。你可以通过verify参数来控制是否进行SSL验证。通常,你可以将其设置为True来进行验证,或者设置为一个包含CA证书文件路径的字符串来指定验证证书。下面是一个示例:

import requests

# 发送HTTPS请求并进行SSL验证
response = requests.get('https://api.example.com/data', verify=True)

# 打印响应内容
print("响应内容:", response.text)

上面的代码发送了一个HTTPS请求,并进行了SSL验证。

八、异常处理

        在进行网络请求时,可能会遇到各种异常情况,比如网络连接问题、服务器错误、超时等。为了确保代码的健壮性和可靠性,我们需要对这些异常情况进行适当的处理。在这一部分,我们将讨论可能出现的异常情况,并展示如何使用异常处理机制来处理这些异常。

1. 网络连接问题

        网络连接问题是最常见的异常之一。如果无法连接到目标服务器,Requests库将抛出ConnectionError异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求
    response = requests.get('https://api.example.com/data')
    # 检查响应状态码
    if response.status_code == 200:
        print("请求成功")
    else:
        print("请求失败:", response.status_code)
except requests.exceptions.ConnectionError:
    print("网络连接异常,无法连接到服务器")

        上面的代码尝试发送一个GET请求,如果无法连接到服务器,则会捕获ConnectionError异常,并打印出相应的错误信息。

2. 服务器错误

        有时服务器可能会出现错误,比如500 Internal Server Error。如果服务器返回了一个错误状态码,Requests库将抛出HTTPError异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求
    response = requests.get('https://api.example.com/data')
    # 检查响应状态码
    response.raise_for_status()
    print("请求成功")
except requests.exceptions.HTTPError as err:
    print("服务器错误:", err)

        上面的代码尝试发送一个GET请求,如果服务器返回了一个错误状态码,则会捕获HTTPError异常,并打印出相应的错误信息。

3. 超时

        在发送请求时,可能会出现超时的情况,即服务器在规定的时间内没有响应。如果超时发生,Requests库将抛出Timeout异常。你可以使用try-except语句来捕获并处理这个异常。下面是一个示例:

import requests

try:
    # 发送请求并设置超时时间为1秒
    response = requests.get('https://api.example.com/data', timeout=1)
    print("请求成功")
except requests.exceptions.Timeout:
    print("请求超时")

        上面的代码尝试发送一个GET请求,并设置超时时间为1秒。如果在规定时间内没有收到响应,则会捕获Timeout异常,并打印出相应的错误信息。

九、性能优化

        虽然Requests库已经为我们提供了简单而强大的方式来发送HTTP请求,但在处理大量请求时,仍然有一些性能优化的技巧可以使用。下面是一些关于如何优化使用Requests库性能的建议:

1. 使用连接池

        默认情况下,每次发送请求时都会创建一个新的TCP连接。如果你需要发送大量的请求,可以使用连接池来重用已经建立的连接,以减少连接的建立和关闭开销。你可以使用requests.Session对象来创建一个会话,并设置连接池参数。下面是一个示例:

import requests

# 创建会话对象并设置连接池大小
session = requests.Session()
adapter = requests.adapters.HTTPAdapter(pool_connections=100, pool_maxsize=100)
session.mount('http://', adapter)
session.mount('https://', adapter)

# 使用会话对象发送请求
response = session.get('https://api.example.com/data')

# 关闭会话
session.close()

        上面的代码创建了一个会话对象session,并设置了连接池大小为100。通过使用会话对象发送请求,可以重用已经建立的连接,提高性能。

2. 使用持久连接

        持久连接允许客户端和服务器在多次请求之间保持TCP连接的状态,从而减少了连接的建立和关闭开销。在HTTP/1.1中,持久连接是默认启用的。你可以使用Connection: keep-alive头部来确保持久连接。下面是一个示例:

import requests

# 发送请求并设置持久连接头部
response = requests.get('https://api.example.com/data', headers={'Connection': 'keep-alive'})

# 打印响应内容
print("响应内容:", response.text)

        上面的代码发送了一个GET请求,并设置了持久连接头部。服务器收到请求后,将保持连接的状态,并在后续请求中重用相同的连接,提高性能。

3. 合理使用并发

        在某些场景下,可以通过并发发送多个请求来提高性能。你可以使用多线程、异步请求等方式来实现并发。然而,在使用并发时需要注意合理控制并发量,以避免对服务器造成过大的负载。下面是一个使用concurrent.futures模块实现多线程并发的示例:

import requests
import concurrent.futures

# 定义请求函数
def fetch_data(url):
    response = requests.get(url)
    return response.text

# 定义多个请求URL
urls = ['https://api.example.com/data1', 'https://api.example.com/data2', 'https://api.example.com/data3']

# 使用多线程并发发送请求
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    results = executor.map(fetch_data, urls)

# 打印响应内容
for result in results:
    print("响应内容:", result)

        上面的代码定义了一个fetch_data函数用于发送请求,并使用ThreadPoolExecutor来实现多线程并发发送请求。

十、案例

        Requests库在真实项目中被广泛应用,下面我们通过一些实际的案例分析来展示Requests库在不同场景下的应用。

1. 网络爬虫

        网络爬虫是Requests库应用的一个典型场景。通过发送HTTP请求,爬虫程序可以获取网页内容,并对其进行解析和提取信息。Requests库提供了简洁而强大的API,使得编写爬虫程序变得简单而高效。下面是一个简单的网络爬虫示例,用于获取网页内容:

import requests

# 发送GET请求获取网页内容
response = requests.get('https://www.example.com')

# 打印网页内容
print("网页内容:", response.text)

在实际项目中,网络爬虫可以用于数据采集、搜索引擎索引等场景。

2. API调用

        Requests库也广泛应用于调用各种Web API接口。许多Web服务提供了API接口,通过发送HTTP请求,我们可以与这些服务进行交互,并获取数据或执行操作。下面是一个调用GitHub API获取用户信息的示例:

import requests

# 发送GET请求调用GitHub API
response = requests.get('https://api.github.com/users/octocat')

# 解析JSON响应内容
user_info = response.json()

# 打印用户信息
print("用户名:", user_info['login'])
print("用户ID:", user_info['id'])
print("用户URL:", user_info['html_url'])

在实际项目中,API调用可以用于数据获取、服务集成等场景。

3. Web自动化测试

        Requests库也可以用于编写Web自动化测试脚本。通过发送HTTP请求,我们可以模拟用户与Web应用的交互,并进行自动化测试。下面是一个使用Requests库进行Web自动化测试的示例:

import requests

# 发送POST请求提交表单数据
response = requests.post('https://www.example.com/login', data={'username': 'user', 'password': '123456'})

# 检查登录是否成功
if 'Welcome, user!' in response.text:
    print("登录成功")
else:
    print("登录失败")

在实际项目中,Web自动化测试可以用于测试Web应用的功能和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/696412.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

12-Gateway网关-网关作用介绍

12-Gateway网关-网关作用介绍 1.为什么需要网关: 网关功能: ​ 1.身份认证和权限校验 ​ 2.服务路由、负载均衡 ​ 3.请求限流 2.网关的技术实现: 在SpringCloud中网关的实现包括两种“ ​ gateway ​ zuul Zuul是基于Servlet的实…

node-mysql的批量插入

此前我批量插入都是用类似这样的命令: sqlcmdinsert into table(field1,field2,...) values ? indata[["f1v1","f2v1"],["f1v2","f2v2"],...] mysqlconn.query(sqlcmd,[indata],(err,res)>{...})但是感觉不太舒服&…

VueRouter3学习笔记

文章目录 1,入门案例2,一些细节高亮效果非当前路由会被销毁 3,嵌套路由4, 传递查询参数5,命名路由6,传递路径参数7,路径参数转props8,查询参数转props9,replace模式10&am…

Vue--》从零开始打造交互体验一流的电商平台(二)

今天开始使用 vue3 + ts 搭建一个电商项目平台,因为文章会将项目的每处代码的书写都会讲解到,所以本项目会分成好几篇文章进行讲解,我会在最后一篇文章中会将项目代码开源到我的github上,大家可以自行去进行下载运行,希望本文章对有帮助的朋友们能多多关注本专栏,学习更多…

SAP Build 1-工作流表单开发

1. BTP SAP Build环境配置 1.1 启用试用账号 访问BTP trial,启用试用账号,没有的话注册一个即可 https://account.hanatrial.ondemand.com/trial/#/home/trial 注册完之后就会让选择区域,要选US的区域才有自动化相关的功能 然后就开始生成…

什么是Java?

什么是Java?java是什么?下面我们来总结一下。 java是什么? java是一个静态编程语言,具有强大的多线程特征,目前java不仅采用c语言的优点,还去掉了一些多继承指针,等复杂的概念,我们…

跟着大佬学RE(六)

findKey 嗯,就是一个窗口程序,没有输入,flag 应该就藏在程序里面 第一遍自己直接莽做,在string窗口,找到 flag{} 看到标红直接 nop 然后,然后就不知道怎么搞了 这串字符提示不能随便 nop ,重新…

优设AI导航

1、优设AI导航 优设AI导航

13. UDP协议与RTP协议

UDP协议 UDP协议比较简单: UDP的长度是固定的,用总长度-UDP长度就是数据长度。 UDP是不保证他的有序性和可靠性的。对于音频和视频是这样是比较好的,因为这段丢了,我们可以从下一段在开始解码。 RTP RTP 协议概述 RTP&#x…

【前端】详解JavaScript事件代理(事件委托)

😎 作者介绍:我是程序员洲洲,一个热爱写作的非著名程序员。CSDN全栈优质领域创作者、华为云博客社区云享专家、阿里云博客社区专家博主。 🤓 同时欢迎大家关注其他专栏,我将分享Web前后端开发、人工智能、机器学习、深…

简单了解java中的异常

异常 1、异常的概述 1.1、概述 异常就是程序出现了不正常的情况,程序在执行过程中,数据导致程序不正常,最终导致JVM的非正常停止。语句错误不算在异常体系中。 1.2、异常的存在形式 异常有类型之分,比如我们比较熟悉的数组越…

安装golang

官网:All releases - The Go Programming Language (google.cn) 下载对应的版本安装即可

数据结构初阶 · 链式二叉树的部分问题

目录 前言: 1 链式二叉树的创建 2 前序 中序 后序遍历 3 树的节点个数 4 树的高度 5 树的叶子节点个数 6 树的第K层节点个数 前言: 链式二叉树我们在C语言阶段已经实现了,这里介绍的是涉及到的部分问题,比如求树的高度&am…

liquibase做数据库版本管理

通过这个配置就会自动启动liquibase 比对 https://www.cnblogs.com/ludangxin/p/16676701.html https://zhuyizhuo.github.io/2020/07/04/spring-boot/spring-boot-liquibase-database-version-control/

如何理解与学习数学分析——第二部分——数学分析中的基本概念——第10章——实数

第2 部分:数学分析中的基本概念 (Concepts in Analysis) 10. 实数(The Real Numbers) 本章介绍比率数(rational numbers)和非比数(irrational numbers)及其与十进制展开的关系。讨论了实数的公理,并解释了完备性公理对于区分实数和比率数为何必不可少&…

IDEA启动项目报java.lang.OutOfMemoryError: GC overhead limit exceeded

idea编译项目时报j ava.lang.OutOfMemoryError: GC overhead limit exceeded错误,教你两步搞定! 第一步:打开help -> Edit Custom VM Options ,修改xms和xmx的大小,如下图: 第二步:File -> Settings…

基于JSP的足球赛会管理系统

你好呀,我是计算机学长猫哥!如果有相关需求,文末可以找到我的联系方式。 开发语言:Java 数据库:MySQL 技术:JSP技术 工具:IDEA/Eclipse、Navicat、Maven 系统展示 首页 个人中心 球队介绍…

使用 Sysbench 测试文件的读写速度

要使用 Sysbench 测试文件的读写速度,你可以按照以下步骤进行: 安装 Sysbench: 如果你还没有安装 Sysbench,可以通过以下命令在 Ubuntu 上安装: sudo apt install sysbench创建测试文件: 首先&#xff0c…

Xilinx(AMD) vivado对FPGA网表文件进行功能仿真的方法

1 概述 在FPGA开发中很多商用IP核出于知识产权保护的目的,不提供源代码,而是提供综合后的FPGA网表。由于没有源代码,也无法对网表文件直接进行仿真的操作来验证功能,此时需要独立的仿真模型文件。 本文介绍在Xilinx(AMD) vivado软…

LVGL移植和图片显示

最近闲来无事,偶尔刷到了移植LVGL的教程,今天肝完了机械原理又移植完LVGL库,真是收获满满的一天,先接一杯水去。 回来了,发个朋友圈高级一下,好困。 lvgl v8.3移植及组件使用_lvgl界面编辑器-CSDN博客htt…