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
posted @ 2020-11-24 11:45  酒剑仙*  阅读(241)  评论(0)    收藏  举报