迭代器、生成器、yield

 

Python中iterable(迭代器)、generator(生成器)、yield

迭代器:

  我们平时使用的列表,就是一个迭代器。可以通过for循环的方式去读取列表中的每一个元素。

  所有可以通过for .. in 进行遍历的都是迭代器。比如列表、字符串、files

生成器:

  当迭代器声明一个列表或者字符串,当他们存储的内容过多时,会占用较多的内存。这时候生成器的作用就显现出来了。

定义一个生成器

# 把创建列表的[] 改成 () 就创建了一个生成器gener
gener = (i ** 2 for i in range(10))

for i in gener:
    print(i) # 一次打印0、1、4、9、16 ... i的平方

  gener只是一个对象,并不会像列表一样占用太多空间。

yield:

  一定程度上来讲相当于return,区别在于return执行完之后不再往后执行,

  而yield相当于把返回一个生成器,程序不会终止

def m():
    print('m()  starting')
    while True:
        result = yield 1
        print('result = ', result)

g = m()  
print(next(g))
print('*' * 10)
print(next(g))
print('&' * 10)
print(next(g))
###########################################
m()  starting      # 刚进入函数m() 执行的打印信息
1                  # 执行next(g) 返回1,而不会再去执行result=xxx
**********         # '*' * 10 标记用
result =  None     # 再次执行next(g)的时候,首先打印了result = None,
1                  # 然后才返回1 
&&&&&&&&&&         # 标记用
result =  None     # 继续执行next(g), 仍然返回result=None
1                  # 然后才返回1

  当执行yield的时候返回了1(生成器对象),再不会往下执行,当再次调用函数m的时候才继续往下执行,执行while循环,再遇到yield的时候继续返回生成器对象。

  

Python中的迭代器

迭代器的好处:

迭代器和列表的作用相似,但是列表随着元素个数的增加,所占用的空间也会增加。而迭代器的本质是一个对象,并不像列表那样通过索引获取元素,充分的节省了内存。

迭代对象:

在Python中,操作列表、字典、字符串等可以通过for ... in ... 的方式去获取对象中的元素,这个过程称为遍历,也叫做迭代。这些对象称为可迭代对象

  这些对象都有一个 __iter__()方法,这个方法提供了一个迭代器。

  迭代器又会实现了__next__()方法。通过此方法可以去访问迭代对象中的元素。从第一个开始,顺序访问,直到访问到最后一个元素。会抛出StopInteration异常。

迭代器 和 迭代对象 的区别:

  1)可迭代对象包含迭代器。
  2)如果一个对象拥有__iter__方法,其是可迭代对象;如果一个对象拥有next方法,其是迭代器。
  3)定义可迭代对象,必须实现__iter__方法;定义迭代器,必须实现__iter__和next方法。

  总结含有 __iter__() 【必须】和 __next__() 方法的就是迭代器。

    有 __iter__() 方法代表可以使用for循环

    有__next()__ 方法 可以通过next() 方法去获取迭代器中的元素

a = [1, 3, 5]
print(type(a))  # <class 'list'>
from collections import Iterable
# 创建一个a的迭代对象
a_iter = iter(a)
print(type(a_iter))  # <class 'list_iterator'>

print(a_iter.__next__())  # 1
print(a_iter.__next__())  # 3
print(a_iter.__next__())  # 5
print(a_iter.__next__())  # 迭代到最后一个元素时,会抛出StopIteration异常

# 使用for in 来遍历一个迭代对象
for i in a_iter:
    print(i)

# 遍历try except break
while 1:
    try:
        print(a_iter.__next__())
    except StopIteration:
        print('结束....')
        break
from collections import Iterable
# 判断列表是否是可迭代对象
print(isinstance([], Iterable))  # True
# 判断字典是否是可迭代对象
print(isinstance({}, Iterable)) # True
# 判断字符串是否是迭代对象
print(isinstance('Hello', Iterable)) # True

  

 

posted @ 2019-08-26 01:06  JamJarBranch  阅读(191)  评论(0)    收藏  举报