您的位置:首页 > 编程语言 > Python开发

python程序设计第10课第五章函数

2020-05-11 04:12 78 查看

八,迭代器(iterator)

1.文件迭代器的例子
*>>>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():

尝试一次性把所有行都输出出来,但是这样如果文件过大就装不到内存里,无法运行。这并不是好方法

2.两个可以手动迭代的内置函数next和iter
1.next()

python2:next(x)=x.next() python3:next(x)=x. _ next _ () 两者区别仅在命名

例(python3):
>>>myiter=iter(mylist)
>>>type(myiter)
<class'list_iterator'>
>>>mylist._next_()
1
>>>next(myiter)
2
2.iter()

可迭代对象iterable通过iter()返回迭代器iterator,迭代操作中使用的是iterator,iterable本身不是iterator

*python2和3都是. _ iter _ (),next()没有区别,区别在于.next和. _ next _ ()

3.区分iterable和iterator

有些可迭代对象就是自己的迭代器,如上文的文件迭代器,这可以用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)
<class'list_iterator_'>
>>>myiter1 is myiter2
False
>>>myiter1._next_()
1
>>>next(myiter1)
2
>>>next(myiter2)
1

九,生成器(Generator)

生成器(generator)的语法实现分为两种:生成器函数(generate function)与生成器表达式(generator
expression)。

1.generate function

接下来举了寻找列表中素数的例子,体现普通函数的局限性。如果要让当函数再次被调用时,从上次结束的时候开始,普通函数是做不到的,只能用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()的同时生成一个值,是很常见的写法
2.generate expression

类似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

CS_Lee_ 原创文章 16获赞 0访问量 2298 关注 私信
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: