迭代

通常意义上的迭代是指:重复执行一系列运算,从前面的量依次推出后面的量的过程,每一次迭代的结果,会作为下一次迭代的初始值。

在c、c++、java等编程语言中的for循环语句,就是一个迭代过程,例如:

for(int i=;i<;i++)
{
  cout << i << endl;
}

这种for循环语句比较符合迭代的含义,for语句中给定了一个初始输入 i=0 ,然后开始执行一个重复推导变量 i 是否小于 100 ,如果小于就对 i 加1并执行循环体中代码的过程,且每次执行后的结果将作为下一次推导的输入值,这个过程就是迭代。

python中,也使用了 for 关键字来实现类似过程,具体形式为 for ... in ... ,当然迭代过程也可以通过while循环语句等来实现,但不在本文讨论范畴,这里不做说明。在python中通常使用 for ... in ... 的形式来遍历一个list或tuple等对象,这种遍历过程,通常称为迭代(Iteration)。例如:

上图中,通过for语句来遍历列表L,实现语句块的重复执行过程。这里之所以每次迭代时都让num的值加3,是为了说明语句块中对num进行修改后的值并不会带入到下一次迭代过程,这里应注意与C、C++、java等语言的for循环语句的区别。至于为什么是这样,可以查阅python语法中for语句的执行原理,这里不再详述。

可迭代对象与迭代器

可迭代对象:使用内置iter函数可以获取迭代器的对象,称为可迭代对象。通常指实现了能返回迭代器的__iter__方法或实现了__getitem__方法且其参数从0开始索引的对象。

迭代器:指实现了无参数的__next__方法的对象。__next__方法返回序列中的下一个元素;如果没有元素了,则抛出StopIteration异常。通常情况下,迭代器也应该实现__iter__方法,迭代器的__iter__方法应该返回其自身(self),因为实现了__iter__方法,所以迭代器可迭代。

区别与联系:迭代器可以迭代,但可迭代对象不是迭代器。可迭代对象一定不能是自身的迭代器,即可迭代对象一定不能实现__next__方法;迭代器应该一直可以迭代,其__iter__方法应该返回自身;可迭代对象可以重复使用(可以不断生成新的迭代器),但迭代器只能用一次,迭代结束后不会自动重置。示例:

class IteratorObj:

    def __init__(self, max):
self.a = 0
self.b = 1
self.max = max def __iter__(self):
return self def __next__(self):
self.a, self.b = self.b, self.a + self.b
if self.a > self.max:
raise StopIteration()
return self.a class IterableObj: def __init__(self, max):
self.max = max def __iter__(self):
return IteratorObj(self.max)

python中for循环遍历的本质就是调用遍历对象的__iter__方法,得到一个迭代器,再调用迭代器的__next__方法依次获取对象的值并自动捕获StopIteration异常。

生成器

生成器是一种特殊的迭代器,可通过使用迭代器的方法使用生成器。

python定义生成器的方法有两种:

生成器函数:使用普通函数的定义语法定义,但函数体内必须包含yield关键字,即包含yield语句的函数都被称为生成器。生成器函数虽然看上去像函数,但与函数的行为截然不同。区别在于生成器函数不是使用return语句返回一个值,而是可以生成多个值,每次生成一个。每次使用yield生成一个值后,函数被中断,在此处停止执行,再次被调用时,函数将从上一次停止的地方开始继续执行。例如:

注意:当生成器因没有可生产的值退出时,同样会抛出StopIteration异常。

生成器表达式:类似于列表推导,只不过要将列表推导中的[]换成()。例如:

上图中,当第6次调用next(g)时,因没有值可生产而抛出了StopIteration异常。

以上。

python迭代、可迭代对象、迭代器及生成器的更多相关文章

  1. python编程系列---可迭代对象,迭代器和生成器详解

    一.三者在代码上的特征 1.有__iter__方法的对象就是可迭代类(对象) 2.有__iter__方法,__next()方法的对象就是迭代器3.生成器 == 函数+yield 生成器属于迭代器, 迭 ...

  2. 15.python的for循环与迭代器、生成器

    在前面学习讲完while循环之后,现在终于要将for循环这个坑填上了.之所以拖到现在是因为for循环对前面讲过的序列.字典.集合都是有效的,讲完前面的内容再来讲for循环会更加容易上手. 首先,for ...

  3. python全栈开发-Day11 迭代器、生成器、面向过程编程

    一. 迭代器 一 .迭代的概念 迭代器即迭代的工具,那什么是迭代呢? 迭代是一个重复的过程,每次重复即一次迭代,并且每次迭代的结果都是下一次迭代的初始值 while True: #只是单纯地重复,因而 ...

  4. Python编程四大神兽:迭代器、生成器、闭包和装饰器

    生成器 生成器是生成一个值的特殊函数,它具有这样一个特点:第一次执行该函数时,先从头按顺序执行,在碰到yield关键字时该函数会暂停执行该函数后续的代码,并且返回一个值:在下一次调用该函数执行时,程序 ...

  5. python基础15上_迭代器_生成器

    # 迭代器和生成器 # 迭代器: # 双下方法 : 很少直接调用的方法.一般情况下,是通过其他语法触发的 # 可迭代的 —— 可迭代协议 含有__iter__的方法('__iter__' in dir ...

  6. Py修行路 python基础 (十一)迭代器 与 生成器

    一.什么是迭代? 迭代通俗的讲就是一个遍历重复的过程. 维基百科中 迭代(Iteration) 的一个通用概念是:重复某个过程的行为,这个过程中的每次重复称为一次迭代.具体对应到Python编程中就是 ...

  7. Python之装饰器、迭代器和生成器

    在学习python的时候,三大“名器”对没有其他语言编程经验的人来说,应该算是一个小难点,本次博客就博主自己对装饰器.迭代器和生成器理解进行解释. 为什么要使用装饰器 什么是装饰器?“装饰”从字面意思 ...

  8. Python基础(8)迭代器、生成器

    一 什么是迭代 1 重复 2 下一次重复是基于上一次的结果 # while True: # cmd=input('>>: ') # print(cmd) # l=['a','b','c', ...

  9. Python 基础 内置函数 迭代器与生成器

    今天就来介绍一下内置函数和迭代器 .生成器相关的知识 一.内置函数:就是Python为我们提供的直接可以使用的函数. 简单介绍几个自己认为比较重要的 1.#1.eval函数:(可以把文件中每行中的数据 ...

  10. python基础15下_迭代器_生成器

    print(dir([])) #告诉我列表拥有的所有方法 # 双下方法 # print([1].__add__([2])) print([1]+[2]) ret = set(dir([]))& ...

随机推荐

  1. sqlserver 2005范例代码查询辞典文摘

    第1章 select 1.显示指定想要获取的列要比使用select *更好 2.where not m.MemberCode = 1000 3.select * into aaa from Membe ...

  2. C# 释放资源的规范写法

    static class CSharp_3 { /* ---------------------------------------- * 以下学习资源的释放:IDispose和析构函数 * 1.ID ...

  3. SuSE Linux上修改主机名

    1) 临时修改主机名 临时修改使用hostname即可,格式为:hostname 新主机名.Hostname命令除可以临时修改主机名外,还可以用它来查看主机名,不带参数执行它,即为查看主机名. 2)  ...

  4. SSH整合案例

    1.Hibernate框架 Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,它将POJO与数据库表建立映射关系,是一个全自动的orm框架,hibernat ...

  5. 盒子模型 以及CSS的box-sizing属性。

    盒子模型有两种 一种是 内容盒子模型 一种是边框盒子模型. 内容盒子模型(标准盒子模型)由width和height中指定的元素的尺寸不包括内边距和边框 仅是指的内容的实际尺寸: 网上搜索了两张配图不错 ...

  6. 简述各大 Linux 发行版,有主观,不完全,望见谅

    只罗列当前热门的linux发行版 更多关于 Linux 以及 Linux 衍生版的内容可以参阅 中文wiki Debian 系 Debian:开源社区的代表性 linux 系统,每2年一次更新,现在的 ...

  7. vs2008编译opencv,不能copy CMakeVSMacros2.vsmacros

    由于学习opencv,要查看源码文件,所以要先对opencv进行编译,可悲的是出错了 “不能copy   CMakeVSMacros2.vsmacros” 通过上网查找资料,之所以出现这种情况,是因为 ...

  8. C# 字符,字符串和文本处理。

    1. 字符: 在.net中 字符是表示成16为Unicode代码值.每个字符都是System.Char结构(一个值类型)的实例. public class StringTempte { public ...

  9. TSQL--可以在触发器中使用COMMIT吗?

    很多场景中,我们使用触发器来回滚一些不满足业务逻辑的修改,这没有问题,问题是我能在触发器中提交事务吗? 这个问题很小白,当也来测试一下 /*测试中创建三种表,对表 TB2 插入时触发触发器,在触发器中 ...

  10. UWA发布 | 2017 Unity手游体检蓝皮书 — ARPG篇

    报告目录: 一.ARPG手游总体性能开销分析 二.ARPG手游CPU模块性能开销分析 三.ARPG手游内存模块性能开销分析 四.ARPG手游资源管理分析 五.UWA对于ARPG手游研发团队的建议 一. ...