python-三器 迭代器、生成器

  迭代是Python最强大的功能之一,是访问集合元素的一种方式。可迭代对象有迭代器、序列(字符串、列表、元祖)、字典,而迭代器是一个可以记住遍历的位置的对象。生成器是一种特殊的迭代器,调用一个生成器函数,返回的是一个迭代器对象。

 

迭代器 (Iterator

   迭代器是一个可以记住遍历的位置的对象。

        迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。迭代器只能往前不会后退。

        迭代器有两个基本的方法:iter() 和 next(),他们都是python的内置函数,iter()会返回一个迭代器对象,迭代对象具有next()方法,在没有后续元素时next()会抛出一个StopIteration异常。

        string、list、dict、tuple都可用于创建迭代器。

#生成器返回一个可迭代的生成器对象
b = (i for i in range(10))
def gen():
    for i in range(10):
         yield i

c = gen()
print(b,c)
print(next(b),next(c))
print(b.__iter__(),c.__iter__())
print(b.__next__(),c.__next__())
print(list(b),list(c))


#自定义迭代器
class Range():
    def __init__(self, start, stop):
        self.start = start
        self.stop = stop

    def __iter__(self):
        return self

    def __next__(self):
        if self.start > self.stop:
            raise StopIteration
        temp = self.start
        self.start += 1
        return temp

ra = Range(1, 10)
print(ra)             #创建迭代器
print(next(ra))       #next()方法,可以记住位置
print(ra.__iter__())  #返回迭代器
print(ra.__next__())  #__next__()内置方法,可以记住位置

 

生成器(Generator 

   生成器是创建迭代器的简单而强大的工具,使用了yield的函数被称为生成器,只是在需要返回数据的时候使用yield语句

        生成器是一个返回迭代器的函数,同时也具备iter()和next()方法

        生成器是一种特殊的迭代器,具迭代器特性,还具有有惰性,

        生成器每次访问就给你返回一个值,并且记住这个返回的位置,下次迭代就从这个位置后(下一行)开始

#生成器返回一个可迭代的生成器对象
b = (i for i in range(10))
def gen():
    for i in range(10):
         yield i

c = gen()
print(b,c)
print(next(b),next(c))
print(b.__iter__(),c.__iter__())
print(b.__next__(),c.__next__())
print(list(b),list(c))

 

  send()

   send是生成器generator的一个方法,可以传入一个参数。

        我们都知道yield表达式有一个值,而send就是控制这个表达式值的方法

        如果send不携带参数,那么send(None)和next()的道理相同.

        如果send的带有参数,那么send(value)中value就是yield表达式的返回值,但必须再此之前先用send(None)或next()启动生成器,再使用send(value)

        启动生成器时,因为当前还没有yield表达式可以接收参数;启动之后,send(value)方法会将value值传给生成器的方法,value值会变成当前yield表达式的值,以及返回下一个yield返回值或者StopIteration异常。

def fuc():
   while True:
       value = yield 'x'
       if value:
           print(f'value:{value}')

e = fuc()
print(e.send(None)) #启动
print(next(e))      #启动
print(e.send('y'))  #将‘y’给value

 

迭代器、生成器区别

   生成器能做到迭代器能做的所有事,而且因为自动创建了 iter()和 next()方法,生成器显得特别简洁,而且

        生成器也是高效的,使用生成器表达式取代列表解析可以同时节省内存。除了创建和保存程序状态的自动方法,

        当生成生器终结时,还会自动抛出 StopIteration 异常。

"""
迭代器、生成器区别
    1、共同点
      生成器是一种特殊的迭代器,具有next()和iter()函数
    2、不同点
      a、语法上
        迭代器可以通过iter()内置函数创建
        生成器是通过函数的形式中调用yield 或 () 的形式创建的,且具有send()函数
      b、用法上
        迭代器在调用next()函数或for循环中,所有值被返回,没有其他过程动作
        生成器在调用next()函数或for循环中,所有值被返回,记录过程被执行的位置

生成器表达式、列表推导式的区别
  1、列表推导式比较耗内存一次性加载,生成器表达式几乎不占内存,使用的时候才分配和使用内存
  2、得到的值不一样:列表推导式得到的是一个列表,生成器表达式得到的是一个生成器
"""
a = [i for i in range(10)] #返回列表,不具备next()方法
b = iter(range(10))        #返回了一个迭代器iterator
c = (i for i in range(10)) #返回了一个可迭代的生成器generator
print(f'a : {a}')
print(f'b : {b}')
print(f'c : {c}')

 

posted @ 2021-04-13 18:05  南方的墙  阅读(75)  评论(0编辑  收藏  举报