Python详细解析之容器、可迭代对象、迭代器以及生成器

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`语句并返回指定的值。

免责声明:本文来自互联网,本站所有信息(包括但不限于文字、视频、音频、数据及图表),不保证该信息的准确性、真实性、完整性、有效性、及时性、原创性等,版权归属于原作者,如无意侵犯媒体或个人知识产权,请来电或致函告之,本站将在第一时间处理。猿码集站发布此文目的在于促进信息交流,此文观点与本站立场无关,不承担任何责任。

后端开发标签