1. 容器
Python中的容器指的是可以容纳任意类型数据对象的对象,例如列表、元组、集合、字典等。容器在Python编程中起到了很重要的作用,可以将不同类型数据进行封装,方便数据的处理。下面分别介绍四种常见的容器类型。
1.1 列表
列表是Python中最常用的可变序列容器,可以存储任意数量、任意类型的数据。创建列表的方式非常简单,可以使用方括号将数据包围起来,每个数据之间用逗号隔开,例如:
my_list = [1, 2, 'hello', [3, 4]]
print(my_list) # [1, 2, 'hello', [3, 4]]
另外,也可以通过列表推导式来创建列表,例如:
my_list = [x ** 2 for x in range(5)]
print(my_list) # [0, 1, 4, 9, 16]
列表有很多常用的操作方法,例如切片、追加、扩展等,详见官方文档。
1.2 元组
元组是Python中的不可变序列容器,与列表类似,可以存储任意类型的数据,但是元素的值不可修改。创建元组的方式为使用圆括号将数据包围起来,每个数据之间用逗号隔开,例如:
my_tuple = (1, 2, 'hello', [3, 4])
print(my_tuple) # (1, 2, 'hello', [3, 4])
与列表类似,元组也可以通过推导式来创建,例如:
my_tuple = tuple(x ** 2 for x in range(5))
print(my_tuple) # (0, 1, 4, 9, 16)
元组的常用方法与列表相似,但是不能对元素进行修改操作。
1.3 集合
集合是Python中的一种无序且不重复的容器,可以进行交集、并集、差集等操作。创建集合的方式为使用花括号将数据包围起来,每个数据之间用逗号隔开,例如:
my_set = {1, 2, 'hello', 2}
print(my_set) # {1, 2, 'hello'}
与列表、元组不同,集合没有创建集合推导式的语法,但是可以使用`set()`函数将列表或元组转化为集合。
集合有很多常用的操作方法,例如交集、并集、差集等,详见官方文档。
1.4 字典
字典是Python中的一种键值对容器,可以存储任意数量、任意类型的数据,其中键必须是不可变类型,而值可以是任意类型。创建字典的方式为使用花括号将键值对包围起来,每个键值对之间用逗号隔开,例如:
my_dict = {
'name': 'Alice',
'age': 20,
'hobbies': ['reading', 'writing']
}
print(my_dict) # {'name': 'Alice', 'age': 20, 'hobbies': ['reading', 'writing']}
如果出现键名相同的键值对,后者会覆盖前者,例如:
my_dict = {
'name': 'Alice',
'age': 20,
'hobbies': ['reading', 'writing'],
'age': 21
}
print(my_dict) # {'name': 'Alice', 'age': 21, 'hobbies': ['reading', 'writing']}
字典有很多常用的操作方法,例如访问、添加、删除等,详见官方文档。
2. 可迭代对象
Python中的可迭代对象指的是那些可以使用`for`循环进行遍历的对象,例如列表、元组、集合、字符串、字典等。可迭代对象与容器不尽相同,它不要求一定能容纳任意类型数据,只要能进行遍历就可以。Python中内置了一个`Iterable`类,可以用来判断对象是否为可迭代对象,如下所示:
from collections.abc import Iterable
my_list = [1, 2, 3, 4, 5]
print(isinstance(my_list, Iterable)) # True
除了内置的`Iterable`类,Python中还有许多其他的`Iterable`类型,例如文件、生成器、迭代器等,下面将依次进行介绍。
2.1 字符串
字符串是Python中常见的可迭代对象,可以通过`for`循环进行遍历,例如:
my_str = 'hello'
for c in my_str:
print(c)
# h
# e
# l
# l
# o
此外还可以使用`join()`方法将一个可迭代对象转化为字符串,例如:
my_list = ['hello', 'world']
my_str = '*'.join(my_list)
print(my_str) # hello*world
2.2 文件
文件也是Python中常见的可迭代对象,可以通过`for`循环逐行读取文件内容,例如:
with open('file.txt') as f:
for line in f:
print(line)
此外还可以使用`readlines()`函数读取全部文件内容,返回一个列表,例如:
with open('file.txt') as f:
lines = f.readlines()
print(lines) # ['hello\n', 'world\n']
2.3 生成器
生成器是Python中的一种特殊的可迭代对象,其数据并不存储在内存中,而是根据需要逐个生成,因此在Python的某些场景下,生成器可以大大优化内存占用。创建生成器的方式有两种,一种是使用生成器表达式,例如:
my_gen = (x ** 2 for x in range(5))
for num in my_gen:
print(num)
# 0
# 1
# 4
# 9
# 16
另一种是使用`yield`关键字进行函数定义,例如:
def my_gen():
yield 1
yield 2
yield 3
for num in my_gen():
print(num)
# 1
# 2
# 3
2.4 迭代器
迭代器是Python中的一种基于生成器的可迭代对象,可以使用`next()`函数对其进行遍历,每次遍历返回一个元素,当遍历结束后,会抛出`StopIteration`异常。创建迭代器的方式是先定义一个包含`yield`关键字的生成器函数,然后使用`iter()`函数将其转换为迭代器,例如:
def my_iter():
yield 1
yield 2
yield 3
my_iterator = iter(my_iter())
while True:
try:
num = next(my_iterator)
print(num)
except StopIteration:
break
# 1
# 2
# 3
3. 生成器
Python中的生成器是一种特殊的可迭代对象,可以通过函数定义的方式进行创建,与普通函数不同的是,生成器函数中必须包含`yield`关键字。生成器的主要特点是可以逐个生成返回值,而不是一次性返回全部,因此可以大大节省内存占用。下面将介绍生成器的一些常见用法。
3.1 生成器表达式
生成器表达式与列表推导式类似,但是使用的是圆括号而不是方括号,例如:
my_gen = (x ** 2 for x in range(5))
for num in my_gen:
print(num)
# 0
# 1
# 4
# 9
# 16
生成器表达式的优点是可以节省内存,因为它并不会在内存中保存全部元素,只会根据需要逐个计算并返回。
3.2 yield
`yield`可以将函数定义为生成器函数,它会将函数的返回值封装为一个可迭代的对象,逐个生成并返回,例如:
def my_gen():
yield 1
yield 2
yield 3
for num in my_gen():
print(num)
# 1
# 2
# 3
与生成器表达式相同,生成器函数也可以节省内存,因为它并不会在内存中保存全部元素,只会根据需要逐个计算并返回。
3.3 send方法
`send()`方法可以在生成器中传递数据,并将其作为`yield`表达式的返回值,例如:
def my_gen():
while True:
x = yield
yield x ** 2
my_iterator = my_gen()
next(my_iterator)
for i in range(5):
result = my_iterator.send(i)
print(result)
# 0
# 1
# 4
# 9
# 16
上述代码首先定义了一个生成器函数`my_gen()`,其中使用了一个无限循环来接收传递过来的数据。在主程序中,首先通过`next(my_iterator)`命令启动生成器并执行到第一个`yield`表达式,然后通过`send()`方法向生成器中传递数据,并接收第二个`yield`表达式的返回值。
3.4 return方法
`return`方法可以使生成器工作结束,并返回一个指定的值,与普通函数的`return`语句相似,例如:
def my_gen():
yield 1
yield 2
return 'done'
my_iterator = my_gen()
for num in my_iterator:
print(num)
result = my_iterator.send('end')
print(result)
# 1
# 2
# done
上述代码首先定义了一个生成器函数`my_gen()`,其中通过`return`语句结束了生成器的工作。在主程序中,首先通过`for`循环遍历生成器中的元素,然后通过`send()`方法向生成器中传递数据,最终触发`return`语句并返回指定的值。