【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用

简介: 【Python 基础教程 26】Python3标准库全面入门教程:一步步带你深入理解与应用


1. 系统交互模块

1.1 os模块

os模块(Operating System Module)在Python中被用来与底层操作系统进行交互。这个模块包含了各种用于处理文件和目录,以及Python程序能够与操作系统进行交互的各种功能。

1.1.1 文件和目录操作

Python的os模块提供了一系列用于处理文件和目录的功能。在C/C++中,我们通常需要调用低级的API(比如POSIX API),而Python的os模块简化了这个过程。

以下是一个示例,展示了如何使用os模块进行文件和目录操作:

import os
# 获取当前工作目录
current_dir = os.getcwd()
print(f"当前工作目录(Current Working Directory): {current_dir}")
# 列出当前目录下的文件和子目录
print("当前目录下的文件和子目录:")
for file in os.listdir(current_dir):
    print(file)
# 创建新目录
os.mkdir('new_dir')
print("新目录已创建.")
# 删除我们刚刚创建的目录
os.rmdir('new_dir')
print("新目录已删除.")

在上述代码中,我们首先使用os.getcwd()函数(在C语言中,对应的是getcwd()函数)来获取当前的工作目录。然后,我们使用os.listdir()函数(在C语言中,对应的是opendir()和readdir()函数)来列出当前目录下的所有文件和子目录。我们接着用os.mkdir()函数(在C语言中,对应的是mkdir()函数)来创建一个新的目录,然后使用os.rmdir()函数(在C语言中,对应的是rmdir()函数)来删除这个目录。

1.1.2 访问环境变量

环境变量(Environment Variables)是操作系统用于存储各种全局信息的一个重要工具。Python的os模块提供了os.environ对象来访问这些环境变量。

以下是一个示例,展示了如何使用os模块访问环境变量:

import os
# 获取所有环境变量
all_env_vars = os.environ
print("所有的环境变量(All Environment Variables):")
for key, value in all_env_vars.items():
    print(f"{key}: {value}")
# 获取特定环境变量
path = os.getenv('PATH')
print(f"PATH环境变量(PATH Environment Variable): {path}")

在上述代码中,我们首先使用os.environ对象(在C语言中,对应的是通过extern声明的environ全局变量)来获取所有的环境变量。然后,我们使用os.getenv()

函数(在C语言中,对应的是getenv()函数)来获取特定的环境变量。

注意,在访问环境变量时,需要确保程序有合适的权限,否则可能会出现错误或者无法访问某些环境变量。

下一章节我们会介绍sys模块,它是Python中的一个内置模块,用于提供对Python解释器相关的操作和功能。

1.2 sys模块

sys模块(System-specific parameters and functions)在Python中主要被用来获取Python解释器和系统相关的信息。同样的,在C/C++中我们通常需要使用更底层的方法,比如直接访问系统调用或者特定的库函数。

1.2.1 解释器相关功能

Python的sys模块提供了许多和解释器相关的功能。比如,我们可以获取Python解释器的版本信息,或者获取和设置Python的模块搜索路径。

下面的代码示例展示了如何使用sys模块获取Python解释器的版本信息和模块搜索路径:

import sys
# 获取Python解释器的版本信息
print("Python版本信息(Python Version Info):")
print(sys.version_info)
# 获取Python模块搜索路径
print("\nPython模块搜索路径(Python Module Search Path):")
for path in sys.path:
    print(path)

在上述代码中,我们使用sys.version_info来获取Python解释器的版本信息(在C/C++中,可以通过预处理器定义的__VERSION__宏来获取编译器的版本信息),然后使用sys.path来获取Python的模块搜索路径(在C/C++中,库文件的搜索路径通常是在编译时由编译器设置的,而在运行时可以通过动态链接器的环境变量来修改)。

1.2.2 与stdin、stdout和stderr相关的信息

Python的sys模块还提供了访问标准输入、输出和错误流的方式,这些在C/C++中对应的是stdin、stdout和stderr。

下面的代码示例展示了如何使用sys模块访问和操作这些流:

import sys
# 向标准输出写入信息
sys.stdout.write("这是来自标准输出的信息(This is a message from standard output)\n")
# 向标准错误写入信息
sys.stderr.write("这是来自标准错误的信息(This is a message from standard error)\n")

在上述代码中,我们使用sys.stdout和sys.stderr分别向标准输出和标准错误写入信息(在C/C++中,我们可以使用printf、puts等函数向stdout写入信息,使用fprintf等函数向stderr写入信息)。

请注意,尽管Python的print函数默认也会向标准输出写入信息,但是使用sys.stdout.write可以提供更多的控制,比如不自动添加换行等。

在下一章节,我们会开始探讨时间处理模块,首先是time模块。

2. 时间处理模块

2.1 time模块

Python3 的 time 模块(time module)提供了各种操作时间的函数。此模块主要用于处理与时间有关的函数,比如获取当前时间、格式化日期和时间,以及实现计时等功能。在 C/C++ 中,我们也有类似的函数,但 Python 的 time 模块使用起来更为直观和简洁。

获取当前时间

在 Python 中,我们使用 time 模块的 time 函数(time function)来获取当前时间。这个函数返回自纪元(Epoch,1970年1月1日 00:00:00,UTC)以来的秒数,返回值是一个浮点数。

import time
current_time = time.time()
print(f'Current time: {current_time}')

在 C++ 中,我们通常使用 头文件中的 time 函数来获取当前时间,该函数返回自纪元以来的秒数,但返回值是一个整型数。

#include <ctime>
std::time_t current_time = std::time(nullptr);
std::cout << "Current time: " << current_time << std::endl;

格式化日期和时间

在 Python 中,我们可以使用 time 模块的 ctime 函数(ctime function)或者 strftime 函数(strftime function)来格式化日期和时间。

ctime 函数会将一个时间戳(默认为当前时间)转换为一个字符串,显示的格式为:‘Mon Sep 30 07:06:05 2019’。

import time
t = time.time()
formatted_time = time.ctime(t)
print(f'Formatted time: {formatted_time}')

strftime 函数可以让我们自定义日期和时间的格式。它接受两个参数,第一个参数是格式字符串,第二个参数是 struct_time 对象(默认为当前时间)。

import time
t = time.localtime()
formatted_time = time.strftime('%Y-%m-%d %H:%M:%S', t)
print(f'Formatted time: {formatted_time}')

在 C++ 中,我们通常使用 头文件中的 asctime 函数和 strftime 函数来格式化日期和时间。

#include <ctime>
std::time_t t = std::time(nullptr);
std::tm* local_time = std::localtime(&t);
// asctime function
char* formatted_time = std::asctime(local_time);
std::cout << "Formatted time (asctime): " << formatted_time;
// strftime function
char buffer[100];
std::strftime(buffer, 100, "%Y-%m-%d %H:%M:%S", local_time);
std::cout << "Formatted time (strftime): " << buffer << std::endl;

以上就是 Python time 模块中两个常用功能的介绍和与 C++ 的比较,接下来我们会介绍 time 模块中的其他功能。

2.2 datetime模块

Python的datetime模块(datetime module)提供了处理更高级日期和时间功能的类和函数。这包括处理时区(timezones),计算时间差(time deltas),以及计算日期差(date differences)等。相比之下,C++提供这些功能的方式通常更加复杂,而Python的datetime模块则更简单,更直接。

处理时区

在Python中,datetime模块的datetime类具有一个可选的tzinfo参数,它表示时区信息。你可以使用pytz库,它提供了大量的时区信息。

from datetime import datetime
import pytz
# 创建一个代表当前时间并且时区为UTC的datetime
now_utc = datetime.now(pytz.timezone('UTC'))
print(f'UTC time: {now_utc}')
# 创建一个代表当前时间并且时区为New York的datetime
now_new_york = datetime.now(pytz.timezone('America/New_York'))
print(f'New York time: {now_new_york}')

在C++中,处理时区通常更加复杂,需要使用第三方库如ICU或者Boost.DateTime。

计算时间差

Python的datetime模块提供了timedelta类,用于表示时间间隔或者时间差。

from datetime import datetime, timedelta
# 创建两个datetime对象
dt1 = datetime(2023, 6, 21, 12, 0, 0)
dt2 = datetime(2023, 6, 22, 13, 30, 0)
# 计算时间差
delta = dt2 - dt1
print(f'Time difference: {delta}')  # 输出:Time difference: 1 day, 1:30:00

在C++中,C++11标准引入了std::chrono库来处理日期和时间,包括时间差的计算。但使用起来相对Python会复杂一些。

计算日期差

在Python中,你可以使用date类来表示日期,并且可以直接通过减法计算日期差。

from datetime import date
# 创建两个date对象
d1 = date(2023, 6, 21)
d2 = date(2023, 6, 30)
# 计算日期差
delta = d2 - d1
print(f'Date difference: {delta.days}')  # 输出:Date difference: 9

在C++中,计算日期差同样需要使用std::chrono库,但处理方式较为复杂,通常需要将日期转换为时间点后再进行减法操作。

以上就是Python的datetime模块和C++处理日期和时间功能的一些对比。Python的datetime模块提供了直观且强大的接口来处理日期和时间相关的问题。

3. 数据处理模块

3.1 Random模块

Python的Random模块(random module)提供了多种方法来生成随机数,这在许多编程情境中都非常有用。相比于C/C++,Python的random模块为我们提供了更多更方便的随机数生成方法。

在我们开始之前,让我们先导入这个模块:

import random

1.生成随机整数

在Python中,我们可以使用random.randint(a, b)生成一个在ab之间(包含ab)的随机整数。

random_num = random.randint(1, 10)
print(random_num)

在C++中,我们需要包含头文件#include 以及#include ,并使用srand(time(NULL))设置种子,然后使用rand()%10+1生成一个1-10之间的随机数。

2.生成随机浮点数

Python提供了random.random()方法生成0-1之间的随机浮点数,以及random.uniform(a, b)生成在ab之间的随机浮点数。

random_float = random.random()
print(random_float)
random_float_in_range = random.uniform(1, 10)
print(random_float_in_range)

在C++中,生成随机浮点数可以使用double(rand())/double(RAND_MAX)来生成0-1之间的浮点数。

3.随机选择

Python的random.choice(sequence)方法可以从序列中随机选择一个元素。这在C++中没有直接对应的函数,但可以通过sequence[rand()%sequence.size()]实现。

random_choice = random.choice(['apple', 'banana', 'cherry'])
print(random_choice)

以上就是Python和C++在生成随机数方面的一些比较。简而言之,Python的random模块提供了很多用于生成随机数的便捷方法,使得在Python中处理随机数更加方便。

Note:在生成随机数时,Python的random模块提供的方法比C++更为直观和方便。此外,Python还提供了更多的随机相关功能,例如随机排列序列、生成随机样本等,这些都是C++标准库没有提供的。

3.2 Math模块

Python的Math模块(math module)包含了许多常用的数学函数。与C/C++的数学库相比,Python的math模块提供了更为全面且易用的数学函数。同样的,我们开始前先进行导入:

import math

1. 幂和对数函数

Python的math模块提供了math.pow(a, b)用于计算a的b次幂,和math.log(x, [base])用于计算以base为底的x的对数。如果不指定base,则默认为自然对数。

print(math.pow(2, 3)) # 2的3次方
print(math.log(8, 2)) # 以2为底的8的对数

在C++中,可以通过pow(a, b)log(x)/log(base)来进行相同的操作。

2. 三角函数

Math模块提供了math.sin(x), math.cos(x)math.tan(x)等常用三角函数,输入的角度是弧度制。

print(math.sin(math.pi/2)) # sin(pi/2)

在C++中,也可以通过sin(x), cos(x)tan(x)来进行计算,同样输入的是弧度值。

3. 常数

Math模块中还包含了数学中的一些常数,如圆周率math.pi和自然对数的底math.e

print(math.pi) # 圆周率
print(math.e)  # 自然对数的底

在C++中,需要包含头文件#include 来使用M_PIM_E

总的来说,Python的math模块和C++的cmath库在功能上相差不多,但是Python提供的函数在使用上更直观,更符合数学的直观理解,有助于简化编程工作。

3.3 Json模块

Python的JSON模块(json module)主要用于处理JSON数据格式。相比于C/C++,Python的json模块提供了更为直观和简单的操作方式。

在开始之前,我们先导入这个模块:

import json

1.将Python对象转化为JSON对象

Python的json.dumps()方法可以将Python数据类型转换为JSON格式的字符串。

data = {
    'name': 'John',
    'age': 30,
    'city': 'New York'
}
json_data = json.dumps(data)
print(json_data)

在C++中,我们通常需要使用第三方库如RapidJSON来处理JSON数据,而Python则提供了内建的支持。

2.将JSON对象转化为Python对象

Python的json.loads()方法可以将JSON格式的字符串转换为Python数据类型。

json_data = '{"name": "John", "age": 30, "city": "New York"}'
data = json.loads(json_data)
print(data)

与Python相比,C++处理JSON数据通常需要更多的代码和额外的库支持。

3.读写JSON文件

Python还提供了json.dump()json.load()方法,用于将Python对象写入JSON文件,以及从JSON文件读取数据。

# 写入JSON文件
with open('data.json', 'w') as f:
    json.dump(data, f)
# 读取JSON文件
with open('data.json', 'r') as f:
    data = json.load(f)
    print(data)

在C++中,读写JSON文件通常需要用到文件流操作,并使用第三方库来进行JSON的编解码。

总的来说,Python的json模块提供了一种简单和直观的方式来处理JSON数据,对比于C++,它无需第三方库的支持,对开发者友好很多。

4. 文本和网络处理模块

4.1 re模块:使用正则表达式处理文本

Python3中的re模块(Regular Expression, 正则表达式)提供了强大的文本处理工具,用于搜索、替换、分割等各种文本操作。相比于C/C++的正则库如re模块的使用更加简洁且易于理解。

以下是一个带有注释的使用re模块进行文本处理的示例:

import re
# 定义一个正则表达式,用来找到所有的单词
pattern = re.compile(r'\b\w+\b')  # '\b\w+\b' (单词边界 + 一个或多个字符 + 单词边界)
# 在文本中找到所有符合模式的单词
text = "Hello, world! This is a test. 123, 456."
matches = pattern.findall(text)  # findall()(寻找全部)
# 输出结果
print(matches)  # 输出:['Hello', 'world', 'This', 'is', 'a', 'test', '123', '456']

在上述示例中,我们首先定义了一个正则表达式,然后使用findall()函数在文本中找到所有符合该模式的单词。

在美式英语中,我们常常会说"We use the findall() function to find all matches."(我们用findall()函数找到所有匹配项)。

下表对比了Python3中的re模块与C/C++中库中的部分方法:

功能 Python3 C/C++
正则表达式对象的创建 re.compile(pattern) std::regex(pattern)
查找所有匹配 pattern.findall(text) std::sregex_iterator
匹配的替换 pattern.sub(repl, text) std::regex_replace(text, re, repl)

请注意,Python3和C/C++在处理正则表达式时的主要区别是:Python更倾向于使用re模块的函数,而C/C++更多地是利用其库中的类与对象。

记住,正则表达式是一种强大的工具,但也有其复杂性。适当的时候,也可以使用Python的内建字符串方法,例如split(),replace(),find()等,这些方法在处理简单文本任务时可能更简单更直观。

参考资料

  • Python官方文档:re — Regular expression operations
  • C++ Reference: (since C++11)

4.2 urllib模块:访问网页和处理URL

Python3的urllib模块包含了一系列用于操作URL和进行网络请求的函数。相较于C/C++的网络编程库如libcurlWinINet等,urllib的用法更加简单直接,使得Python在处理HTTP请求上更具有优势。

以下是一个简单的示例,它展示了如何使用urllib模块从网站上下载页面内容:

from urllib.request import urlopen
# 打开一个网页
response = urlopen("http://www.example.com")  # urlopen("URL") (打开"URL")
# 读取并打印网页内容
print(response.read())  # .read() (读取)

在上述示例中,我们使用urlopen()函数打开一个URL,并使用.read()方法读取其内容。请注意,urlopen()返回的是一个HTTPResponse对象,我们可以通过调用其.read()方法来获取网页内容。

在美式英语中,我们常说"We use the urlopen() function to open a URL."(我们使用urlopen()函数来打开一个URL。)

下表对比了Python3中的urllib模块与C/C++中的部分网络编程库方法:

功能 Python3 C/C++
打开URL urllib.request.urlopen(url) curl_easy_setopt(curl, CURLOPT_URL, url)
读取数据 response.read() curl_easy_perform(curl)
发送POST请求 urllib.request.urlopen(request) curl_easy_setopt(curl, CURLOPT_POSTFIELDS, postData)

需要注意的是,Python的urllib模块封装了底层的socket编程细节,使得网络编程更加简单直接。而C/C++的网络库,如libcurl,需要更多的配置步骤和明确的资源管理。

参考资料

  • Python官方文档:urllib — URL handling modules
  • libcurl - The multiprotocol file transfer library

结语

在我们的编程学习之旅中,理解是我们迈向更高层次的重要一步。然而,掌握新技能、新理念,始终需要时间和坚持。从心理学的角度看,学习往往伴随着不断的试错和调整,这就像是我们的大脑在逐渐优化其解决问题的“算法”。

这就是为什么当我们遇到错误,我们应该将其视为学习和进步的机会,而不仅仅是困扰。通过理解和解决这些问题,我们不仅可以修复当前的代码,更可以提升我们的编程能力,防止在未来的项目中犯相同的错误。

我鼓励大家积极参与进来,不断提升自己的编程技术。无论你是初学者还是有经验的开发者,我希望我的博客能对你的学习之路有所帮助。如果你觉得这篇文章有用,不妨点击收藏,或者留下你的评论分享你的见解和经验,也欢迎你对我博客的内容提出建议和问题。每一次的点赞、评论、分享和关注都是对我的最大支持,也是对我持续分享和创作的动力。

目录
相关文章
|
1天前
|
Python
两个list集合合并成一个python教程 - 蓝易云
在这两种方法中,加号会创建一个新的列表,而extend方法则会在原地修改列表。
5 0
|
2天前
|
网络协议 数据处理 调度
深入探索Python异步编程:asyncio库的应用与实践
在现代软件开发中,异步编程已成为处理并发和I/O密集型任务的重要策略。本文将带您深入探索Python的asyncio库,解析其背后的设计原理,并通过实例展示如何在实际项目中应用asyncio实现高效的异步编程。我们不仅会探讨asyncio的基本用法,还会分析其性能优势,并探讨其与其他并发模型的比较。此外,文章还将涵盖asyncio在Web开发、网络编程和数据处理等场景中的应用案例,帮助您更好地理解并掌握这一强大的异步编程工具。
|
2天前
|
存储 Java Shell
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
【Python学习教程】Python函数和lambda表达式_6(1),2024蚂蚁金服面试题及答案
|
2天前
|
Python
【Python3 查询手册学习】,完整版PDF开放下载_python速查手册·模块卷(全彩版) pdf(1)
【Python3 查询手册学习】,完整版PDF开放下载_python速查手册·模块卷(全彩版) pdf(1)
|
3天前
|
程序员 Python
tesseract库的安装与使用及在python中使用,Python程序员秋招三面蚂蚁金服
tesseract库的安装与使用及在python中使用,Python程序员秋招三面蚂蚁金服
|
3天前
|
Python
Python基础教程: math库常用函数(1),Python这些高端技术只有你还不知道
Python基础教程: math库常用函数(1),Python这些高端技术只有你还不知道
|
2天前
|
Python
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏
10个python入门小游戏,零基础打通关,就能掌握编程基础_python编写的入门简单小游戏
|
4天前
|
网络协议 Unix Python
Python编程-----网络通信
Python编程-----网络通信
8 1
|
5天前
|
JSON 数据格式 开发者
pip和requests在Python编程中各自扮演着不同的角色
【5月更文挑战第9天】`pip`是Python的包管理器,用于安装、升级和管理PyPI上的包;`requests`是一个HTTP库,简化了HTTP通信,支持各种HTTP请求类型及数据交互。两者在Python环境中分别负责包管理和网络请求。
33 5
|
5天前
|
存储 Python 容器
Python高级编程
Python集合包括可变的set和不可变的frozenset,用于存储无序、不重复的哈希元素。创建集合可使用{}或set(),如`my_set = {1, 2, 3, 4, 5}`。通过add()添加元素,remove()或discard()删除元素,如`my_set.remove(3)`。
16 0