迭代器差别和关系,python的迭代器与生成器实例详解编程

By admin in 编程 on 2019年6月4日

生成器,可迭代对象,迭代器之间毕竟是什么样关系?

正文实例为我们享受了python使用生成器完结可迭代对象的求实代码,供我们参考,具体内容如下

本文以实例详解了python的迭代器与生成器,具体如下所示:

用1幅图来回顾:

案例深入分析:      

1. 迭代器概述:  
迭代器是访问群集成分的1种情势。迭代器对象从集结的第1个成分开首访问,直到全数的因素被访问完结束。迭代器只好往前不会掉队,可是这也没怎么,因为大家相当少在迭代半路以后退。
 
一.一 使用迭代器的独到之处  
对于原生协助随机访问的数据结构(如tuple、list),迭代器和杰出for循环的目录访问比较并无优势,反而丢失了索引值(能够应用内建函数enumerate()找回那几个索引值)。但对此一点都不大概轻松访问的数据结构(举个例子set)来说,迭代器是天下无双的拜访成分的法子。

编程 1

        实一个可迭代对象的类,它能迭代出给定范围内具有的素数:

此外,迭代器的一大优点是不须求先行希图好1切迭代进程中具备的因素。迭代器仅仅在迭代到有些成分时才总计该因素,而在那后面或之后,成分得以不设有也许被灭绝。那么些特点使得它非常适合用来遍历一些了不起的或然Infiniti的集结,举例多少个G的文件,或是斐波那契数列等等。

1.生成器

概念生成器

方式一:

//区别于列表生成式 gen = [x*x for x in range(5)]
gen = (x*x for x in range(5)) 
print(gen) //Out:<generator object <genexpr> at 0x00000258DC5CD8E0>

方式二:

def fib():
  prev, curr = 0, 1
  while True:
    yield curr
    prev, curr = curr, curr + prev
f = fib()
print(f) //Out:<generator object fib at 0x00000258DC5CD150>

概念成功后,我们能够利用next()访问生成器下四个因素

print(next(gen)) //0
print(next(gen)) //1
...
print(next(gen)) //16
print(next(gen)) //StopIteration

但一般用for循环遍历

for n in gen:
  print(n) //0 1 4  9 16

              pn = Number(1, 30)

迭代器更加大的功劳是提供了一个合并的访问集合的接口,只要定义了__iter__()方法对象,就足以运用迭代器访问。
 
迭代器有四个宗旨的点子
 
next方法:重返迭代器的下2个要素
__iter__方法:再次来到迭代器对象自己
上面用调换斐波那契数列为例子,表达为啥用迭代器
 
演示代码一

2.迭代器

其余完毕了__iter__和__next__()方法的靶子都以迭代器。__iter__重返迭代器本身,__next__回来容器中的下二个值。所以生成器是超过常规规的迭代器,她中间有着那二种方法。

三个自定义的迭代器如下:

class Fib:
  def __init__(self):
    self.prev = 0
    self.curr = 1

  def __iter__(self):
    return self

  def __next__(self):
    value = self.curr
    self.curr += self.prev
    self.prev = value
    return value
f = Fib() 
count = 1 
for n in f:
  print(n)
  count = count+1
  if count>=10:
    break
//Out:1 1 2 3 5 8 13 21 34

              for k in pn:

 def fab(max): 
  n, a, b = 0, 0, 1 
  while n < max: 
    print b 
    a, b = b, a + b 
    n = n + 1

3.可迭代对象

像list,tuple,set,dict,str等能够直接成效于for循环的目的,称为可迭代对象。可迭代对象实现了__iter__办法,用于重回迭代器。

demo = [1,2,3,4]
print(isinstance(demo, Iterable)) //True
iter_object = iter(demo)
print(iter_object) //<list_iterator object at 0x00000258DC5EF748>

 

                     print(k)

一直在函数fab(max)中用print打字与印刷会形成函数的可复用性别变化差,因为fab重临None。别的函数无法获得fab函数重返的数列。
 
演示代码贰

你大概感兴趣的篇章:

  • 深入解说Python中的迭代器和生成器
  • python的迭代器与生成器实例详解
  • 举例批注Python中的迭代器、生成器与列表剖析用法
  • Python的迭代器和生成器使用实例
  • python使用生成器完结可迭代对象
  • Python迭代器和生成器定义与用法示例
  • python基于右递归化解8皇后难点的办法
  • Python化解8皇后难题示例
  • Python基于生成器迭代完毕的八皇后难题示例

       结果为:2,3,5,7,11,13,17,19,23,29

 def fab(max): 
  L = []
  n, a, b = 0, 0, 1 
  while n < max: 
    L.append(b) 
    a, b = b, a + b 
    n = n + 1
  return L

什么化解这一个主题材料?

代码二满意了可复用性的供给,可是占用了内部存储器空间,最佳不要。
 
演示代码三
 
对比:
 

将此类的__iter__方法落成成生成器函数,每一次yield再次来到1个素数

for i in range(1000): pass
for i in xrange(1000): pass
#!/usr/bin/python3


class Number(object):
 def __init__(self, start, end):
  self.start = start
  self.end = end

 # 判断一个数字是否是素数
 def get_num(self, k):
  if k >= 2:
   for i in range(2, k):
    if k % i == 0:
     return False
   return True

 def __iter__(self):
  for k in range(self.start, self.end+1):
   if self.get_num(k):
    # 是素数yield出去
    yield k

if __name__ == '__main__':
 num = Number(2, 30)
 for i in num:
  print(i)

前八个重临一千个要素的列表,而后一个在历次迭代中回到三个元素,因而得以应用迭代器来化解复用可占空间的主题材料
 

以上正是本文的全体内容,希望对大家的读书抱有支持,也愿意大家多多协助脚本之家。

 class Fab(object): 
  def __init__(self, max): 
    self.max = max 
    self.n, self.a, self.b = 0, 0, 1 

  def __iter__(self): 
    return self 

  def next(self): 
    if self.n < self.max: 
      r = self.b 
      self.a, self.b = self.b, self.a + self.b 
      self.n = self.n + 1 
      return r 
    raise StopIteration()

你或然感兴趣的稿子:

  • 浓密疏解Python中的迭代器和生成器
  • python的迭代器与生成器实例详解
  • 比如讲授Python中的迭代器、生成器与列表剖析用法
  • Python的迭代器和生成器使用实例
  • python生成器,可迭代对象,迭代器不一样和维系
  • Python迭代器和生成器定义与用法示例
  • python基于右递归消除八皇后难题的主意
  • Python化解八皇后难题示例
  • Python基于生成器迭代完结的八皇后难点示例

执行

>>> for key in Fabs(5):
  print key

Fabs 类通过 next() 不断重返数列的下1个数,内存占用始终为常数  

1.二 使用迭代器

动用内建的工厂函数iter(iterable)能够拿走迭代器对象:

>>> lst = range(5)
>>> it = iter(lst)
>>> it
<listiterator object at 0x01A63110>

应用next()方法可以访问下四个要素:

>>> it.next()

>>> it.next()

>>> it.next()

python管理迭代器越界是抛出StopIteration格外

>>> it.next()

>>> it.next
<method-wrapper 'next' of listiterator object at 0x01A63110>
>>> it.next()

>>> it.next()

Traceback (most recent call last):
 File "<pyshell#27>", line 1, in <module>
  it.next()
StopIteration

掌握了StopIteration,能够选择迭代器进行遍历了

lst = range(5)
it = iter(lst)
try:
  while True:
    val = it.next()
    print val
except StopIteration:
  pass

实际,因为迭代器如此广阔,python专门为for关键字做了迭代器的语法糖。在for循环中,Python将机关调用工厂函数iter()获得迭代器,自动调用next()获取元素,还成功了反省StopIteration非凡的劳作。如下

>>> a = (1, 2, 3, 4)
>>> for key in a:
  print key

第1python对首要字in后的靶子调用iter函数迭代器,然后调用迭代器的next方法赢得元素,直到抛出StopIteration格外。

一.叁 定义迭代器  
上面多少个例证——斐波那契数列
 

# -*- coding: cp936 -*-
class Fabs(object):
  def __init__(self,max):
    self.max = max
    self.n, self.a, self.b = 0, 0, 1 #特别指出:第0项是0,第1项是第一个1.整个数列从1开始
  def __iter__(self):
    return self
  def next(self):
    if self.n < self.max:
      r = self.b
      self.a, self.b = self.b, self.a + self.b
      self.n = self.n + 1
      return r
    raise StopIteration()

print Fabs(5)
for key in Fabs(5):
  print key

结果

<__main__.Fabs object at 0x01A63090>

2. 迭代器

含有 yield 的函数在 Python 中被称为
generator(生成器),多少个例子表明下(依然用生成斐波那契数列表明)
 
能够看来代码三远未有代码一简洁,生成器(yield)既能够保险代码1的简洁性,又有啥不可保持代码三的功能
 
演示代码四 
 

def fab(max):
  n, a, b = 0, 0, 1
  while n < max:
    yield b
    a, b = b, a + b
    n = n = 1

执行

>>> for n in fab(5):
  print n

粗略地讲,yield 的效益正是把一个函数产生叁个 generator,带有 yield
的函数不再是多少个常常函数,Python 解释器会将其正是八个 generator,调用
fab(5) 不会执行 fab 函数,而是回到1个 iterable 对象!在 for
循环实施时,每回循环都会进行 fab 函数内部的代码,实施到 yield b 时,fab
函数就重返八个迭代值,下一次迭代时,代码从 yield b
的下一条语句继续推行,而函数的地头变量看起来和上次中断试行前是截然等同的,于是函数继续实践,直到再也遭遇yield。看起来就类似一个函数在例行实践的进度中被 yield
中断了多次,每回中断都会通过 yield 重临当前的迭代值。
 
也得以手动调用 fab(5) 的 next() 方法(因为 fab(伍) 是叁个 generator
对象,该对象具备 next() 方法),那样大家就足以更精通地看出 fab
的实施流程:

>>> f = fab(3)
>>> f.next()
1
>>> f.next()
1
>>> f.next()
2
>>> f.next()

Traceback (most recent call last):
 File "<pyshell#62>", line 1, in <module>
  f.next()
StopIteration

return作用

在多少个生成器中,假诺没有return,则默许执行到函数完毕;要是越过return,若是在施行进程中
return,则直接抛出 StopIteration 终止迭代。比方
 

>>> s = fab(5)
>>> s.next()
1
>>> s.next()

Traceback (most recent call last):
 File "<pyshell#66>", line 1, in <module>
  s.next()
StopIteration

演示代码5  文本读取

 def read_file(fpath): 
  BLOCK_SIZE = 1024 
  with open(fpath, 'rb') as f: 
    while True: 
      block = f.read(BLOCK_SIZE) 
      if block: 
        yield block 
      else: 
        return

设若直接对文本对象调用 read()
方法,会导致不可预测的内部存储器占用。好的方法是运用固定长度的缓冲区来不断读取文件内容。通过
yield,大家不再供给编制读文件的迭代类,就能够轻便落成文件读取。

您只怕感兴趣的稿子:

  • Python生成器(Generator)详解
  • 浅谈Python生成器generator之next和send的运作流程(详解)
  • python生成器generator用法实例深入分析
  • Python列表推导式与生成器用法分析
  • Python列表生成式与生成器操作示例
  • Python迭代器与生成器基本用法深入分析
  • Python迭代器与生成器用法实例分析
  • 编程,Python三中的列表生成式、生成器与迭代器实例详解
  • Python生成器定义与简便用法实例解析
  • 深深疏解Python中的迭代器和生成器
  • Python生成器generator用法示例

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图
Copyright @ 2010-2019 澳门新葡亰官网app 版权所有