一、迭代器
1、什么是迭代器(iter)
迭代器是Python中的容器类的数据类型,可以同时存储多个数据,取迭代器中的数据只能一个一个地取,而且取出来的数据在迭代器中就不存在了
2、迭代器中数据的来源
- a.将其他序列转换成迭代器
- b.使用生成式或者生成器去产生数据
3、迭代器的创建
a.将数据转换成迭代器
所有的序列都可以转换成迭代器:
# 将字符串转换成迭代器
iter1 = iter('abcd')
print(iter1) # <str_iterator object at 0x0000020DA8DDE0F0>
# 列表转换成迭代器
iter2 = iter([1, 2, 3, 4])
print(iter2) # <list_iterator object at 0x00000287576EE1D0>
# 字典转换成迭代器
iter3 = iter({'name': 'aaa'})
print(iter3) # <dict_keyiterator object at 0x000002A883E89728>
4、获取迭代器中的元素
- a. next(迭代器) or 迭代器.next() - 取出迭代器中第一个元素(已经取出来的元素就再也回不到迭代器中了)当迭代器是空的时候 使用next获取元素 会出现异常: StopIteration
- b.通过for循环取出迭代器中的每个元素
二、生成器
1、什么是生成器
生成器就是迭代器,但迭代器不一定是生成器。
生成器就是带有yield关键字的函数的结果;
就是调用带有yield关键字的函数,获取到的结果就是一个生成器,生成器中的元素就是yield关键字后面的值。
2、生成器怎么产生数据
只要函数中有yield关键字,调用函数不会再执行函数体,而是创建一个生成器;当获取生成器的元素的时候,才会执行函数的函数体,执行到yield语句为止,并且将yield后面的值作为结果返回,并且保存当前执行的位置,获取下一个元素的时候就从获取上个元素结束的位置接着往下去执行函数,直到函数结束或者遇到yield为止;如果遇到yield就讲yield后面的值作为结束返回,并且保存当前执行的位置,如果函数结束了,就出现StopIteration异常。
生成器对应的函数,执行完成遇到yield的次数,决定了生成器能产生的数据的个数。
例如:
def func1():
print('abc')
yield 100
re = func1()
print(func1()) # <generator object func1 at 0x00000291296FC888>
# next(func1()) - 执行对应的函数的函数体 将yield关键字后边的值作为结果
print(next(re))
三、生成式
1、生成式
什么是生成式?
格式一: - 结果是一个生成器(迭代器)
(表达式 for 变量 in 序列) --> 展开:
def func1():
for 变量 in 序列:
yield 表达式
注意:表达式的结果就是每次循环生成器产生的数据
这儿的for循环可以控制生成器产生数据的个数和产生的值
格式二:
(表达式 for 变量 in 序列 if 条件语句) -->展开:
def func1():
for 变量 in 序列:
if 条件语句:
yield 表达式