with语句
在Python中,with
语句用于确保某段代码执行完毕时,资源(如文件对象、网络连接等)可以被正确地清理。这通常涉及到使用上下文管理协议,该协议要求一个对象实现__enter__()
和__exit__()
两个方法。
with
语句的基本语法如下:
with context_expression [as variable]: | |
with-block |
context_expression
:返回一个上下文管理对象。as variable
(可选):将上下文管理对象的返回值(通常是__enter__()
方法的返回值)赋值给variable
。with-block
:要执行的代码块。
当with
语句开始时,__enter__()
方法会被调用,并且如果提供了as variable
,__enter__()
的返回值会被赋值给variable
。然后执行with-block
中的代码。当with-block
执行完毕时,__exit__()
方法会被调用,无论with-block
中的代码是正常执行完毕还是抛出了异常。
一个常见的例子是使用with
语句来打开文件:
with open('example.txt', 'r') as file: | |
data = file.read() | |
# 在这里可以对数据进行操作 | |
# 文件在这里已经被正确关闭,无需显式调用file.close() |
在这个例子中,open('example.txt', 'r')
返回一个文件对象,该对象实现了上下文管理协议。当with
语句开始时,文件被打开;当with
语句结束时,文件被自动关闭,即使with-block
中的代码抛出了异常也是如此。
通过使用with
语句,可以确保资源在使用完毕后得到正确的清理,从而避免资源泄漏和其他潜在问题。
requests库
requests
是一个用于发送 HTTP 请求的 Python 库。它使得发送 HTTP 请求变得简单且人性化。以下是一些基本的 requests
函数及其用途:
requests.get(url, **kwargs)
发送一个 GET 请求到指定的 URL。
import requests | |
response = requests.get('https://www.example.com') | |
print(response.text) |
requests.post(url, data=None, json=None, **kwargs)
发送一个 POST 请求到指定的 URL。data
参数用于发送表单数据,而 json
参数用于发送 JSON 格式的数据。
import requests | |
payload = {'key1': 'value1', 'key2': 'value2'} | |
response = requests.post('https://www.example.com/post', data=payload) | |
print(response.text) |
requests.put(url, data=None, **kwargs)
发送一个 PUT 请求到指定的 URL。这通常用于更新资源。
4. requests.delete(url, **kwargs)
发送一个 DELETE 请求到指定的 URL。这通常用于删除资源。
5. requests.head(url, **kwargs)
发送一个 HEAD 请求到指定的 URL。HEAD 请求与 GET 请求类似,但只返回响应的头部信息,不返回实际的内容。
6. requests.patch(url, data=None, **kwargs)
发送一个 PATCH 请求到指定的 URL。PATCH 请求通常用于部分更新资源。
7. requests.session()
创建一个 Session
对象,用于跨多个请求保持某些参数,如 cookies 和 headers。这对于需要登录或维护会话状态的网站非常有用。
import requests | |
with requests.Session() as s: | |
s.get('https://www.example.com/login', auth=('user', 'pass')) | |
r = s.get('https://www.example.com/protected') | |
print(r.text) |
每个 requests
函数都返回一个 Response
对象,该对象包含有关响应的各种信息,如状态码、头部、内容等。你可以通过 Response
对象的各种属性(如 status_code
、headers
、text
、json()
等)来访问这些信息。
为了使用 requests
库,你需要先安装它。你可以使用 pip(Python 的包管理工具)来安装:
pip install requests |
requests 库因其简洁、易用和强大的功能而受到广大 Python 开发者的喜爱,是发送 HTTP 请求的流行选择之一。
os内置模块
在Python中,os
是一个内置的模块,它提供了与操作系统交互的多种功能。这个模块提供了许多函数,用于处理文件和目录路径、执行系统命令、读取环境变量、访问操作系统相关的功能等。
os
模块中的一些常用功能包括:
-
文件和目录操作:
os.path
提供了许多用于文件和目录操作的函数,如os.path.exists()
(检查文件或目录是否存在)、os.path.isfile()
(检查是否为文件)、os.path.isdir()
(检查是否为目录)、os.path.join()
(连接路径)、os.makedirs()
(创建目录)等。 -
进程管理:
os
模块提供了os.system()
(执行系统命令并返回退出状态)和os.exec*
系列函数(替换当前进程为另一个进程)来执行和管理进程。 -
环境变量:
os.environ
是一个映射,表示环境变量。可以使用它来读取和设置环境变量。 -
文件和目录的访问权限:
os
模块提供了os.chmod()
(改变文件权限)和os.access()
(检查文件的访问权限)等函数。 -
操作系统相关的功能:
os
模块还包含了许多与特定操作系统相关的功能,如获取当前工作目录(os.getcwd()
)、改变当前工作目录(os.chdir()
)、获取登录用户的名字(os.getlogin()
)等。
使用 os
模块可以简化Python程序与操作系统之间的交互,使程序能够更容易地处理文件和目录、执行系统命令以及访问操作系统的各种功能。需要注意的是,由于 os
模块中的某些函数直接调用操作系统的功能,因此在不同的操作系统上可能会有不同的行为。在编写跨平台的Python代码时,应特别注意这一点。
set无序且不重复的元素集合和set函数
在Python中,set
是一个内置的数据类型,用于存储无序且不重复的元素集合。set
类型是一个可变的数据结构,因此你可以添加或删除元素。由于集合是无序的,所以你不能通过索引来访问集合中的元素。
以下是一些基本的set
操作示例:
创建集合
你可以通过将一个可迭代对象(如列表、元组或字符串)传递给set()
函数来创建一个集合:
my_set = set([1, 2, 3, 2, 3, 4]) | |
print(my_set) # 输出: {1, 2, 3, 4} |
由于集合中的元素是唯一的,所以重复的元素会被自动去除。
添加元素
使用add()
方法可以向集合中添加单个元素:
my_set.add(5) | |
print(my_set) # 输出: {1, 2, 3, 4, 5} |
使用update()
方法可以向集合中添加多个元素(从一个可迭代对象中添加):
my_set.update([6, 7, 8]) | |
print(my_set) # 输出: {1, 2, 3, 4, 5, 6, 7, 8} |
删除元素
使用remove()
方法可以从集合中删除一个指定的元素:
my_set.remove(5) | |
print(my_set) # 输出: {1, 2, 3, 4, 6, 7, 8} |
如果尝试删除一个不存在的元素,remove()
方法会抛出KeyError
异常。为了避免这种情况,你可以使用discard()
方法,它在元素不存在时不会抛出异常:
my_set.discard(9) # 不会抛出异常,因为9不在集合中 |
另外,你可以使用pop()
方法删除并返回集合中的任意一个元素(具体返回哪个元素是不确定的,因为集合是无序的):
removed_element = my_set.pop() | |
print(removed_element) # 输出集合中的一个元素,例如: 1 | |
print(my_set) # 输出: {2, 3, 4, 6, 7, 8}(假设移除的是1) |
检查元素
你可以使用in
关键字来检查一个元素是否存在于集合中:
if 3 in my_set: | |
print("3 is in the set") # 输出: 3 is in the set |
集合运算
集合支持多种数学集合运算,如并集、交集、差集和对称差集:
set1 = {1, 2, 3, 4} | |
set2 = {3, 4, 5, 6} | |
# 并集 | |
union_set = set1 | set2 | |
print(union_set) # 输出: {1, 2, 3, 4, 5, 6} | |
# 交集 | |
intersection_set = set1 & set2 | |
print(intersection_set) # 输出: {3, 4} | |
# 差集(set1中有但set2中没有的元素) | |
difference_set = set1 - set2 | |
print(difference_set) # 输出: {1, 2} | |
# 对称差集(在set1或set2中,但不同时在两者中的元素) | |
symmetric_difference_set = set1 ^ set2 | |
print(symmetric_difference_set) # 输出: {1, 2, 5, 6} |
这些只是set
类型提供的一些基本操作。集合在Python中是非常有用的数据结构,特别是在需要快速检查成员关系、执行集合运算或去除重复元素的场景中。
list有序的元素集合,list函数
在Python中,list
是一个内置的数据类型,用于表示一个有序的元素集合。这些元素可以是任何数据类型,并且元素之间通过逗号分隔,整个列表由方括号包围。
list
函数本身通常用于将其他可迭代对象(如元组、字符串或集合)转换为一个列表。不过,在大多数情况下,你不需要显式地调用list
函数来创建列表,因为你可以直接使用方括号语法。
以下是一些使用list
函数的例子:
从其他可迭代对象创建列表
python复制代码
# 从元组创建列表 | |
my_tuple = (1, 2, 3) | |
my_list = list(my_tuple) | |
print(my_list) # 输出: [1, 2, 3] | |
# 从字符串创建列表(将字符串拆分为字符列表) | |
my_string = "hello" | |
my_list_from_string = list(my_string) | |
print(my_list_from_string) # 输出: ['h', 'e', 'l', 'l', 'o'] | |
# 从集合创建列表(注意集合是无序的,所以列表中的元素顺序可能与集合中的不同) | |
my_set = {4, 2, 3} | |
my_list_from_set = list(my_set) | |
print(my_list_from_set) # 输出可能是: [4, 2, 3],也可能是其他顺序,因为集合是无序的 |
使用方括号语法创建列表
通常,你不需要使用list
函数来创建列表,而是可以直接使用方括号:
python复制代码
# 使用方括号直接创建列表 | |
my_list = [1, 2, 3, 4, 5] | |
print(my_list) # 输出: [1, 2, 3, 4, 5] | |
# 创建一个包含不同数据类型的列表 | |
mixed_list = [1, "two", 3.0, True, [4, 5]] | |
print(mixed_list) # 输出: [1, 'two', 3.0, True, [4, 5]] |
列表操作
列表支持许多操作,包括添加、删除、修改元素,以及使用切片来获取子列表等。
python复制代码
# 添加元素到列表末尾 | |
my_list.append(6) | |
print(my_list) # 输出: [1, 2, 3, 4, 5, 6] | |
# 在列表指定位置插入元素 | |
my_list.insert(2, "inserted") | |
print(my_list) # 输出: [1, 2, 'inserted', 3, 4, 5, 6] | |
# 删除列表中的元素 | |
my_list.remove("inserted") | |
print(my_list) # 输出: [1, 2, 3, 4, 5, 6] | |
# 使用切片获取子列表 | |
sublist = my_list[1:4] # 获取索引1到3(不包括4)的元素 | |
print(sublist) # 输出: [2, 3, 4] |
了解并掌握列表的基本操作对于在Python中进行编程是非常重要的,因为列表是Python中非常常用的一种数据结构。
enumerate()函数
在Python中,enumerate()
是一个内置函数,用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在 for 循环当中。这样,你不仅可以获取到元素的值,还可以获取到元素的索引(或位置)。
enumerate()
函数的基本语法如下:
enumerate(iterable, start=0) |
iterable
:一个可遍历的对象。start
(可选):计数的起始值,默认为0。
enumerate()
返回一个枚举对象,这个对象是一个迭代器,可以生成由元素索引和元素值组成的元组。
下面是一个使用enumerate()
函数的例子:
# 创建一个列表 | |
my_list = ['apple', 'banana', 'cherry'] | |
# 使用enumerate遍历列表 | |
for index, value in enumerate(my_list): | |
print(f"Index: {index}, Value: {value}") |
输出将会是:
Index: 0, Value: apple | |
Index: 1, Value: banana | |
Index: 2, Value: cherry |
在这个例子中,enumerate(my_list)
生成了一个迭代器,每次迭代都返回一个元组,其中第一个元素是元素的索引(从0开始),第二个元素是元素的值。然后,我们通过解包这个元组到index
和value
变量中,从而能够在循环体内部同时访问到索引和值。
你也可以通过传递start
参数给enumerate()
函数来指定起始索引:
my_list = ['apple', 'banana', 'cherry'] | |
# 从索引1开始枚举 | |
for index, value in enumerate(my_list, start=1): | |
print(f"Index: {index}, Value: {value}") |
输出将会是:
Index: 1, Value: apple | |
Index: 2, Value: banana | |
Index: 3, Value: cherry |
在这个例子中,我们设置start=1
,所以枚举从1开始而不是默认的0。
numpy.array
numpy.array
是 NumPy(Numerical Python 的简称)库中的一个核心函数,用于创建一个多维数组对象。NumPy 是 Python 中用于数值计算的一个扩展库,它提供了大量的数学函数来对数组和矩阵进行运算。
使用 numpy.array
,你可以将 Python 中的列表、元组或其他序列类型的数据转换为 NumPy 数组,从而可以利用 NumPy 提供的各种高效和方便的数值计算功能。
下面是 numpy.array
的一些基本用法:
导入 NumPy 库
首先,你需要导入 NumPy 库:
import numpy as np |
创建一维数组
# 从 Python 列表创建一维数组 | |
list_data = [1, 2, 3, 4, 5] | |
array_1d = np.array(list_data) | |
print(array_1d) |
输出:
[1 2 3 4 5] |
创建二维数组(矩阵)
# 从 Python 列表的列表创建二维数组(矩阵) | |
list_of_lists = [[1, 2, 3], [4, 5, 6], [7, 8, 9]] | |
array_2d = np.array(list_of_lists) | |
print(array_2d) |
输出:
[[1 2 3] | |
[4 5 6] | |
[7 8 9]] |
指定数组的数据类型
你可以在创建数组时指定数据类型:
# 创建一个浮点型的数组 | |
float_array = np.array([1, 2, 3], dtype=float) | |
print(float_array) | |
print(float_array.dtype) # 输出数组的数据类型 |
输出:
[1. 2. 3.] | |
float64 |
数组的形状和维度
你可以使用 shape
属性查看数组的形状,使用 ndim
属性查看数组的维度数:
print(array_2d.shape) # 输出:(3, 3) | |
print(array_2d.ndim) # 输出:2,表示这是一个二维数组 |
NumPy 数组提供了很多高级的功能,比如切片、索引、广播、数学运算等,使得数值计算变得更加简单和高效。在数据分析和科学计算中,NumPy 数组是极其重要的数据结构。
NumPy库中的array
和Python的内置列表(list)
NumPy库中的array
和Python的内置列表(list)之间存在多个关键的区别。这些区别主要体现在数据类型、内存使用、运算能力以及用途等方面。
- 数据类型:
list
中的数据类型可以不同,即列表中的元素可以是任何Python对象,包括整数、浮点数、字符串、其他列表等。array
则要求所有元素的数据类型必须相同。这确保了数据的一致性和更高的运算效率。
- 内存使用:
list
在内存中存储的是数据的引用(指针),而不是数据本身。这意味着,如果你有一个包含大量对象的列表,每个对象都会单独占用内存空间,而列表本身则只是存储了指向这些对象的指针。array
在内存中存储的是实际的数据值,它通常使用连续的内存块来存储数据,这有助于减少内存碎片并提高数据访问速度。
- 运算能力:
list
不支持数学四则运算或其他复杂的数学运算。虽然可以通过循环和条件语句对列表中的元素进行运算,但这种方式通常较为低效。array
支持大量的数学运算,包括元素级的运算(如加法、乘法等)、矩阵运算(如点积、转置等)以及更复杂的线性代数运算。这使得array
成为进行科学计算、数据分析以及机器学习等任务时的理想选择。
- 功能与用途:
list
是Python中的一种通用数据结构,用于存储和处理一组有序的项目。它可以轻松地添加、删除和修改元素,并且支持各种列表操作(如排序、切片等)。array
则主要用于存储和处理数值数据,尤其是那些需要进行数学运算或科学计算的数据。由于其高效的内存使用和强大的运算能力,array
在处理大量数据时通常比list
更为高效。
总结来说,list
和array
各有其优势和应用场景。在选择使用哪种数据结构时,应根据具体的需求和任务来决定。如果需要处理的是一组有序的项目,并且需要进行频繁的修改和操作,那么list
可能是一个更好的选择。而如果需要处理的是大量的数值数据,并且需要进行复杂的数学运算或科学计算,那么array
则可能更为合适。