python generator iterator_python 生成器(generator),迭代器(iterator)与yield

python 生成器(generator),迭代器(iterator)与yield

前言

OOAD课程是用python教的,其中涉及到大量的python语法糖,老师也算是手把手教如何写出OO的python,但一个学期没听课只能期末补一补。

概念引入

generator

python是一门很灵活的函数,对于列表的创建什么的都很简单, 考虑这样一种情况,一个列表中有100万个元素,但仅仅只有几个元素是业务需要的,那么大量的内存空间都被浪费了.

如果这个列表里的元素都基于一定规则,如斐波那契数列,那么我们可以采用python内置的生成器(generator)来进行一边循环一边计算.

下面的代码还原了generator的计算逻辑:

def fib(fibonacci):

n, a, b = 0, 0, 1

while n < fibonacci:

print(b)

a, b = b, a + b

n = n + 1

fib(6)

yield

如果我们需要将其变为generator,则需要使用yield关键字:

换句话说,带了yield关键字的函数就是generator (注意是可以使用多个yield关键字哒)

def fib(fibonacci):

n, a, b = 0, 0, 1

while n < fibonacci:

yield b

a, b = b, a + b

n = n + 1

for n in fib(6):

print(n)

由此,其通过for循环迭代每个元素并打印,实现了和上面的代码一样的效果.

在每次循环的时候,生成器函数都会在yield处产生一个值,并将其返回给调用者,即for循环。然后在yield处保存内部状态,并挂起中断退出。在下一轮迭代调用时,从yield的地方继续执行,并且沿用上一轮的函数内部变量的状态,直到内部循环过程结束。

除此之外,还有一种叫做生成器表达式:

就是将中括号写成了小括号,两者返回的结果不一致:

6778a6fa440d140177cb0346d775d8d2.png

Iterator

看Wiki的解释:

在Python中,迭代器是遵循迭代协议的对象。使用iter()从任何序列对象中得到迭代器(如list, tuple, dictionary, set等)。另一种形式的输入迭代器是generator(生成器)。

说回斐波那契数列,作为generator,自然也就是Iterator,python提供了next()函数以备使用.

6ba2fc8ca8c3101cb416da9a3228ae88.png

调用next()函数,直接将fib(6)作为参数传入,返回迭代元素.

可迭代对象

那么什么才是迭代器呢?迭代器和可迭代对象有什么区别?

先去尝试了比较常见的集合:

378f42571f03379915d16b72bee015d0.png

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

而上文中摘录的Wiki告诉我们,python提供了iter()函数供我们将可迭代对象转换为迭代器:

python也提供了isinstance()判断一个对象是否为某某的实例化对象,于是我们先测试s = [1, 2, 3]是否为可迭代对象:

from collections.abc import Iterable

s = [1, 2, 3]

print(isinstance(s,Iterable)) # print True

ce59aed5d3a2ff08091f71d38af980d6.png

使用范例

... 考完试再填坑.

Reference

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值