美文网首页
15.python3迭代器和生成器

15.python3迭代器和生成器

作者: dwy_interesting | 来源:发表于2020-05-26 10:51 被阅读0次

迭代器

迭代

上一次输出的结果为下一次输入的初始值,重复的过程称为迭代,每次重复即一次迭代,并且每次迭代的结果是下一次迭代的初始值
注:循环不是迭代

迭代器

1.为什么要有迭代器?
对于没有索引的数据类型,必须提供一种不依赖索引的迭代方式。

2.迭代器定义:
迭代器:可迭代对象执行iter方法,得到的结果就是迭代器,迭代器对象有next方法
它是一个带状态的对象,他能在你调用next()方法的时候返回容器中的下一个值,任何实现了iternext()方法的对象都是迭代器,iter返回迭代器自身,next返回容器中的下一个值,如果容器中没有更多元素了,则抛出StopIteration异常

可迭代的(iterable)

Python标准库中存在着一些可迭代对象,例如:list, tuple, dict, set, str等。
迭代器对象可以使用常规for语句进行遍历:
举个栗子:

list=[1,2,3,4]
it = iter(list)    # 创建迭代器对象
for x in it:
    print (x, end=" ")   #输出结果:1 2 3 4

使用next()函数:
举个栗子:

>>> list=[1,2,3,4]
>>> it = iter(list)    # 创建迭代器对象
>>> print (next(it))   # 输出迭代器的下一个元素
1
>>> print (next(it))
2
>>>

创建一个迭代器

把一个类作为一个迭代器使用,需要在类中实现两个方法 iter() 与 next() 。
Python3 的构造函数为 init(), 它会在对象初始化的时候执行。
iter() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 next() 方法,并通过 StopIteration 异常标识迭代的完成。next() 方法会返回下一个迭代器对象。
举个栗子:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    x = self.a
    self.a += 1
    return x
 
myclass = MyNumbers()
myiter = iter(myclass)
 
print(next(myiter))     #输出结果:1
print(next(myiter))     #输出结果:2
print(next(myiter))     #输出结果:3
print(next(myiter))     #输出结果:4

StopIteration

StopIteration 异常用于标识迭代的完成,防止出现无限循环的情况,在 next() 方法中我们可以设置在完成指定循环次数后触发 StopIteration 异常来结束迭代。
举个栗子:

class MyNumbers:
  def __iter__(self):
    self.a = 1
    return self
 
  def __next__(self):
    if self.a <= 5:
      x = self.a
      self.a += 1
      return x
    else:
      raise StopIteration
 
myclass = MyNumbers()
myiter = iter(myclass)
 
for x in myiter:
  print(x)      #输出结果:1 2 3 4 5

生成器

1、生成器的定义

生成器就是一个数据类型,但是这个数据类型可以自动实现迭代器协议

2、生成器的表达形式

在函数中使用yield语句替换return函数,当函数碰到了yield时会返回一个相应的值,并记录当前函数运行的状态,在下次调用函数的时候会从当前状态运行函数。
举个栗子:

def test():
    yield 1
    yield 2
    yield 3

l = test()
print(l.__next__())     #输出结果:1
print(l.__next__())     #输出结果:2
print(l.__next__())     #输出结果:3

send()方法:

send()方法和next方法实现的功能类似,都是取出生成器中的值,但send()方法需要传递一个参数,可以将该参数传递给yield并赋值给一个变量。
举个栗子:

def Fib():
    a = yield 1
    if a != None:
        yield a
    yield 2
    yield 3

f = Fib()
print(next(f))  #输出结果:1
print(f.send('hello'))  #输出结果:hello
print(next(f))  #输出结果:2
print(next(f))  #输出结果:3

相关文章

网友评论

      本文标题:15.python3迭代器和生成器

      本文链接:https://www.haomeiwen.com/subject/mylkwhtx.html