一.简单介绍

直接作用于for循环的数据类型有以下几种:

  • 集合数据类型:

    list 例如:list = ["yuhaohao", "lisheng", "huang"]

    tuple 例如:tuple = ("yuhaohao", "lisheng", 18, 29)

    dict 例如:dict = {"yushengyin": 18, "lisheng": 20}

    set 例如:set = set(['yuhaohao', "lisheng"])

    str 例如:str = "yuhaohao"
  • generator

    包括生成器和带yield的generator function

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

二.可迭代对象的判断

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

  1. [root@openstack01 python]# vi instance.py
  2. #!/usr/bin/python
  3. from collections import Iterable
  4. list_1 = ["yuhaohao", "lisheng"]
  5. print isinstance(list_1, Iterable)
  6. [root@openstack01 python]# python instance.py
  7. True

三.生成器的介绍

生成器不但可以作用于for循环,还可以被next()函数不断调用,并返回下一个值,直到最后抛出StopIteration错误,无法继续返回下一个值了。可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

  • 迭代器的判断

    可以使用isinstance()判断一个对象是否是Iterator对象
  1. >>> isinstance((x for x in range(10)), Iterator)
  2. True
  3. >>> isinstance([], Iterator)
  4. False
  5. >>> isinstance({}, Iterator)
  6. False
  7. >>> isinstance('abc', Iterator)
  8. False
  9. >>>

生成器都是Iterable对象,但是list,dict,str虽然是Iterable,却不是Iterator

四.Iterable转化Iterator方法

把list,dict,str等Iterable变成Iterator可以使用iter()函数

  1. >>> from collections import Iterator
  2. >>> isinstance(iter([]), Iterator)
  3. True
  4. >>> isinstance(iter('abc'), Iterator)
  5. True
  • 为什么list,dict,str等数据类型不是Iterator?
  1. 因为pythonIterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列。但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据。所以Iterator的计算是惰性的,只有在需要返回下一个数据时,它才会计算。
  2. Iterator甚至可以表示一个无限大的数据流,例如全体自然数,而用list是永远不可能存储全体自然数的

python中的for循环本质上就是不断调用next()函数实现的,例如:

  1. for x in [1, 2, 3, 4, 5]:
  2. print x
  3. pass

等价于

  1. ite = iter(['yushengyin', 'lijing', 'yuhaohao'])
  2. while True:
  3. try:
  4. x = next(ite)
  5. print x
  6. except StopIteration:
  7. break

Python编程高级特性--迭代器的更多相关文章

  1. python的高级特性:切片,迭代,列表生成式,生成器,迭代器

    python的高级特性:切片,迭代,列表生成式,生成器,迭代器 #演示切片 k="abcdefghijklmnopqrstuvwxyz" #取前5个元素 k[0:5] k[:5] ...

  2. Python的高级特性7:闭包和装饰器

    本节跟第三节关系密切,最好放在一起来看:python的高级特性3:神奇的__call__与返回函数 一.闭包:闭包不好解释,只能先看下面这个例子: In [23]: def outer(part1): ...

  3. Python的高级特性8:你真的了解类,对象,实例,方法吗

    Python的高级特性1-7系列是本人从Python2过渡3时写下的一些个人见解(不敢说一定对),接下来的系列主要会以类级为主. 类,对象,实例,方法是几个面向对象的几个基本概念,其实我觉得很多人并不 ...

  4. Python的高级特性(切片,迭代,生成器,迭代器)

    掌握了python的数据类型,语句和函数,基本上就可以编出很多有用的程序了. 但是在python中,并不是代码越多越好,代码不是越复杂越好,而是越简单越好. 基于这个思想,就引申出python的一些高 ...

  5. Python面向对象编程高级特性

    ***这里还是根据网上资料,主要是廖雪峰老师的教程学习的笔记,主要介绍python面向对象的高级特性,笔记不全,只是记录自己觉得容易出错的地方*** 1.python作为一种动态语言,他的动态绑定机制 ...

  6. Python高级特性——迭代器

    可以直接用for循环的数据类型有: 集合数据类型,如:list.tuple.dict.set.str等: 生成器generator,包括生成器和带yield的generator function. 以 ...

  7. Learning Python 011 高级特性 2

    Python 高级特性 2 列表生成式 列表生成式就是指类似这样的代码:[x for x in range(1, 11)] >>> L = [x for x in range(1, ...

  8. python函数高级特性

    掌握了Python的数据类型.语句.函数,基本可以编写出很多有用的程序了.但是Python中,代码不是越多越好,而是越少越好.代码不是越复杂越好,而是越简单越好.基于这一思想,我们来介绍python中 ...

  9. Learning Python 011 高级特性 1

    Python 高级特性 1 切片 将L = ['Michael', 'Sarah', 'Tracy', 'Bob', 'Jack']列表中前上个3个元素: L = ['Michael', 'Sarah ...

随机推荐

  1. Codeforces Round #505 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final)

    A : A. Doggo Recoloring time limit per test 1 second memory limit per test 256 megabytes input stand ...

  2. python 使用函数参数注解

    使用函数参数注解是一个很好的办法,它能提示程序员应该怎样正确使用这个函数. 函数注解只存储在函数的annotations 属性中

  3. Eclipse Decompiler不生效解决办法

    如下图,解决方案,Preferences->General->Editors->File Associations->*.class->Decompiler->De ...

  4. Linux基础命令---sysctl修改内核参数

    sysctl sysctl指令用来修改正在运行的内核参数,可以修改的参数都保存在/proc/sys/目录中,修改会立即生效.Linux中的sysctl支持需要Procfs.您可以使用sysctl来读取 ...

  5. 改变FileUpload文件上传控件的显示方式,选择文件后自动上传

    一.Aspx页面: <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="File ...

  6. 51Nod 1185 威佐夫游戏 V2

    有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数量的石子,但不可不取.拿到最后1颗石子的人获胜.假设A B都非常聪明,拿石子的过程中不会出现失误.给出2堆石子的数量, ...

  7. 关于mysql触发器和存储过程的理解

    内容源自:一篇很棒的 MySQL 触发器学习教程 一.触发器概念 触发器(trigger):监视某种情况,并触发某种操作,它是提供给程序员和数据分析员来保证数据完整性的一种方法,它是与表事件相关的特殊 ...

  8. Html lable 标签

    Html lable 标签 <html> <body> <!-- label 关联光标标签,点击文字使得关联的标签获取光标.for="username" ...

  9. HTTP的简单的解析

    HTTP 中文全称为超文本传输协议是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途 ...

  10. Codeforces 939C - Convenient For Everybody

    2018-03-03 http://codeforces.com/problemset/problem/939/C C. Convenient For Everybody time limit per ...