迭代器和生成器
1.迭代器
1.1 什么是迭代器(iter)
-
迭代器是容器型数据类型(可以遍历,也可以转换成列表),无法直接提供迭代器,只能将其他序列转换成迭代器。
-
特点:
- 打印迭代器无法查看元素有哪些
- 无法通过len获取迭代器中元素的个数
- 如果要使用迭代器中的元素必须将元素从迭代器中取走,取走的元素会从迭代器中永远消失(用一个少一个)
-
任何数据都可以作为迭代器的元素
1)创建迭代器
i1 = iter('abc')
i2 = iter([10, 20, 30, 40])
i3 = iter((10, 1.23, 'abc', True, [10, 20]))
2)打印迭代器无法查看元素
print(i1) # <str_iterator object at 0x000002677F24FFD0>
print(i2)
print(i3)
3)迭代器无法统计个数
# print(len(i1)) # 报错
1.2 获取迭代器中元素
- 无论以任何方式获取到了迭代器中某个元素,那么这个元素一定会从迭代器中消失。
1)获取单个元素:
next(迭代器) - 获取迭代器最前面的元素
print(next(i1)) # a
print(next(i1)) # b
print(next(i1)) # c
# print(next(i1)) # 空迭代器next操作会报错
print(next(i2)) # 10
print(list(i2)) # [20, 30, 40]
# print(next(i2)) # 报错(转换成列表时,已取走元素)
2)遍历迭代器
for 变量 in 迭代器:
循环体
for x in i3:
print(x)
print(list(i3)) # []
2. 生成器
2.1 什么是生成器
1)容器(是一种可以创建多个数据的容器),生成器中保存的是创建数据的方法,而不是数据本身。
2)特点:
- 打印生成器无法查看元素;
- 不能通过len统计生成器元素的个数
- 如果需要生成器中的数据,必须将数据取出,去一个少一个
3)获取元素:和迭代器获取元素的方式一样
2.2 怎么创建生成器
- 调用带有yield关键字的函数,就可以得到一个生成器。
def func1():
yield
print('hello')
return 100
result = func1()
print('result:', result)
print('result:', list(result)) # hello result: [None]
2.3 怎么控制生成器中元素的个数和元素的值
- 执行创建生成器的函数体的时候会与带几次yield,对应的生成器就会创建几个数据,每次遇到yield,yield后面的值就是创建出来的数据。
def func2():
print('+++')
yield 100
print('---')
yield 200
print('***')
yield 300
gen2 = func2()
print(list(func2()))
print('next:', next(gen2))
print('next:', next(gen2))
print('next:', next(gen2))
print('------------------------------华丽分割线-----------------------------')
def func3(n):
yield 100
if n % 2 == 0:
yield 200
yield 300
gen3 = func3(3)
print(list(gen3))
# print('next:', next(gen3)) # 报错,gen3已经全取出来转化成列表