python学习-day6-迭代器(iterator)

我们已经知道,可以直接作用于for循环的数据类型有以下几种:

一类是集合数据类型,如listtupledictsetstr等;

一类是generator,包括生成器和带yield的generator function。

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

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

from collections import Iterable
isinstance([],Iterable)
True
isinstance(‘abc哈哈‘,Iterable)
True
isinstance(set(‘hello‘),Iterable)
True
isinstance({1:‘a‘,2:‘b‘},Iterable)
True
isinstance((i*2 for i in range(10)),Iterable)
True
isinstance(range(10),Iterable)
True
isinstance(1234,Iterable)
False

而生成器不但可以作用于for循环,还可以被next()函数不断调用并返回下一个值,直到最后抛出StopIteration错误表示无法继续返回下一个值了。

*可以被next()函数调用并不断返回下一个值的对象称为迭代器:Iterator

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

isinstance((1,2,3),Iterator)
False
isinstance({},Iterator)
False
isinstance((i*2 for i in range(10)),Iterator)
True
isinstance(range(10),Iterator)
False

生成器都是Iterator对象,但listdictstr虽然是Iterable,却不是Iterator

listdictstrIterable变成Iterator可以使用iter()函数:

isinstance(iter([]),Iterator)
True
isinstance(iter((1,2,3)),Iterator)
True

你可能会问,为什么listdictstr等数据类型不是Iterator

这是因为Python的Iterator对象表示的是一个数据流,Iterator对象可以被next()函数调用并不断返回下一个数据,直到没有数据时抛出StopIteration错误。可以把这个数据流看做是一个有序序列,但我们却不能提前知道序列的长度,只能不断通过next()函数实现按需计算下一个数据,所以Iterator的计算是惰性的,只有在需要返回下一个数据时它才会计算。

Iterator甚至可以表示一个无限大的数据流,例如全体自然数。而使用list是永远不可能存储全体自然数的。

小结

凡是可作用于for循环的对象都是Iterable类型;

凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列;

集合数据类型如listdictstr等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象。

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

for in [12345]:

    pass

相当于:

# 首先获得Iterator对象:
it = iter([1, 2, 3, 4, 5])
# 循环:
while True:
    try:
        # 获得下一个值:
        x = next(it)
    except StopIteration:
        # 遇到StopIteration就退出循环
        break

以上参考Alex老师的,目前迭代器还用不着,先理解这个概念

http://www.cnblogs.com/alex3714/articles/5765046.html

时间: 2024-07-30 10:15:43

python学习-day6-迭代器(iterator)的相关文章

python学习10—迭代器

python学习10—迭代器 1. 迭代器协议 对象必须提供一个next方法,执行该方法或者返回迭代中的下一项,或者返回一个StopIteration异常,以终止迭代(只能往后走不能往前退) 2. 可迭代对象 实现了迭代器协议的对象,对象内部定义一个__iter__()方法 3. for循环实现机制 字符串.列表,元组,字典,集合,文件等都不具有next方法,所以他们都不是可迭代对象(iterable object),但是为什么for循环可以进行呢? 原因:for循环首先调用了他们的内置方法__

Python学习之==>迭代器

一.概要 在了解Python的数据结构时,容器(container).可迭代对象(iterable).迭代器(iterator).生成器(generator).列表/集合/字典推导式(list,set,dict comprehension)众多概念参杂在一起,难免让人一头雾水,下面这幅图也许能让大家更清楚的理解他们之间的关系. 二.容器(container) 容器是一种把多个元素组织在一起的数据结构,容器中的元素可以逐个地迭代获取,可以用 in , not in 关键字判断元素是否包含在容器中.

Python学习笔记——迭代器和生成器

1.手动遍历迭代器 使用next函数,并捕获StopIteration异常. def manual_iter(): with open('./test.py') as f: try: while True: line = next(f) print line except StopIteration: pass next函数也可以指定值来标记结尾 def manual_iter(): with open('./test.py') as f: try: while True: line = nex

python 学习day6 re模块

一简介: 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言, (在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被 编译成一系列的字节码,然后由用 C 编写的匹配引擎执行. 二 字符匹配(普通字符,元字符): 普通字符:大多数字符和字母都会和自身匹配         >>> re.findall('alex','yuanaleSxalexwupeiqi')            ['alex'] 2元字符:.   ^   $   * 

Python学习笔记——迭代器

什么是迭代器: 它为类序列对象提供了一个类序列的接口.它们是一组数据结构,你可以利用它们的索引从0开始一直“迭代”到序列的最后一个条目. 如何用迭代器: (1)序列中的使用 >>>myTuple = (1, 2, 3) >>>i = iter(myTuple) >>>i.next() 1 >>>i.next() 2 >>>i.next() 3 >>>i.next() Traceback (most

php手册学习的 迭代器 Iterator

<?php #迭代器原理演示 class MyIterator implements Iterator{ #定义一个属性,原来记录执行次数 private $pos; #定义要遍历的数组 private $arr=array( 'first_param', 'secnod_param', 'third_param' ); #定义构造函数 public function __construct(){ $this->pos = 0; } #定义指针置0 rewind public function

Python学习笔记——迭代器(RandSeq和AnyIter)

1.RandSeq #coding:utf-8 #!/usr/bin/env python 'randSeq.py -- 迭代' #从random模块里仅仅导入choice方法 from random import choice class RandSeq(object): def __init__(self,seq): self.data = seq; def __iter__(self): return self; def next(self): return choice(self.dat

python学习之迭代器与生成器

1.迭代器省内存 迭代器只允许往后读数据,不允许回读数据 迭代器不能跳着读文件,因为他是一点一点加载文件内容到内存的,读完了可以销毁或丢掉 2.生成一个迭代器 a = iter(["fd", "ss", "dd", "ff"]) 3.迭代器方法: python3.0以上:__next__(): python2.7:next() a.__next__()   读取的是fd a.__next__()   读取的是ss a.__ne

Python学习Day6

is比较内存地址是否相等 is 主要是判断 2 个变量的值是否指向同一个内存地址,如果是的话,则返回 true,否则返回 false. >>> a = 5555555 >>> b = 5555555 >>> a is b False >>> id(a) #a与b在内存中各开辟了一个地址存放它的值,虽然它们的值相同,但内存地址不同 1925864837008 >>> id(b) 1925868899600 >&g

python学习DAY6(集合)

#集合 无序的 # -*- coding:utf-8 -*- name=[1,4,5,2,3,2,6,7] name=set(name) #转换成集合的形式,并且自动去重 name2=set([2,6,0,66,22,8,4]) print(name,name2) #交集 print(name.intersection(name2 print(name & name2) #并集 print(name.union(name2)) print(name | name2) #差集 name中有的nam