自学Python之路-Python基础+模块+面向对象
自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django

自学Python4.6 - 迭代器

之前所讲的可以使用for循环:

  • list
  • dic
  • str
  • set
  • tuple
  • f = open()
  • range()
  • enumerate  枚举
print(dir([]))  告诉我们列表拥有的所有方法 ,  其中有双下划线的为双下方法
print(dir(""))  告诉我们字符串拥有的所有方法 

print([1].__add__([2]))
print([1]+[2]) # 同以上,python内部算法执行就是_add_

  

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

迭代器只能往前不会后退,不过这也没什么, 因为人们很少在迭代途中往后退。

另外,迭代器的一大优点是不要求事先准备好整个迭代过程中所有的元素。

迭代器仅仅在迭代到某个元素时才计算该元素,而在这之前或之后,元素可以不存在或者被销毁。这个特点使得它特别适合用于遍历一些巨大的或是无限的集合,比如几个G的文件(cat就是迭代器形式,读一行显示一行)

特点:

  • 访问者不需要关心迭代器内部的结构,仅需通过_nex_t()方法不断去取下一个内容;
  • 不能随机访问集合中的某个值 ,只能从头到尾依次访问,且只能取所有数据取一次;
  • 访问到一半时不能往回退;
  • 便于循环比较大的数据集合,节省内存空间
      (迭代器并不会在内存中占用一大块内存,而是随着循坏每次生成一个,每次_next_()每次提供一个)

1. 生成一个迭代器(在Python3.0中)

others = iter(['carlos','gary','tong','rain']) #iter代表生成的是个迭代器
print(others) #输出结果为<list_iterator object at 0x01E96650>表示为迭代器
print(others.__next__())
print(others.__next__())
print(others.__next__())
print(others.__next__()) # 迭代器只有4个元素,如果超过迭代器元素的数量继续迭代的话,它会自动返回“StopIteration”的信息

输出:

carlos
gary
tong
rain

2. for在iter迭代器中的实例(利用for 循环取出iter中每个元素)

obj = iter([11,22,33,44,55,66,77,88,99,90])
for n in obj: #利用for 循环取出iter中每个元素。
print(n)

输出:

11
22
33
44
55
66
77
88
99
90

3. 迭代器的循环可以避开索引,但有时候需要索引来进行一些操作。内建函数enumerate,它能在iter函数的结果前加上索引,以元组返回。

obj =iter(['carlos','gary','jack','rain'])
for i in enumerate(obj):
print(i)

输出:

(0, 'carlos')
(1, 'gary')
(2, 'jack')
(3, 'rain')

4. while 在iter函数中应用

obj = iter([11,22,33,44,55,66,77,88,99,90])
while True: #while循环的话判断为真,赋一个变量。然后把每次通过obj.__next__()的结果赋值给变量打印出来。当循环超过iter中的值后条件就为Talse,那么就会报StopIteration的错误
val = obj.__next__()
print(val)

输出:

11
22
33
44
55
66
77
88
99
90
Traceback (most recent call last):
File "D:/PyCharm Community Edition 2016.3.2/aaaa.py", line 20, in <module>
val = obj.__next__()
StopIteration

5. 分析迭代器内存开销

#把文件一次加载到内存中,然后逐行打印。当文件很大时,这个方法的内存开销就很大了 * /
for line in open("test.txt").readlines():
print
line
#这是最简单也是运行速度最快的写法,他并没显式的读取文件,而是利用迭代器每次读取下一行 * /
for line in open("test.txt"): # use file iterators
print
line

补充:

  • 迭代器双下方法 : 很少直接调用的方法。一般情况下,是通过其他语法触发的;
  • 可迭代协议:只要含有有__iter__的方法 '__iter__' in dir(数据)都是可迭代的;
  • 迭代器协议: 只要内部含有__iter__和__next__方法就是迭代器协议;
  • 迭代器一定可迭代,可迭代的通过调用._iter_()方法就能得到一个迭代器;
  • 迭代器中的_next_()方法可以一个一个的获取值;
  • 可迭代的一定可以被for循环(for循环其实就是在使用迭代器)。

自学Python4.2 迭代器、生成器的更多相关文章

  1. 自学Python4.6-迭代器

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  2. 自学Python4.8-生成器(方式二:生成器表达式)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  3. 自学Python4.7-生成器(方式一:生成器函数)

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  4. 自学Python4.9-生成器举例

    自学Python之路-Python基础+模块+面向对象自学Python之路-Python网络编程自学Python之路-Python并发编程+数据库+前端自学Python之路-django 自学Pyth ...

  5. Python(四)装饰器、迭代器&生成器、re正则表达式、字符串格式化

    本章内容: 装饰器 迭代器 & 生成器 re 正则表达式 字符串格式化 装饰器 装饰器是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志.性能测试.事务处理等.装饰器是解 ...

  6. Python 迭代器&生成器

    1.内置参数     Built-in Functions     abs() dict() help() min() setattr() all() dir() hex() next() slice ...

  7. python杂记-4(迭代器&生成器)

    #!/usr/bin/env python# -*- coding: utf-8 -*-#1.迭代器&生成器#生成器#正确的方法是使用for循环,因为generator也是可迭代对象:g = ...

  8. Python学习笔记——基础篇【第四周】——迭代器&生成器、装饰器、递归、算法、正则表达式

    目录 1.迭代器&生成器 2.装饰器 a.基本装饰器 b.多参数装饰器 3.递归 4.算法基础:二分查找.二维数组转换 5.正则表达式 6.常用模块学习 #作业:计算器开发 a.实现加减成熟及 ...

  9. 自学Python4.1-文件操作

    文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 关闭文件(非必须) 一.打开文件 open('文件路径', '模式')      打开文件时,需要指定文件路径和以何等方式打开文件,打 ...

随机推荐

  1. Python中的三种数据结构

    Python中,有3种内建的数据结构:列表.元组和字典.1.列表     list是处理一组有序项目的数据结构,即你可以在一个列表中存储一个序列的项目.列表中的项目.列表中的项目应该包括在方括号中,这 ...

  2. Knowledge_SPA——精研查找算法

    首先保证这一篇分析查找算法的文章,气质与大部分搜索引擎搜索到的文章不同,主要体现在代码上面,会更加高级,会结合到很多之前研究过的内容,例如设计模式,泛型等.这也与我的上一篇面向程序员编程--精研排序算 ...

  3. 《Linux命令行与shell脚本编程大全》第九章 安装软件程序

    包管理系统(PMS):用来进行软件安装.管理和删除的命令行工具 9.1包管理基础 1.主流的Linux发行版都采用了某种形式的包管理系统来控制软件和库的安装 2.PMS用一个数据库来记录:系统上安装了 ...

  4. Python学习一:序列基础详解

    作者:NiceCui 本文谢绝转载,如需转载需征得作者本人同意,谢谢. 本文链接:http://www.cnblogs.com/NiceCui/p/7858473.html 邮箱:moyi@moyib ...

  5. Getting Started With setuptools and setup.py

    https://pythonhosted.org/an_example_pypi_project/setuptools.html http://www.ianbicking.org/docs/setu ...

  6. Kafka设计解析(八)- Exactly Once语义与事务机制原理

    原创文章,首发自作者个人博客,转载请务必将下面这段话置于文章开头处. 本文转发自技术世界,原文链接 http://www.jasongj.com/kafka/transaction/ 写在前面的话 本 ...

  7. redis字符串结构

    1.字符串SDS struct sdshdr { // buf 已占用长度 int len; // buf 剩余可用长度 int free; // 实际保存字符串数据的地方 // 利用c99(C99 ...

  8. 树莓派远程桌面配置-开机自启SSH

    必须先安装tightvncserver sudo apt-get install tightvncserver 再安装xrdp服务. sudo apt-get install xrdp 如果开着防火墙 ...

  9. javascript权威指南pdf

    链接:https://pan.baidu.com/s/1c19qfSk 密码:j4f3

  10. 基于 HTML5 Canvas 的 3D 模型贴图问题

    之前注意到的一个例子,但是一直没有沉下心来看这个例子到底有什么优点,总觉得就是一个 list 列表,也不知道右边的 3d 场景放两个节点是要干嘛,今天突然想起来就仔细地看了一下这个例子的代码,实际操作 ...