什么响应式网站,wordpress装修网插件,四川建设厅招投标官方网站,云南网站建设专家一、生成器#xff08;generator#xff09; 先来看看一个简单的菲波那切数列#xff0c;出第一个和第二个外#xff0c;任意一个数都是由前两个数相加得到的。如#xff1a;0,1,1,2,3,5,8,13...... 输入斐波那契数列前N个数#xff1a; def fab(max): n, a, b 0, 0, 1 …一、生成器generator 先来看看一个简单的菲波那切数列出第一个和第二个外任意一个数都是由前两个数相加得到的。如0,1,1,2,3,5,8,13...... 输入斐波那契数列前N个数 def fab(max): n, a, b 0, 0, 1 while n max: print b a, b b, a b n n 1 结果 fib(100)
1
1
2
3
5
8
13 但是要提高 fib 函数的可复用性最好不要直接打印出数列而是返回一个 List。每次循环将b的值append到一个list中。 然而问题又来了。。。 该函数在运行中占用的内存会随着参数 max 的增大而增大如果要控制内存占用最好不要用 List来保存中间结果而是通过 iterable 对象来迭代。 在python2 中 for i in range(1000): pass range会生成一个含有1000个元素的list极大地浪费了内存空间。 for i in xrange(1000): pass 而改进后的xrange则生成一个可迭代iterable对象每次迭代时返回下一个数值占用空间极少。 如此我们可以利用iterable来写一个fib类 class Fab(object): def __init__(self, max): self.max max self.n, self.a, self.b 0, 0, 1 def __iter__(self): return self def next(self): if self.n self.max: r self.b self.a, self.b self.b, self.a self.b self.n self.n 1 return r raise StopIteration() 然后,for循环会在每次循环中自动调用next()方法不断返回数列的下一个数。占用内存始终为常数。 for n in Fab(5): ... print(n) 虽然实现了需求但用class实现的fib并不简洁由此我们可以引入yield。 def fab(max): n, a, b 0, 0, 1 while n max: yield b # print(b) a, b b, a b n n 1 然后 for n in fab(5): ... print(n) yield 的作用就是把一个函数变成一个 generator带有 yield 的函数不再是一个普通函数Python 解释器会将其视为一个 generator调用 fib(5) 不会执行 fab 函数而是返回一个 iterable 对象在 for 循环执行时每次循环都会执行 fib 函数内部的代码执行到 yield b 时fib 函数就返回一个迭代值下次迭代时代码从 yield b 的下一条语句继续执行而函数的本地变量看起来和上次中断执行前是完全一样的于是函数继续执行直到再次遇到 yield。 手动执行过程 f fab(5) f.next() 1 f.next() 1 f.next() 2 f.next() 3 f.next() 5 f.next() Traceback (most recent call last): File stdin, line 1, in module StopIteration当函数执行结束时generator 自动抛出 StopIteration 异常表示迭代完成。在 for 循环里无需处理 StopIteration 异常循环会正常结束。 一个带有 yield 的函数就是一个 generator它和普通函数不同生成一个 generator 看起来像函数调用但不会执行任何函数代码直到对其调用 next()在 for 循环中会自动调用 next()才开始执行。虽然执行流程仍按函数的流程执行但每执行到一个 yield 语句就会中断并返回一个迭代值下次执行时从 yield 的下一个语句继续执行。看起来就好像一个函数在正常执行的过程中被 yield 中断了数次每次中断都会通过 yield 返回当前的迭代值。 转载于:https://www.cnblogs.com/pyramid1001/p/5854712.html