Python 学习笔记3 - 高级特性

生成器 generator

通过列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的

生成器可以通过一边循环一边计算的机制,在循环的过程中不断推算出后续的元素,不必创建完整的list,从而节省大量的空间

简单的 generator 定义例子:

# 把一个列表生成式的[]改成(),就创建了一个generator
g = (x * x for x in range(10))

通过next()函数可获得generator的下一个返回值,直到计算到最后一个元素,没有更多的元素时,抛出 StopIteration 的错误

next(g)

使用for循环获得generator的返回值,因为generator也是可迭代对象。使用for循环不需要关心 StopIteration 的错误

for n in g:
    print(n)

用类似列表生成式的for循环无法实现的时候,还可以用函数来实现 generator。如果一个函数定义中包含 yield 关键字,那么这个函数就不再是一个普通函数,而是一个 generator

// 输出斐波那契数的 generator
def fib(max):
    n, a, b = 0, 0, 1
    while n < max:
        yield b
        a, b = b, a + b
        n = n + 1
    return 'done'
# 和前面一样,获取返回值的两种方式

f = fib(6)
next(f)

for n in fib(6):
    print(n)

generator 和函数的执行流程区别:

  • 函数是顺序执行,遇到return语句或者最后一行函数语句就返回
  • generator的函数,在每次调用next()的时候执行,遇到yield语句返回,再次执行时从上次返回的yield语句处继续执行

如果想要拿到 generator 的return语句的返回值,必须捕获 StopIteration 错误,返回值包含在 StopIteration 的 value 中。因为for循环获取不到 StopIteration 错误,所以只能用 next():

g = fib(6)

while True:
    try:
        x = next(g)
        print('g:',x)
    except StopIteration as e:
        print('Generator return value:', e.value)
        break

迭代器 Iterator

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

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

因此,generator 都是 Iterator 对象,但 list、dict、str 虽然是 Iterable ,却不是 Iterator

isinstance() 判断一个对象是否是 Iterator 对象:

from collections import Iterator

isinstance((x for x in range(10)), Iterator) ==> True
isinstance([], Iterator) ==> False
isinstance({}, Iterator) ==> False
isinstance('abc', Iterator) ==> False

可以使用 iter() 函数把list、dict、str等 Iterable 变成 Iterator

isinstance(iter([]), Iterator) ==> True
isinstance(iter('abc'), Iterator) ==> True
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. 切片 语法:list = list[起始索引:截止索引:间隔数量] 解释:对于str或是list可以采用[0...
    57fc17b7d598阅读 460评论 0 0
  • 在此处先列下本篇文章的主要内容 简介 next方法的参数 for...of循环 Generator.prototy...
    醉生夢死阅读 1,488评论 3 8
  • 简介 基本概念 Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同。本章详细介绍...
    呼呼哥阅读 1,136评论 0 4
  • 1.1==,is的使用 ·is是比较两个引用是否指向了同一个对象(引用比较)。 ·==是比较两个对象是否相等。 1...
    TENG书阅读 792评论 0 0
  • 首先java是面向对象编程语言(oop:Object Oriented Programming 面向对象编程)...
    赵什么不重要阅读 222评论 0 0

友情链接更多精彩内容