2017/9/7的学习内容———Python迭代器(老男孩Alex)

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

  一类是集合数据类型,如listtupledictsetstr等;

  一类是generator,包括生成器和带yield的generator function。

  这些可以直接作用于for循环的对象统称为可迭代对象:Iterable

  可以使用isinstance()判断一个对象是否是Iterable对象:]

>>> from collections import Iterable
>>> isinstance([],Iterable)
True
>>> isinstance((‘abc‘,‘awe‘),Iterable)
True
>>> isinstance({},Iterable)
True
>>> isinstance(123,Iterable)
False

  而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了

  即 我们得出,可以被next()调用并返回下一个值的object 为: 迭代器 Iterator

  可以使用isinstance()判断一个对象是否是Iterator对象:

 eg: 列表不是迭代器

  

>>> a = [1,2,3]
>>> dir(a)
[‘__add__‘, ‘__class__‘, ‘__contains__‘,
 ‘__delattr__‘, ‘__delitem__‘, ‘__dir__‘
    , ‘__doc__‘, ‘__eq__‘, ‘__format__‘,
 ‘__ge__‘, ‘__getattribute__‘,
 ‘__getitem__‘, ‘__gt__‘, ‘__hash__‘,
 ‘__iadd__‘, ‘__imul__‘, ‘__init__‘,
 ‘__iter__‘, ‘__le__‘, ‘__len__‘,
 ‘__lt__‘, ‘__mul__‘, ‘__ne__‘,
 ‘__new__‘, ‘__reduce__‘,
 ‘__reduce_ex__‘, ‘__repr__‘,
 ‘__reversed__‘, ‘__rmul__‘,
 ‘__setattr__‘, ‘__setitem__‘,
 ‘__sizeof__‘, ‘__str__‘,
 ‘__subclasshook__‘, ‘append‘, ‘clear‘,
 ‘copy‘, ‘count‘, ‘extend‘, ‘index‘,
 ‘insert‘, ‘pop‘, ‘remove‘, ‘reverse‘,
 ‘sort‘]
#列表中没有next调用方法,不是迭代器

可以发现 列表的方法中没有__next__ 故不是迭代器

  

>>> from collections import Iterator
>>> isinstance((x for x in range(5)),Iterator)
True
>>>列表生成式(生成器)是生成器)
>>> isinstance({},Iterator)
False
列表、元祖等都不是迭代器

 转自(金角大王)

list、dict、str等Iterable变成Iterator 可以使用内置方法: iter()

iter()函数
>>> a = [1,32,444]
>>> b = iter(a)
>>> b.__next__()
1
>>> b.__next__()
32
>>> b.__next__()
444
>>>>>> b.__next__()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
StopIteration 没有数据时 抛出异常

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。(迭代器相对于列表的优点)

 

时间: 2024-10-16 17:38:11

2017/9/7的学习内容———Python迭代器(老男孩Alex)的相关文章

2017/9/5的学习内容___通过yield实现在单线程的情况下实现并发运算的效果

之前的学习内容,由于没有申请开通博客,就没有分享,今天想分享一下学习内容:通过yield实现在单线程的情况下实现并发运算的效果 采用的是经典的生产消费者模型 定义了两个函数 Consumer与Producer 关于生成器标志yield : 如果用__next__访问,只是单纯调用yield :如果是send访问,不仅可以访问yield,也可以给yield赋值! 需求:一个人造包子:两个人吃包子: 代码如下: 1 # -*- coding:utf-8 -*- 2 # Author : 何子辰 3

2017.4.7下午学习内容

背诵了上午所学单词和学习了新课单词,并听了宪法章节

2017.4.25下午学习内容

学习了英语语法和词汇,并复习了作文部分

2017.4.27下午学习内容

听英语作文课和刑法第八章下

2017.3.22上午学习内容

做了一套英语试题,并复习了第四单元单词和第八单元词汇,对买的课程进行分类总结

2017.3.20上午学习内容

复习了第五单元词汇,三四节听近代史课程

2017.3.20下午学习内容

听了新的一章法律课程,并做了相应习题

2017.5.12下午学习内容

听了专业相关课程,并做了刑法第十三章习题

2017.5.3上午学习内容

听刑法第十一章