python-迭代器和生成器

一、迭代器

1、迭代器iterator中只能包含可迭代对象。可用于for循环的对象是可迭代对象Iterable,如list,tuple等,可迭代对象不能用__next__()访问元素

2、能用于for循环,且能通过__next__()访问的对象是迭代器Iterator,如生成器就是一个迭代器对象

3、只能通过__next__()依次获取迭代器中的元素,不能通过下标才查找

4、读取量很大的数据时,用迭代器可节省内存

>>> a=iter([1,2,3,4])
>>> b=iter((5,6,7,8))
>>> a.__next__()
1
>>> a.__next__()
2
>>> b.__next__()
5
>>> b.__next__()
6

4、判断一个对象是否为可迭代对象 和 迭代器对象

>>> from collections import Iterable
>>> from collections import Iterator

>>> list1 = [1,2,3,4]  #list1是一个可迭代对象
>>> a = iter(list1)   #将list转化为迭代器对象

>>> isinstance(list1,Iterable)
True
>>> isinstance(list1,Iterator)
False
>>> isinstance(a,Iterator)
True
>>> isinstance(a,Iterable) #迭代器对象一定是可迭代对象
True

>>> b = list(a) #将迭代器对象转化为list
>>> b
[1, 2, 3, 4]

二、生成器

1、返回迭代器的函数是一个生成器generator。生成器可用于for循环,也可用__next__()取值

#函数func(n)是一个生成器,返回包含斐波拉契数列的一个迭代器。
def func(n):
    a, b = 0, 1
    for i in range(n):  
        yield b
        a, b = b, a+b

#func()是一个生成器,可用于for循环
for i in func(3):
    print(i)

2、另一种创建生成器的方法

>>> a = [x**2 for x in range(3)]
>>> a
[0, 1, 4]
>>> type(a)
<class 'list'>

>>> b = (x**2 for x in range(3)) #b是一个生成器
>>> b
<generator object <genexpr> at 0x0221CB70>
>>> for i in b:
...     print(i)
...
0
1
4
>>>
原文地址:https://www.cnblogs.com/jessicaxu/p/7743416.html