python程序设计第10课第五章函数
八,迭代器(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) 22.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
- python程序设计第11课第五章函数
- 流畅的python第五章一等函数学习记录
- python开发技术详解---第五章:模块与函数
- 学习python的第四十二天-第五章 模块与函数
- Python基础自学(第五章-函数进阶、迭代器和生成器、装饰器、上下文管理器、变量的作用域)
- JavaScript高级程序设计学习笔记第五章--引用类型(函数部分)
- python 教程 第五章、 函数
- python程序设计基础4:python函数设计和使用
- Head First Python 第二章 函数模块&第三章 文件与异常&第四章 持久存储&第五章 处理数据
- C语言程序设计 第五章 函数
- Python语言程序设计基础(第2版) 课后题 第五章
- 流畅的Python第四章 文本和字节序列 第五章一等函数 第六章使用一等函数实现设计模式
- C语言程序设计 练习题参考答案 第五章 (1) 函数定义调用
- [Python学习笔记][第五章Python函数设计与使用]
- Python程序设计学习笔记4--函数和代码复用
- python 教程 第五章、 函数
- [Python学习笔记][第五章Python函数设计与使用]
- python 教程 第五章、 函数
- Python程序设计( 四 函数)——4.3 函数的嵌套调用
- Python程序设计基础 函数与模块习题