迭代器(iterator)和可迭代对象(iterable)

  在python中,要实现要个对象可以进行遍历,也就是实现for循环,那么他必须是一个可迭代对象,例如string,tuple,list,dict,set都是可迭代对象(iterable),实现的方法是写入了__iter__()函数,前面我们说过鸭子模型,只要实现了这个方法,那么自定义类就可以看成是 一个可迭代对象。如果我们想要实现一个迭代器,那么我们就要实现写入__next__()方法,举个例子要把list迭代对象转变成迭代器,我们有两种方法让他转变为迭代器,一种就是直接用内置函数iter(),或者自定义类,重写__next__()方法。

  自定义实现类实现for循环功能:

  class A:

    pass

  a = A()

  for i in a:

    print(i)   #打印结果:'A' object is not iterable   报错,说明他不是可迭代对象

  首先我们要让他是一个可迭代对象:

  class A:

    def __iter__(self):

      pass

  a = A()

  for i in a:

    print(i)  #打印结果:还是报错

  我们为什么实现了__iter__()把对象变成可迭代对象,怎么还不能使用for循环,我们需要知道,我们执行for循环的时候,他会去找__next__()方法,我们自定义的方法中没有实现__next__(),那么我们实现一下

  class A:

    def __iter__(self):

      self.a = 1

      return self   #这里必须返回自身的实例

    def __next__(self):

      a = self.a

      if a < 10:

        self.a += 1

      else:

        self.a = 1    #重新赋值并结束循环

        raise StopIteration

      return a

  a = A()

  for i in a:

    print(a)   # 打印结果:1 2 3 4 5 6 7 8 9

  这样我们便实现了自定义类实现for循环功能,同时由于他实现了__next__()方法,他本身就是一个迭代器。

  用iter()转化为迭代器

  l = [1,2]

  for i in l: 

    print(i)

  l = iter(l)

  print(l)  #打印结果:<list_iterator object at 0x000000000256C128>   我们发现然是一个新的对象,不再是list了,同时他也成为了一个迭代器

  print(next(l))  # 打印结果:1

  print(next(l))  # 打印结果:2

  print(next(l))  #打印结果:报错

  我们可以看到迭代器我们可以用next(l)只会一步一步去找下一个,那么我们什么时候能用到迭代器呢?我们执行for循环会把所有的结果都查找到并使用,那么会造成内存浪费。我们发现当我们不知道确定的对象数量的时候,迭代器就很好使用了,也能使用next()找下一个数。我们实现的for循环必须有一个界限值,不然电脑会奔溃。

  总结:内置iterable对象可以使用for循环,iterator对象可以使用next()方法,自定义类__iter__()和__next__()必须都实现才能使用for循环,那么自定义类本身就是一个迭代器了

生成器的使用

  def B():

    for i in range(3):

      yield i

  b = B()

  print(b)  #一个生成器

  for i in b:

    print(i)  #打印结果:0,1,2

  for i in b:

    print(i)  # 打印结果:  空的

  为什么第二次for循环后不打印任何东西了?生成器在执行完后不会从新给定值,它只生产出之后就完成了自己的使命,我们可以说生成器就是一种特殊的迭代器。

python内置函数的使用(一)的更多相关文章

  1. python内置函数

    python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...

  2. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

  3. Python基础篇【第2篇】: Python内置函数(一)

    Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...

  4. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

  5. Python内置函数进制转换的用法

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x)Convert an integer numb ...

  6. Python内置函数(12)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string  ...

  7. Python内置函数(61)——str

    英文文档: class str(object='') class str(object=b'', encoding='utf-8', errors='strict') Return a string ...

  8. 那些年,很多人没看懂的Python内置函数

    Python之所以特别的简单就是因为有很多的内置函数是在你的程序"运行之前"就已经帮你运行好了,所以,可以用这个的特性简化很多的步骤.这也是让Python语言变得特别的简单的原因之 ...

  9. Python 内置函数笔记

    其中有几个方法没怎么用过, 所以没整理到 Python内置函数 abs(a) 返回a的绝对值.该参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 all(a) 如果元组.列表里面的所有元素都非 ...

  10. 【转】实习小记-python 内置函数__eq__函数引发的探索

    [转]实习小记-python 内置函数__eq__函数引发的探索 乱写__eq__会发生啥?请看代码.. >>> class A: ... def __eq__(self, othe ...

随机推荐

  1. JS基础-作用域

    作用域相关问题 下面的代码打印什么内容,为什么? // 情况 1 // 情况 2 var b = 10; var c = function b() { b = 20; console.log(b) } ...

  2. 阿里云linux镜像发布web项目时候 tomcat与域名映射

    tomcat 与 域名映射 一  准备工作: 阿里云服务器Linux镜像 及 域名备案和将域名解析至服务器,通过<暂不说,网上一大把或者参考阿里官方实例手册> 在Linux镜像中安装tom ...

  3. com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details

    1.错误显示 com.android.tools.aapt2.Aapt2Exception: AAPT2 error: check logs for details log提示:Generate Si ...

  4. 用百度大脑技术让AI做回新闻主播!

    实现效果: 利用百度新闻摘要能力和微信小程序,快速抽取新闻摘要内容并进行语音播报,让AI做回新闻主播!本文主要介绍小程序功能开发实现过程,分享主要功能实现的子程序模块,都是干货哦!! 想了解pytho ...

  5. 管道及 I/O 重定向

    I/O重定向 I/O Redirection 标准输入.标准输出.标准错误输出重定向及综合案例输入重定向及结合案例 标准输入.标准输出.标准错误 file descriptors (FD,文件描述符 ...

  6. linux 动态链接库查找方法;查找动态链接库位置; LIBRARY_PATH 和 LD_LIBRARY_PATH 的区别;LD_LIBRARY_PATH and LD_RUN_PATH的区别;

    今天配置之前项目的时候,发现有些动态链接库变了,想看看现在应用在使用哪些动态链接库的时候,进一步查了点资料: 下面针对linux动态链接库查找方法和动态链接库位置配置的过程进行记录: LIBRARY_ ...

  7. 关于css布局的记录(一) --table和flex布局

    1.table方式布局 效果图: 直接用table等标签布局,table布局自动垂直居中 亦可用 display:table == <table>.display:table-cell = ...

  8. IT兄弟连 HTML5教程 Media Queries的使用方法

    在上例中,我们使用Media Queries模块来根据3种不同尺寸的窗口使用3种不同的样式.通过不同的媒体类型和条件定义样式表规则,媒体查询让CSS可以更精确地作用于不同的媒体类型和同一媒体的不同条件 ...

  9. C语言笔记 02_基本语法&数据类型&变量

    基本语法 令牌 C 程序由各种令牌组成,令牌可以是关键字.标识符.常量.字符串值,或者是一个符号.例如,下面的 C 语句包括五个令牌: printf("Hello, World! \n&qu ...

  10. Java题库——Chapter14 JavaFX基础

    Chapter 14 JavaFX Basics Section 14.2 JavaFX vs Swing and AWT1. Why is JavaFX preferred?a. JavaFX is ...