python斐波那契数列生成器_python生成器(generator)对斐波那契数列的推算规则的实现...

生成器(generator)

描述

通过列表生成式可以直接创建列表,由于内存的限制,列表容量有限。如果创建一个上百万元素的列表,只用到几个元素,很浪费存储空间。

想避免这种情况,就要用到生成器。在python中,一边循环一边计算的机制,成为生成器(generator)

# 把列表[0,1,2,3,4,5,6,7],每个值加1

L = [0,1,2,3,4,5,6,7]

b = []

for i in L:

a = i + 1

b.append(a)

print(b)

# 输出结果:[1, 2, 3, 4, 5, 6, 7, 8]

# 列表生成式来实现

L = [0,1,2,3,4,5,6,7]

a = [i+1 for i in L]

print(a)

# 输出结果:[1, 2, 3, 4, 5, 6, 7, 8]

创建生成器

将上个例子中列表生成式的[]改为(),就创建一个generator

# 列表生成式

a = [i+1 for i in range(8)]

print(a)

# 输出结果:[1,2,3,4,5,6,7,8]

# 生成器

g = (i+1 for i in range(8))

print(g)

# 输出结果at 0x0000024C55031A98>

如何打印生成器的值?

生成器是一个特殊的程序,可以被用作控制循环的迭代行为(python中生成器是迭代器的一种),使用yield返回值函数,每次调用yield会暂停,而可以使用next()函数和send()函数回复生成器

g = (i+1 for i in range(8))

print(next(g))

print(next(g))

print(next(g))

输出结果

1

2

3

生成器(generator)保存的是算法,每次调用next(g)就计算出它下一个元素的值,直到最后一个元素,如果没有更多的元素,会抛出StopIteration的错误

正确的使用方法:

g = (i+1 for i in range(8))

for n in g:

print(n)

输出结果

1

2

3

4

5

6

7

8

生成器高级用法

生成器不仅可以通过类似生成式的for循环实现,还可以用函数来实现

例如斐波那契数列,除第一个和第二个数外,任何一个数都可以由前两个相加得到

1,1,2,3,5,8…

# 斐波那契函数通过函数打印

def fib(max):

n,a,b = 0,0,1

while n

a,b = b,a+b

n += 1

print(a)

return "done"

print(fib(6))

输出结果

1

1

2

3

5

8

done

fib函数实际上是定义了斐波那契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑非常类似生成器(generator)

# 把fib函数变成生成器(generator)

def fib(max):

n,a,b = 0,0,1

while n

yield b

a,b = b,a+b

n += 1

return "done"

print(fib(6))

#输出结果:

这就是generator定义的另一种方法,如果一个函数定义中包含了yield关键字,那这个函数就不再是一个普通函数,而是一个生成器(generator)

函数与变成生成器的函数不同之处

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

def g():

print("step 1")

yield 1

print("step 2")

yield 2

print("step 3")

yield 3

a = g()

next(a)

# 输出结果:1

next(a)

# 输出结果:2

next(a)

# 输出结果:3

可以看出g不是普通函数,在执行过程中,遇到yield就中断,下次又继续执行。

执行3次yield后,已经没有yield可以执行了,如果继续调用next(a)(第四次调用),就会报错

生成器(generator)两种基本方式

a.生成器函数:也是用def定义的,利用关键字yield一次性返回一个结果,堵塞,重新开始

b.生成器表达式:返回一个对象,这个对象只有在需要的时候才产生结果

本博客源码Github地址:

请随手给个star,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值