python迭代器&生成器

看代码看到什么yield又看不懂了。Sign.....

迭代器:

首先Python有内置容器类:List ,dict,tuple.... 我们把这些叫做Container。Container都是可以用for..in..来遍历的。

那么,是什么使得遍历可以成功进行呢?

就是我们的迭代器对象啦。这个对象使得遍历能够进行。

迭代器一般有两个方法

①__iter__()②next()

我们先来解释for..in...到底是怎么进行的:

首先会调用__iter__, 这个函数是用来返回Iterator对象的。之后调用next()方法输出。

 1 class Iterators(object):
 2
 3     def __init__(self):
 4         self.value = 1
 5
 6     def __iter__(self):
 7         return self
 8
 9     def next(self):
10         self.value+=1
11         return self.value
12
13 a=Iterators()
14 for value in a:
15     print value

像上面这个例子,在for...in..时先调用__iter__方法返回一个iterator对象,然后再调用这个迭代对象的next方法。

 1 class Iterators(object):
 2
 3     def __init__(self):
 4         self.value = 1
 5
 6     def __iter__(self):
 7         return iter([1,2,3])
 8
 9     def next(self):
10         self.value+=1
11         return self.value

但是,如果我们改掉代码的第七行,输出就会不同,这时候输出是1,2,3。因为这时候返回的Iterator对象是iter([1,2,3]。

(ps:iter是python内置的函数,返回一个iterator对象。)

所以这时候调用的next()函数就是[1,2,3]的next(),所以输出就是1,2,3。

迭代器知道这么点差不多了。

生成器:

生成器通俗一点说就是有yield的函数,yield语句有点类似return。简单的小栗子:

1 def generator():
2         yield 1
3         yield 2
4
5
6 a=generator()
7 print a.next()
8 print a.next()

输出1,2。

这里,a=generator()不是执行函数,而是生成了一个生成器对象。

生成器就是一种迭代器。

所以生成器也有next()方法,也可以用for ... in ......

 1 class Text8Corpus(object):
 2     """Iterate over sentences from the "text8" corpus, unzipped from http://mattmahoney.net/dc/text8.zip ."""
 3     def __init__(self, fname, max_sentence_length=1000):
 4         self.fname = fname
 5         self.max_sentence_length = max_sentence_length
 6
 7     def __iter__(self):
 8         # the entire corpus is one gigantic line -- there are no sentence marks at all
 9         # so just split the sequence of tokens arbitrarily: 1 sentence = 1000 tokens
10         sentence, rest = [], b‘‘
11         with utils.smart_open(self.fname) as fin:
12             while True:
13                 text = rest + fin.read(8192)  # avoid loading the entire file (=1 line) into RAM
14                 if text == rest:  # EOF
15                     sentence.extend(rest.split()) # return the last chunk of words, too (may be shorter/longer)
16                     if sentence:
17                         yield sentence
18                     break
19                 last_token = text.rfind(b‘ ‘)  # the last token may have been split in two... keep it for the next iteration
20                 words, rest = (utils.to_unicode(text[:last_token]).split(), text[last_token:].strip()) if last_token >= 0 else ([], text)
21                 sentence.extend(words)
22                 while len(sentence) >= self.max_sentence_length:
23                     yield sentence[:self.max_sentence_length]
24                     sentence = sentence[self.max_sentence_length:]

那我遇到的问题就好解决了。这是Word2Vec里将字符从文件中读取出来的一段代码。 在for...in ...时,首先会运行__iter__方法,因为这个方法里有yield,所以它可以迭代。输入的文件是一个个英文单词,以空格分割。最后的结果就是一个个List,每个List最多有1000个字符。

不过那个b‘‘和last_token我还是没看懂哎。

时间: 2024-12-28 09:05:26

python迭代器&生成器的相关文章

[python]--迭代器,生成器补充

在python中,list,string,dict都是可迭代对象,可以通过for语句遍历. 迭代器 迭代器对象要求支持迭代器协议的对象,在python中,支持迭代器协议就算实现对象的__iter__()和next()方法.其中__iter__()方法返回迭代器对象本身; next()方法返回容器的下一个元素,在结尾时引发StopIteration异常 __iter__()和next()方法 这两个方法是迭代器最基本的方法,一个用来获得迭代器对象,一个用来获取容器中的下一个元素. 对于可迭代对象,

Python 迭代器&生成器,装饰器,递归,算法基础:二分查找、二维数组转换,正则表达式,作业:计算器开发

本节大纲 迭代器&生成器 装饰器  基本装饰器 多参数装饰器 递归 算法基础:二分查找.二维数组转换 正则表达式 常用模块学习 作业:计算器开发 实现加减乘除及拓号优先级解析 用户输入 1 - 2 * ( (60-30 +(-40/5) * (9-2*5/3 + 7 /3*99/4*2998 +10 * 568/14 )) - (-4*3)/ (16-3*2) )等类似公式后,必须自己解析里面的(),+,-,*,/符号和公式,运算后得出结果,结果必须与真实的计算器所得出的结果一致 迭代器&

python 迭代器&&生成器

有一篇文章写得迭代器和生成器,写得很好:https://www.cnblogs.com/wj-1314/p/8490822.html #列表生成器print([i*2 for i in range(10)]) #生成器:调用时才会产生相应的数据,不调用时不暂用内存,同时只记住当前的位置,只有一个__next__()方法b=(i*2 for i in range(10))for i in b: print(i) 什么是生成器? 通过列表生成式,我们可以直接创建一个列表,但是,受到内存限制,列表容量

python迭代器,生成器,推导式

可迭代对象 字面意思分析:可以重复的迭代的实实在在的东西. list,dict(keys(),values(),items()),tuple,str,set,range, 文件句柄(待定) 专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象. 内置函数:dir() print(dir(str)) 判断一个对象是否是可迭代对象: print('iter' in dir(str)) 优点: 直观. 操作方法较多. 缺点: 占内存. 不能迭代取值(索引,字典的key). 迭代器 字面意

python 迭代器 生成器 装饰器

迭代器 可以直接作用于for循环的对象统称为可迭代对象(Iterable). 可以被next()函数调用并不断返回下一个值的对象称为迭代器(Iterator). 所有的Iterable均可以通过内置函数iter()来转变为Iterator. names = iter(['sun', 'ibm', 'sunny']) print(names) print(names.__next__()) print(names.__next__()) print(names.__next__()) print(

python 迭代器 生成器 (转)

转帖: 原文写的不错! 原文地址:http://www.cnblogs.com/kaituorensheng/p/3826911.html#_label0 阅读目录 1. 迭代器 2. 生成器 3. 参考 回到顶部 1. 迭代器 迭代器是访问集合元素的一种方式.迭代器对象从集合的第一个元素开始访问,知道所有的元素被访问完结束.迭代器只能往前不会后退,不过这也没什么,因为人们很少在迭代途中往后退. 1.1 使用迭代器的优点 对于原生支持随机访问的数据结构(如tuple.list),迭代器和经典fo

四.Python迭代器生成器和装饰器

迭代器 迭代是Python最强大的功能之一,是访问集合元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器只能往前不会后退. 凡是可作用于for循环的对象都是Iterable类型: 凡是可作用于next()函数的对象都是Iterator类型,它们表示一个惰性计算的序列: 集合数据类型如list.dict.str等是Iterable但不是Iterator,不过可以通过iter()函数获得一个Iterator对象. Pyt

python迭代器,生成器,列表生产式

目录 列表生成式 生成器 1.定义 2.作用 3.返回值 迭代器 1.特点 2.常见的迭代器 3.可迭代对象 列表生成式 列表生成式即List Comprehensions,是Python内置的非常简单却强大的可以用来创建list的生成式. 例如: >>> [x * x for x in range(1, 11)] [1, 4, 9, 16, 25, 36, 49, 64, 81, 100] 生成器 1.定义 一个函数调用时返回一个迭代器,那这个函数就叫做生成器(generator),如

python迭代器生成器(一)

for循环可以用于python中任何序列类型,包括序列.元组以及字符串.例如: >>> for x in [1,2,3,4]: print(x * 2,end='')...2468 >>> for x in (1,2,3,4): print(x * 2,end='')...2468 >>> for y in 'python': print(y * 2 ,end=' ')...pp yy tt hh oo nn 实际上,for循环甚至比这更为通用:可用于