迭代器与生成器的区别
python迭代器
Python中的迭代器是一个可以记住遍历位置的对象,用于访问集合元素的一种方式。迭代器是Python中处理数据集合的一种高效机制,它们允许开发者逐个访问集合中的元素,而不需要一次性将所有数据加载到内存中。
迭代器通过实现
__iter__()
和__next__()
方法来定义其行为。__iter__()
方法返回迭代器对象本身,而__next__()
方法负责返回容器中的下一个值。当没有更多元素可以返回时,__next__()
方法会抛出StopIteration
异常,通知调用者所有元素已经被遍历完毕。 在Python中,可以使用
iter()
函数获取一个对象的迭代器,然后使用next()
函数来访问迭代器中的下一个元素。此外,Python的for循环本质上就是在使用迭代器,它可以自动处理StopIteration
异常,使得代码更加简洁易读。以下是使用for循环遍历可迭代对象中元素的示例。1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59# 使用for循环遍历list、tuple、dict、str、set等可迭代对象
# 遍历列表list
for element in [1, 2, 3]:
print(element)
# 编译元组tuple
for element in (1, 2, 3):
print(element)
# 遍历字典dict
for key in {'one': 1, 'two': 2}:
print(key)
# 遍历字符串str
for char in "123":
print(char)
# 遍历集合
for element in {'1', 2, 3.0}:
print(element)
# 使用python内置方法iter()获取对象的迭代器iterator
# 获取字符串迭代器
s = 'abc'
it_s = iter(s)
print(it_s) # <str_iterator object at 0x10c90e650>
print(next(it_s)) # 'a'
print(next(it_s)) # 'b'
print(next(it_s)) # 'c'
# print(next(it)) # StopIteration
# 获取列表迭代器
list1 = [1, 2, 3]
it_list1 = iter(list1)
print(next(it_list1)) # 1
print(next(it_list1)) # 2
print(next(it_list1)) # 3
# 获取集合迭代器
set1 = {'a', 'b', 'c'}
it_set1 = iter(set1)
print(next(it_set1)) # 'a'
print(next(it_set1)) # 'b'
print(next(it_set1)) # 'c'
# 获取字典迭代器
dict1 = {'a': 1, 'b': 2, 'c': 3}
it_dict1 = iter(dict1)
print(next(it_dict1)) # ’a‘
print(next(it_dict1)) # ’b‘
print(next(it_dict1)) # ’c‘
# 获取元组迭代器
tuple1 = (1.0, 2.0, 3.0)
it_tuple1 = iter(tuple1)
print(next(it_tuple1)) # 1.0
print(next(it_tuple1)) # 2.0
print(next(it_tuple1)) # 3.0python生成器
Python中的生成器是一种特殊类型的迭代器,它使用
yield
关键字来返回数据。生成器是一种特殊的函数,它可以在执行过程中暂停并保存其状态,以便稍后从上次停止的位置继续执行。当生成器被调用时,它不会立即执行,而是返回一个生成器对象。只有当开始迭代该对象时,生成器才会逐步执行,并在每次遇到
yield
语句时返回一个值。生成器的主要优点是它们可以按需生成数据,而不是一次性生成所有数据。这在处理大量数据或需要延迟计算结果的情况下非常有用。生成器还可以用于实现协程(coroutines),这是一种允许多个任务协作执行的编程模式。
以下是一个简单的生成器示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28def count_up_to(max):
count = 1
while count <= max:
yield count
count += 1
# 创建一个生成器对象
counter = count_up_to(5)
# 迭代生成器对象
for number in counter:
print(number)
# 使用生成器表达式定义生成器,采用()
num_iterator = (i for i in range(10))
print(num_iterator)
for num in num_iterator:
print(num)
num_iterator2 = (i*i for i in range(10))
print(sum(num_iterator2)) # 求平方和
xvec = [10, 20, 30]
yvec = [7, 5, 3]
print(sum(x*y for x, y in zip(xvec, yvec))) # 点积
data = 'golf'
print(list(data[i] for i in range(len(data)-1, -1, -1))) # 反转输出字符串