*>>>f=open('first-five-lines-zen-of-python.txt')
open打开文件生成文件对象
>>>f.readline()
调用readline()一次读取一行文本并前进到下一行直到文件末尾,到末尾返回空字符串
>>>f._next_()
与readline()类似,区别在后者读到末尾返回异常
通过作为迭代器的文件对象f引出迭代器的定义,而其他迭代器的性质基本都和其类似。有. _ next _ ()的方法的对象会前进到下一行,到达末尾抛出异常,遵循上述迭代协议的对象都是被认为是迭代器。
所以逐行读取文件最好直接放在for循环内
>>>for line in open('first-five-lines-zen-of-python.txt'):
直接把对象放在for循环里,让for循环帮你来逐行调用. _ next _ ()方法,for循环感知到异常就会自动结束循环,任何迭代器都可以这样
*读取文件也有另一种方式如下
*>>>for line in open('first-five-lines-zen-of-python.txt').readlines():
尝试一次性把所有行都输出出来,但是这样如果文件过大就装不到内存里,无法运行。这并不是好方法
python2:next(x)=x.next() python3:next(x)=x. _ next _ () 两者区别仅在命名
例(python3):
>>>myiter=iter(mylist)
>>>type(myiter)
>>>mylist._next_()
1
>>>next(myiter)
2
可迭代对象iterable通过iter()返回迭代器iterator,迭代操作中使用的是iterator,iterable本身不是iterator
*python2和3都是. _ iter _ (),next()没有区别,区别在于.next和. _ next _ ()
有些可迭代对象就是自己的迭代器,如上文的文件迭代器,这可以用is关键字验证
>>>f=open('first-five-lines-zen-of-python.txt')
>>>iter(f) is f
True
说明f可迭代对象和它的迭代器是同一个对象
iterable是实现. _ iter _ ()方法的对象,iterator是是实现了. _ next _ ()方法的对象。同时实现说明对象是他自己的迭代器
*下面举了个例子,例子里老师自己定义了一个class类来演示返回自己的情况。这个类既有iter()(return
self)又有. _ next _ ()方法。由于类还没学,这里自己看PPT理解
复杂的可迭代对象的迭代器都不是它自己。不返回自己的好处在于可以生成多个迭代器,返回自己就无法同时维护两个和两个以上迭代器。返回自己时,iterable返回的iterator是它自己,用过一次就无法再用。作为对比如果iterable返回一个完全新的iterator,就可以通过iterable构建多个iterator,用完之后还可以再次产生一个新的iterator
例:
>>>f=open('first-five-lines-zen-of-python.txt')
>>>f._next_()
'Beautiful is better than ugly.\n'
>>>f_iter=iter(f)
>>>f_iter is f
True
>>>f_iter2=f._iter_()
>>>f_iter2 is f
True
>>>f_iter is f_iter2
True
>>>f_iter._next_()
'Explicit is better than implicit.\n'
>>>f_iter2._next_()
'Simple is better than complex.\n'
>>>a=[1,2,3]
myiter1=iter(a)
>>>myiter1 is a
False
>>>myiter2=a._iter_()
>>>myiter2=a
False
>>>type(myiter2)
>>>myiter1 is myiter2
False
>>>myiter1._next_()
1
>>>next(myiter1)
2
>>>next(myiter2)
1
生成器(generator)的语法实现分为两种:生成器函数(generate function)与生成器表达式(generator
expression)。
接下来举了寻找列表中素数的例子,体现普通函数的局限性。如果要让当函数再次被调用时,从上次结束的时候开始,普通函数是做不到的,只能用generate function。生成器函数的定义与普通函数类似,但是每当需要生成一个值时,它都使用yield关键字而不是return来完成。
生成器函数(generator function)创建生成器迭代器(generator iterators)。生成器迭代器(generator iterators)通常也被称为"生成器"(generator),而生成器(generator)就是一种特殊类型的迭代器(iterators)。出于这点生成器(generator)也有. _ next _ ()方法,也能用next()函数获取生成器的下一个值,也能被放在for循环内。
例1(for循环遍历generator):
>>>def simple_generate_function():
... yield 1
... yield 2
... yield 3
>>>for value in simple_generate_function():
... print value
...
1
2
3
例2:
>>>simple_generater=simple_generater_function()
>>>next(simple_generater)
1
>>>next(simple_generater)
2
*当生成器函数调用yield时生成器函数的"状态"被冻结;保存所有变量的值并记录下要执行的下一行代码,
直到再次调用next()从它停止的地方开始继续执行下去
*每调用一次生成器函数(generator function)会生成一个生成器迭代器(generator iterator),生成器迭代器(generator iterator)通常也被叫做生成器(generator)。但是生成器函数(generator function)本身不是迭代器(iterator)
例3(重写生成无限素数函数):
def get_prime(start):
while True:
if is_prime(start):
yield start
start+=1
*while循环的作用是确保我们永远不会到达get_primes()的末尾。它允许我们在生成器(generator)上调用next()的同时生成一个值,是很常见的写法
类似list comprehension(列表推导式),但是是圆括号,生成一个生成器对象。这个生成器对象也是个迭代器(iterator)
例:
>>>g=(x**2 for x in range(4))
>>>next(g)
0
>>>next(g)
1
>>>next(g)
4
编辑于2020-4-17 17:40
修改于2020-4-28 15:36