标签:斐波那契数 mic 一个 ros 错误 直接 结果 lis 规则
generator #生成器
用列表生成式,我们可以直接创建一个列表。但是,受到内存限制,列表容量肯定是有限的。而且,创建一个包含100万个元素的列表,不仅占用很大的存储空间,如果我们仅仅需要访问前面几个元素,那后面绝大多数元素占用的空间都白白浪费了。如果列表元素可以按照某种算法推算出来,那我们是否可以在循环的过程中不断推算出后续的元素呢?这样就不必创建完整的list,从而节省大量的空间。在Python中,这种一边循环一边计算的机制,称为生成器:generator。
#创建一个generator的第一一种方法很简单,只要把一个列表生成式的[]改成(),就创建了一个generator: >>> L = [x * x for x in range(10)] >>> L [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] >>> g = (x * x for x in range(10)) >>> g <generator object <genexpr> at 0x1022ef630> #创建L和g的区别仅在于最外层的[]和(),L是一个list,而g是一个generator。
#如果要一个一个打印出来,可以通过next()函数获得generator的下一个返回值: >>> next(g) 0 >>> next(g) 1 >>> next(g) 4 >>> next(g) 9 >>> next(g) 16 >>> next(g) 25 >>> next(g) 36 >>> next(g) 49 >>> next(g) 64 >>> next(g) 81 >>> next(g) Traceback (most recent call last): File "<stdin>", line 1, in <module> StopIteration #但是不断调用next(g)实在是太变态了,正确的方法是使用for循环,因为generator也是可迭代对象: >>> g = (x * x for x in range(10)) >>> for n in g: ... print(n) ... 0 1 4 9 16 25 36 49 64 81
yield关键字
用generator实现Fib数列为例:斐波拉契数列(Fibonacci):除第一个和第二个数外,任意一个数都可由前两个数相加得到。
1, 1, 2, 3, 5, 8, 13, 21, 34, ...
#斐波拉契数列用列表生成式写不出来,先用函数把它打印出来: def fib(max): n, a, b = 0, 0, 1 while n < max: print(b) a, b = b, a + b n = n + 1 #调用 >>> fib(6) 1 1 2 3 5 8
fib
函数实际上是定义了斐波拉契数列的推算规则,可以从第一个元素开始,推算出后续任意的元素,这种逻辑其实非常类似generator。
也就是说,上面的函数和generator仅一步之遥。要把fib
函数变成generator,只需要把print(b)
改为yield b
就可以了:
def fib(max): n, a, b = 0, 0, 1 while n < max: yield b a, b = b, a + b n = n + 1 return ‘done‘ #这就是定义generator的另一种方法。如果一个函数定义中包含yield关键字,那么这个函数就不再是一个普通函数,而是一个generator: >>> f = fib(6) >>> f <generator object fib at 0x104feaaa0> #同样,把函数改成generator后我们基本上从来不会用next()来获取下一个返回值,而是直接使用for循环来迭代: >>> for n in fib(6): ... print(n) ... 1 1 2 3 5 8 #但是用for循环调用generator时,发现拿不到generator的return语句的返回值。如果想要拿到返回值,必须捕获StopIteration错误,返回值包含在StopIteration的value中: >>> g = fib(6) >>> while True: ... try: ... x = next(g) ... print(‘g:‘, x) ... except StopIteration as e: ... print(‘Generator return value:‘, e.value) ... break ... g: 1 g: 1 g: 2 g: 3 g: 5 g: 8 Generator return value: done
增加斐波那契数列更好的实现:
#定义实现函数 def fib(n): if n <= 1: return n else: return(fib(n-1) + fib(n-2)) # 获取用户输入 num = int(input("您要输出几项? ")) # 检查输入的数字是否正确 if num <= 0: print("输入正数") else: print("斐波那契数列:") for i in range(num): print(fib(i))
#输出结果 您要输出几项? 10 斐波那契数列: 0 1 1 2 3 5 8 13 21 34
标签:斐波那契数 mic 一个 ros 错误 直接 结果 lis 规则
原文地址:https://www.cnblogs.com/kumata/p/9055518.html