Python迭代器

迭代器是一个可以记住遍历的位置的对象。

迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束。

迭代器只能往前不会后退。

迭代器有两个基本的方法:iter() 和 next(),且字符串、列表或元组对象都可用于创建迭代器,迭代器对象可以使用常规 for 语句进行遍历,也可以使用 next() 函数来遍历。

具体的实例:

字符创创建迭代器对象

  1. str1 = 'jaybo'
  2.  
  3. iter1 = iter ( str1 )

list对象创建迭代器

  1. list1 = [1,2,3,4]
  2.  
  3. iter2 = iter ( list1 )

3、tuple(元祖) 对象创建迭代器

  1. tuple1 = ( 1,2,3,4 )
  2.  
  3. iter3 = iter ( tuple1 )

for 循环遍历迭代器对象

  1. for x in iter1 :
  2.  
  3. print ( x , end = ' ' )
  4. print('\n------------------------')

next() 函数遍历迭代器

  1. while True :
  2.  
  3. try :
  4.  
  5. print ( next ( iter3 ) )
  6.  
  7. except StopIteration :
  8.  
  9. break

最后输出的结果:

  1. j a y b o
  2.  
  3. 1
  4.  
  5. 2
  6.  
  7. 3
  8.  
  9. 4

list(列表)生成式:

语法为:

  1. [expr for iter_var in iterable]
  2.  
  3. [expr for iter_var in iterable if cond_expr]

第一种语法:首先迭代 iterable 里所有内容,每一次迭代,都把 iterable 里相应内容放到iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

第二种语法:加入了判断语句,只有满足条件的内容才把 iterable 里相应内容放到 iter_var 中,再在表达式中应用该 iter_var 的内容,最后用表达式的计算值生成一个列表。

实例,用一句代码打印九九乘法表:

  1. print('\n'.join([' '.join ('%dx%d=%2d' % (x,y,x*y) for x in range(1,y+1)) for y in range(1,10)]))

输出结果:

  1. 1x1= 1
  2.  
  3. 1x2= 2 2x2= 4
  4.  
  5. 1x3= 3 2x3= 6 3x3= 9
  6.  
  7. 1x4= 4 2x4= 8 3x4=12 4x4=16
  8.  
  9. 1x5= 5 2x5=10 3x5=15 4x5=20 5x5=25
  10.  
  11. 1x6= 6 2x6=12 3x6=18 4x6=24 5x6=30 6x6=36
  12.  
  13. 1x7= 7 2x7=14 3x7=21 4x7=28 5x7=35 6x7=42 7x7=49
  14.  
  15. 1x8= 8 2x8=16 3x8=24 4x8=32 5x8=40 6x8=48 7x8=56 8x8=64
  16.  
  17. 1x9= 9 2x9=18 3x9=27 4x9=36 5x9=45 6x9=54 7x9=63 8x9=72 9x9=81

2 生成器

在 Python 中,使用了 yield 的函数被称为生成器(generator)。

跟普通函数不同的是,生成器是一个返回迭代器的函数,只能用于迭代操作,更简单点理解生成器就是一个迭代器。

在调用生成器运行的过程中,每次遇到 yield 时函数会暂停并保存当前所有的运行信息,返回 yield 的值。并在下一次执行 next() 方法时从当前位置继续运行。

①创建:

生成器的创建:最简单最简单的方法就是把一个列表生成式的 [] 改成 ()

  1. gen= (x * x for x in range(10))
  2.  
  3. print(gen)

输出结果:

  1. generator object at 0x0000000002734A40

创建 List 和 generator 的区别仅在于最外层的 [] 和 () 。但是生成器并不真正创建数字列表, 而是返回一个生成器,这个生成器在每次计算出一个条目后,把这个条目“产生” ( yield ) 出来。 生成器表达式使用了“惰性计算” ( lazy evaluation,也有翻译为“延迟求值”,我以为这种按需调用 call by need 的方式翻译为惰性更好一些),只有在检索时才被赋值( evaluated ),所以在列表比较长的情况下使用内存上更有效。

②以函数形式实现生成器:

其实生成器也是一种迭代器,但是你只能对其迭代一次。这是因为它们并没有把所有的值存在内存中,而是在运行时生成值。你通过遍历来使用它们,要么用一个“for”循环,要么将它们传递给任意可以进行迭代的函数和结构。而且实际运用中,大多数的生成器都是通过函数来实现的。

生成器和函数的不同:

函数是顺序执行,遇到 return 语句或者最后一行函数语句就返回。而变成 generator 的函数,在每次调用 next() 的时候执行,遇到 yield语句返回,再次执行时从上次返回的 yield 语句处继续执行。

举个例子:

  1. def odd():
  2.  
  3. print ( 'step 1' )
  4.  
  5. yield ( 1 )
  6.  
  7. print ( 'step 2' )
  8.  
  9. yield ( 3 )
  10.  
  11. print ( 'step 3' )
  12.  
  13. yield ( 5 )
  14. o = odd()
  15.  
  16. print( next( o ) )
  17.  
  18. print( next( o ) )
  19.  
  20. print( next( o ) )

输出结果:

  1. step 1
  2.  
  3. 1
  4.  
  5. step 2
  6.  
  7. 3
  8.  
  9. step 3
  10.  
  11. 5

可以看到,odd 不是普通函数,而是 generator,在执行过程中,遇到 yield 就中断,下次又继续执行。执行 3 次 yield 后,已经没有 yield 可以执行了,如果你继续打印 print( next( o ) ) ,就会报错的。所以通常在 generator 函数中都要对错误进行捕获。

打印杨辉三角:

  1. def triangles( n ): # 杨辉三角形
  2.  
  3. L = [1]
  4.  
  5. while True:
  6.  
  7. yield L
  8.  
  9. L.append(0)
  10.  
  11. L = [ L [ i -1 ] + L [ i ] for i in range (len(L))]
  12. n= 0
  13.  
  14. for t in triangles( 10 ): # 直接修改函数名即可运行
  15.  
  16. print(t)
  17.  
  18. n = n + 1
  19.  
  20. if n == 10:
  21.  
  22. break

输出结果:

  1. [1]
  2.  
  3. [1, 1]
  4.  
  5. [1, 2, 1]
  6.  
  7. [1, 3, 3, 1]
  8.  
  9. [1, 4, 6, 4, 1]
  10.  
  11. [1, 5, 10, 10, 5, 1]
  12.  
  13. [1, 6, 15, 20, 15, 6, 1]
  14.  
  15. [1, 7, 21, 35, 35, 21, 7, 1]
  16.  
  17. [1, 8, 28, 56, 70, 56, 28, 8, 1]
  18.  
  19. [1, 9, 36, 84, 126, 126, 84, 36, 9, 1]

3 延伸

①反向迭代

使用 Python 中有内置的函数 reversed()。

要注意一点就是:反向迭代仅仅当对象的大小可预先确定或者对象实现了 reversed() 的特殊方法时才能生效。 如果两者都不符合,那你必须先将对象转换为一个列表才行。

②同时迭代多个序列

为了同时迭代多个序列,使用 zip() 函数,具体示例:

  1. names = ['jaychou', 'zjl', '周杰伦']
  2.  
  3. ages = [18, 19, 20]
  4.  
  5. for name, age in zip(names, ages):
  6.  
  7. print(name,age)

输出的结果:

  1. jaychou 18
  2.  
  3. zjl 19
  4.  
  5. 周杰伦 20

其实 zip(a, b) 会生成一个可返回元组 (x, y) 的迭代器,其中 x 来自 a,y 来自 b。 一旦其中某个序列到底结尾,迭代宣告结束。 因此迭代长度跟参数中最短序列长度一致。注意理解这句话,也就是说如果 a , b 的长度不一致的话,以最短的为标准,遍历完后就结束。加V:mmp9972 小编准备了一份2018年最新Python入门教程资料,都会发给大家的~

Python基础入门(迭代器和生成器)的更多相关文章

  1. Python基础之迭代器和生成器

    阅读目录 楔子 python中的for循环 可迭代协议 迭代器协议 为什么要有for循环 初识生成器 生成器函数 列表推导式和生成器表达式 本章小结 生成器相关的面试题 返回顶部 楔子 假如我现在有一 ...

  2. python基础8 -----迭代器和生成器

    迭代器和生成器 一.迭代器 1.迭代器协议指的是对象必须提供一个next方法,执行该方法要么返回迭代中的下一项,要么就引起一个StopIteration异常,以终止迭代 (只能往后走不能往前退) 2. ...

  3. 【Python基础】迭代器、生成器

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

  4. 1.17 Python基础知识 - 迭代器和生成器初识

    可循环迭代的对象称为可迭代对象,迭代器和生成器函数是可迭代对象. 列表解析表达式:可以简单高效处理一个可迭代对象,并生成结果列表 示例代码: [ i ** 2 for i in range(10) ] ...

  5. Python高手之路【九】python基础之迭代器与生成器

    迭代器与生成器 1.迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退.另外 ...

  6. python 基础(五) 迭代器与生成器

    迭代器和生成器 迭代器 iterator (1) 迭代对象: 可以直接作用于for循环的 称为可迭代对象(iterable)可以通过 isinstance 判断是否属于可迭代对象 可以直接作用于for ...

  7. python基础之迭代器、生成器、装饰器

    一.列表生成式 a = [0,1,2,3,4,5,6,7,8,9] b = [] for i in a: b.append(i+1) print(b) a = b print(a) --------- ...

  8. Python基础之迭代器、生成器

    一.迭代器: 1.迭代:每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值.例如:循环获取容器中的元素. 2.可迭代对象(iterable): 1)定义:具有__ite ...

  9. python基础之迭代器与生成器

    一.什么是迭代器: 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束. 迭代器是一个可以记住遍历的位置的对象. 迭代器的 ...

  10. 7th,Python基础4——迭代器、生成器、装饰器、Json&pickle数据序列化、软件目录结构规范

    1.列表生成式,迭代器&生成器 要求把列表[0,1,2,3,4,5,6,7,8,9]里面的每个值都加1,如何实现? 匿名函数实现: a = map(lambda x:x+1, a) for i ...

随机推荐

  1. PAT——1019. 数字黑洞

    给定任一个各位数字不完全相同的4位正整数,如果我们先把4个数字按非递增排序,再按非递减排序,然后用第1个数字减第2个数字,将得到一个新的数字.一直重复这样做,我们很快会停在有“数字黑洞”之称的6174 ...

  2. iOS App占用太多磁盘空间

    问题:随着App的不断运行,发现所占磁盘空间越来越大 分析:应该是网络下载中的缓存,包括利用SDWebImage产生的.和下载单个文件被取消后的缓存 验证:查看App目录中的Tmp(系统存放未下载完成 ...

  3. 嵌入式STM32开发环境之Keil5的安装(附资源)--

    全文copy,原文见https://blog.csdn.net/weixin_42602730/article/details/81007685 --------------------------- ...

  4. Scala相关笔记

    一.Scala概述以及安装 1.   什么是Scala Scala 是一种多范式的编程语言,其设计的初衷是要集成面向对象编程和函数式编程的各种特性.Scala 运行于 Java 平台(Java 虚拟机 ...

  5. transfrom、transition、animation区别

    transfrom transform是静态属性,非动画属性,和margin-left.margin-top类似. translate:平移,类似position:relative;translate ...

  6. TCP/IP协议中的UDP与TCP的区别

    TCP面向连接,UDP面向非连接即发送数据前不需要建立链接TCP提供可靠的服务(数据传输),UDP无法保证,它没有TCP的接受确认.窗口等机制,因此也不需要交换控制信息:发生丢包也一概不负责.TCP面 ...

  7. C语言下的错误处理问题

    今天来分享我认为比较好的几种在C语言下的错误处理方式 方式一: int example(int num) { ) { ; } ; } 在不符合条件的情况下使用return终止程序 方式二: void ...

  8. 2018年数学建模国赛B题 智能RGV的动态调度策略

    第一种情况大致思路: 每秒判断各个CNC的状态,若工作完成或者是出于空闲状态下则向RGV发出一个请求.同时,RGV每秒判断自己的状态(上下料.移动.闲置.清洗等),如果是处于闲置状态,则启用调度算法, ...

  9. vue 解决跨域问题

    1.后端处理允许跨域 2.反向代理跨域 代理服务器英文全称是Proxy Server,其功能就是代理网络用户去去的网络信息.形象的说:它是网络信息的中转站. vue中设置代理: 1.config/in ...

  10. sourcetree的安装及使用

    sourcetree下载地址:https://www.sourcetreeapp.com/ 点击安装包安装 此前需要跳转到bitbucket登录,我没有账号,所以我直接跳转到到https://bitb ...