我们将要来学习python的重要概念迭代和迭代器,通过简单实用的例子如列表迭代器和xrange。

可迭代

一个对象,物理或者虚拟存储的序列。list,tuple,strins,dicttionary,set以及生成器对象都是可迭代的,整型数是不可迭代的。如果你不确定哪个可迭代哪个不可以,你需要用python内建的iter()来帮忙。

>>> iter([1,2,3])

>>> iter({1:2, 2:4})

>>> iter(1234)

Traceback (most recent call last):

File "", line 1, in

iter(1234)

TypeError: 'int' object is not iterable

iter()为list返回了listiterator对象,为dictionary返回了dictionary-keyiterator对象。类似对其他可迭代类型也会返回迭代器对象。

iter()用在自定义的类型会怎样呢?我们先自己定义一个String类:

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

st = String('sample string')

那么,st是可迭代的吗?

>>> iter(st)

TypeError: 'String' object is not iterable

你可能会有几个问题要问:

怎么让自定义的类型可迭代?

iter()究竟做了些什么?让我们补充String类来找找答案

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __iter__(self):

print "This is __iter__ method of String class"

return iter(self.val) #self.val is python string so iter() will return it's iterator

>>> st = String('Sample String')

>>> iter(st)

This is __iter__ method of String class

在String类中需要一个'__iter__'方法把String类型变成可迭代的,这就是说'iter'内部调用了'iterable.__iter__()'

别急,不是只有增加'__iter()'方法这一种途径

class String(object):

def __init__(self, val):

self.val = val

def __str__(self):

return self.val

def __getitem__(self, index):

return self.val[index]

>>> st = String('Sample String')

>>> iter(st)

‘itr'也会调用'iterable.__getitem__()',所以我们用'__getitem__'方法让String类型可迭代。

如果在String类中同时使用'__iter__()'和'__getitem__()',就只有'__iter__'会起作用。

自动迭代

for循环会自动迭代

for x in iterable:

print x

我们可以不用for循环来实现吗?

def iterate_while(iterable):

index = 0

while(i< len(iterable)):

print iterable[i]

i +=1

这样做对list和string是管用的,但对dictionary不会奏效,所以这绝对不是python式的迭代,也肯定不能模拟for循环的功能。我们先看迭代器,等下回再过头来。

迭代器

关于迭代器先说几条………..

1. 迭代器对象在迭代过程中会会产生可迭代的值,`next()`或者`__next()__`是迭代器用来产生下一个值的方法。

2. 它会在迭代结束后发出StopIteration异常。

3. `iter()`函数返回迭代器对象

4. 如果`iter()`函数被用在迭代器对象,它会返回对象本身

我们试一试模仿for循环

def simulate_for_loop(iterable):

it = iter(iterable)

while(True):

try:

print next(it)

except StopIteration:

break

>>> simulate_for_loop([23,12,34,56])

23

12

34

56

前面我们看过了iterable类,我们知道iter会返回迭代器对象。

现在我们试着理解迭代器类的设计。

class Iterator:

def __init__(self, iterable)

self.iterable = iterable

.

.

def __iter__(self): #iter should return self if called on iterator

return self

def next(self): #Use __next__() in python 3.x

if condition: #it should raise StopIteration exception if no next element is left to return

raise StopIteration

我们学了够多的迭代和迭代器,在python程序中不会用到比这更深的了。

但是为了学习的目的我们就到这儿。。。。

列表迭代器

你可能会在面试中写这个,所以打起精神来注意了

class list_iter(object):

def __init__(self, list_data):

self.list_data = list_data

self.index = 0

def __iter__(self):

return self

def next(self): #Use __next__ in python 3.x

if self.index < len(self.list_data):

val = self.list_data[self.index]

self.index += 1

return val

else:

raise StopIteration()

我们来用`list_iter`自己定义一个列表迭代器

class List(object):

def __init__(self, val):

self.val = val

def __iter__(self):

return list_iter(self.val)

>>> ls = List([1,2,34])

>>> it = iter(ls)

>>> next(it)

1

>>> next(it)

2

>>> next(it)

34

>>> next(it)

Traceback (most recent call last):

File "", line 1, in

next(it)

File "", line 13, in next

raise StopIteration()

StopIteration

xrange

从一个问题开始——xrange是迭代还是迭代器?

我们来看看

>>> x = xrange(10)

>>> type(x)

几个关键点:

1. `iter(xrange(num))`应该被支持

2. 如果`iter(xrange(num))`返回同样的对象(xrange类型)那xrange就是迭代器

3. 如果`iter(xrange(num))`返回一个迭代器对象那xrange就是迭代

>>> iter(xrange(10))

它返回了rangeiterator,所以我们完全可以叫它迭代器。

让我们用最少的xrange函数实现自己的xrange

xrange_iterator

class xrange_iter(object):

def __init__(self, num):

self.num = num

self.start = 0

def __iter__(self):

return self

def next(self):

if self.start < self.num:

val = self.start

self.start += 1

return val

else:

raise StopIteration()

my xrange

class my_xrange(object):

def __init__(self, num):

self.num = num

def __iter__(self):

return xrange_iter(self.num)

>>> for x in my_xrange(10):

print x,

0 1 2 3 4 5 6 7 8 9

以上就是本文的全部内容,希望对大家学习掌握Python迭代和迭代器有所帮助。

python哪些类型可以作为迭代器_详解Python迭代和迭代器相关推荐

  1. python调用cmd命令释放端口_详解python调用cmd命令三种方法

    目前我使用到的python中执行cmd的方式有三种 使用os.system("cmd") 该方法在调用完shell脚本后,返回一个16位的二进制数,低位为杀死所调用脚本的信号号码, ...

  2. python中什么是可变参数_详解Python的三种可变参数

    详解Python的三种可变参数 可变参数 可变参数应该最简单,在C/C++和Java等语言中都有,就是用*号来表示,例如 def testArg(*arg) 你可以传入任意多个元素(包括0)到参数中, ...

  3. python中list[1啥意思_详解Python中list[::-1]的几种用法

    本文主要介绍了Python中list[::-1]的几种用法,分享给大家,具体如下: s = "abcde" list的[]中有三个参数,用冒号分割 list[param1:para ...

  4. python中有那几种赋值_详解Python列表赋值复制深拷贝及5种浅拷贝

    概述 在列表复制这个问题,看似简单的复制却有着许多的学问,尤其是对新手来说,理所当然的事情却并不如意,比如列表的赋值.复制.浅拷贝.深拷贝等绕口的名词到底有什么区别和作用呢? 列表赋值 # 定义一个新 ...

  5. python正则匹配空格+数字+空格_详解Python中正则匹配TAB及空格的小技巧

    详解Python中正则匹配TAB及空格的小技巧 发布时间:2020-10-15 08:38:48 来源:脚本之家 阅读:94 作者:杰瑞26 在正则中,使用.*可以匹配所有字符,其中.代表除\n外的任 ...

  6. python中yaml模块的使用_详解Python yaml模块

    一.yaml文件介绍 yaml是一个专门用来写配置文件的语言. 1. yaml文件规则 区分大小写: 使用缩进表示层级关系: 使用空格键缩进,而非Tab键缩进 缩进的空格数目不固定,只需要相同层级的元 ...

  7. python中fp是什么意思_详解python实现FP-TREE进行关联规则挖掘(带有FP树显示功能)附源代码下载(3)...

    详解python实现FP-TREE进行关联规则挖掘(带有FP树显示功能)附源代码下载(3) 上一节简单讲了下FP树的生成,在这一节我将描述FP树的挖掘过程. 首先我们回顾一下要挖掘的特征项及样本空间: ...

  8. python中filepath路径怎么写_详解Python中的路径问题

    1. 绝对路径引入 Python 在搜索模块时,依次搜索sys.path里的位置,直到找到模块为止.下面命令可以查看当前的搜索路径: import sys print(sys.path) sys.pa ...

  9. python中for循环怎么打开_详解Python中for循环的使用

    for 循环 本系列前面 "探索 Python,第 5 部分:用 Python 编程" 一文讨论了 if 语句和 while 循环,讨论了复合语句以及适当缩进 Python 语句来 ...

最新文章

  1. 依赖注入?依赖注入是如何实现解耦的?
  2. [译] iOS 开发之新版 APNs 搭建必备知识
  3. Python的基本语法
  4. HTML坦克大战学习02---坦克动起来
  5. VMDNS服务器未响应,vmware克隆虚拟机后进行网络配置
  6. c语言static. volatile,嵌入式系统C语言重点语法const、volatile、static、堆栈等的意义及用法...
  7. redis安装,redis项目以来,redis和spring整合,redis的service,redis的service实现类
  8. 匆匆那年之Java程序员之最近两周的面试总结:
  9. 高并发中,那些不得不说的线程池与ThreadPoolExecutor类
  10. JavaScript中的数字型
  11. [转载] numpy.minimum
  12. springBoot集成dubbo的超时时间设置
  13. 使用wireshark对HTTPS解密
  14. W,b的初始化和几种激活函数
  15. 金蝶14.0系统服务器安装教程,大神面对win7系统安装金蝶kis14.0的方式
  16. HeadFirst设计模式部分源码
  17. 【翻译】Javac骇客指南
  18. 云知声临门一脚不敢踹:科大讯飞指其数据造假,业绩持续增长存疑
  19. 【转】HTML5前端性能优化——浏览器兼容与前端性能优化
  20. 预装Vista的HP华硕笔记本如何安装WinXP

热门文章

  1. Selenium爬携程酒店评论+jieba数据分析实战
  2. 深入Python(3): and、or以及and-or
  3. 部门换届推文文字_【校安协招新】这篇推文不要标题,只要你!
  4. TensorFlow2简单入门-图像加载及预处理
  5. 使用Java API创建(create),查看(describe),列举(list),删除(delete)Kafka主题(Topic)--转载...
  6. LESSON 10.110.210.3 SSE与二分类交叉熵损失函数二分类交叉熵损失函数的pytorch实现多分类交叉熵损失函数
  7. 【特征工程】(未完成)特征选择
  8. Dlib模型人脸特征检测原理及demo
  9. font awesome java_Android使用Font Awesome显示小图标(一)
  10. VirtualBox安装Kali