Python生成器和迭代器
一、生成器?
1.1.生成器是什么?
通过列表生成式(列表推导式),我们可以创建一个列表,但是,受到内存限制,列表容量肯定是受限的。而且创建一个包含上百万个元素的列表,不仅占用很大的存储空间,如果我们只需要访问前面几个元素,那么后面绝大多数元素占用的空间都白白浪费了。所以,如果列表元素可以按照某种算法推荐出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在python中,这种一边循环一边计算的机制,成为生成器(generator)
1.2.创建生成器
方式一:
#创建生成器和通过列表推导式创建列表类似,只需要将[]换为() #列表推导式 list1 = [x for x in range(10)] print(list1) #创建生成器 g = (x for x in range(10)) #打印类型为<class 'generator'> print(type(g)) #注意生成器直接输出,只能打印出在内存中的地址 <generator object <genexpr> at 0x000000000212E9C8> print(g)
输入生成器的结果有两种方式
__next__()
#创建生成器 g = (x for x in range(3)) #输入每次结果 print(g.__next__()) print(g.__next__()) print(g.__next__()) #注意range(3),只能取到0,1,2三个数 所以输出第四次会报StopIteration异常 print(g.__next__())
next()
#创建生成器 g = (x for x in range(3)) #使用next(生成式对象)输入每次结果 print(next(g)) print(next(g)) print(next(g)) #注意range(3),只能取到0,1,2三个数 所以输出第四次会报StopIteration异常 print(next(g))
方式二:使用函数创建
def fun1(): n = 0 while True: n += 1 #注意yield的作用是return + 停止 yield n g = fun1() #注意输入同样可以使用next()或者__next__()方式 print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g)) print(next(g))
二、迭代器
2.1.什么是迭代器?
迭代是访问集合元素的一种方式。迭代器是一个可以记住遍历位置的对象。
迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束
迭代器只能往前不会后退
可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator
2.2.python中常见的可迭代对象有哪些?
2.2.1.常见的可迭代对象:
- 生成器
- 列表、元组、字典、字符串
2.2.2.如何返回一个对象是否可迭代呢?、
#判断是否为可迭代对象 from collections.abc import Iterable list1 = [1,3,5,7,9] #判断列表是否可迭代,返回的是True a = isinstance(list1, Iterable) print(a) #判断字符串是否是可迭代对象,返回的是True a = isinstance("Augus", Iterable) print(a) #判断 整型 是否是可迭代对象,返回的结果是False a = isinstance(1234, Iterable) print(a)
注意:
- 生成器就是一个迭代器
- 可迭代的对象不一定就是迭代器
上面我们提到的,列表、元组、字典、字符串等 虽然是一个可迭代的对象,但不是一个迭代器,最简单的判断方式就是看是否可以使用next()方式取值,如下面代码:可迭代的对象列表、元组、字典、字符串等本身不是迭代器,但是可以转换为迭代器
list1 = [1,3,5,7,9] #列表使用next取值,直接会抛出异常:TypeError: 'list' object is not an iterator print(next(list1)) print(next(list1)) print(next(list1))
2.3.如何将可迭代对象列表、元组、字典、字符串等 转换为迭代器?
将可迭代对象转换为迭代器需要借助与 iter() 进行转换,代码如下:
#定义列表 list1 = [1,3,5,7,9] #使用iter方法 将列表转换为 迭代器 iter_list1 = iter(list1) #输出迭代器iter_list1的值 print(next(iter_list1)) #1 print(next(iter_list1)) #3 print(next(iter_list1)) #5

浙公网安备 33010602011771号