Chinaunix首页 | 论坛 | 博客
  • 博客访问: 319071
  • 博文数量: 72
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 748
  • 用 户 组: 普通用户
  • 注册时间: 2018-09-21 18:49
文章分类

全部博文(72)

我的朋友

分类: Python/Ruby

2018-12-16 17:14:12

迭代

    一个重复的过程,每一次重复成为一次迭代,并且每次重复的结果是下一次重复的初始值

 

可迭代对象(iterable)

    使用 iter 内置函数可以获取迭代器的对象。

可迭代对象满足的条件:实现了__iter__方法

 

可迭代对象的判断方法

 使用isinstance()函数

 

from collections import Iterable

isinstance("123",Iterable) #字符串是不是可迭代对象 返回True

isinstance(1,Iterable) #数字是不是可迭代对象  返回False

 

迭代器(iterator)

 

    迭代器是一种带有状态的对象,能够调用next()获取容器的下一个值,但如果调用了next方法,容器没有值可以返回,则会抛出一个StopIteration异常。

 

1 .  为何要有迭代器

 

对于序列类型:字符串,列表,元组可以依赖于索引来迭代取值

但是对于dict,set,文件,python必须为我们提供一种不依赖于索引取值的方法

这个方法就是迭代器

 

2  迭代器满足的条件:实现__iter__方法和__next__方法。

 

3    迭代器的特点:

获取较多的值得时候(比如一百万个数据),比起使用列表等容器存储,更加省内存。因为迭代器有next方法,不会一次性把所有数据生成,而是一个接一个的计算,当你想要下一个值得时候才给你返回。

 

总结:

  •   可迭代对象(iterble)并不一定是 迭代器(iterator)
  •  迭代器(iterator)一定是可迭代对象(iterable)
  • 如果一个对象定义了__iter()__方法,那它就是可迭代对象。
  • 如果一个对象定义了__iter()__方法和__next()__方法,那它就是迭代器。因为迭代器是可迭代对象,所以一定有__iter()__

 

获取迭代器

 

对于python内置的可迭代对象,可以使用函数iter()获取相应的迭代器

 

 

iter()和__iter__

 

__iter__用于自定义用户对象(类)

iter()用于支持序列访问协议,也就是定义有__getitem__()函数的内置对象,以及实现了__getitem__()函数的用户自定义对象。

 

 

  实际上,iter()和__iter__联系很紧密,iter()是直接调用了对象的__iter__方法,并且把这个方法的返回值作为自己的返回值。 

  在for..in…循环中,比如 for i in list,会先调用iter(list)获取可迭代对象list的迭代器,再每次循环调用迭代器的next()方法获取值。

 

如果一个类想被用于for ... in循环,类似list或tuple那样,就必须实现一个__iter__()方法,该方法返回一个迭代对象,然后,Python的for循环就会不断调用该迭代对象的next()方法拿到循环的下一个值,直到遇到StopIteration错误时退出循环。

 

【iter()】创建迭代器,然后通过【next()】访问迭代器中的元素

 

dic={'beijing':1,'shanghai':2,'shenyang':3}

dic_items=iter(dic)

print(next(dic_items))

print(next(dic_items))

print(next(dic_items))

 

【__iter__】和【__next__】将类(class)改造成迭代器

1. 把一个类作为一个迭代器使用需要在类中实现两个方法 __iter__() 与 __next__() 。

 

2. __iter__() 方法返回一个特殊的迭代器对象, 这个迭代器对象实现了 __next__() 方法并通过 StopIteration 异常标识迭代的完成。

 

3. __next__() 方法(Python 2 里是 next())会返回下一个迭代器对象


阅读(2986) | 评论(0) | 转发(0) |
0

上一篇:python 协程

下一篇:python3 迭代器

给主人留下些什么吧!~~