我只是想通过制作一些基本功能来提高我的编程技巧.
我想用斐波纳契值填充一个列表,但我认为我的代码给出了所有数字的总和并打印出来了.
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
print numberlist
fibonaccinumbers = []
for n in numberlist:
def fib(n):
a, b = 0, 1
for i in range(n):
a, b = b, a + b
return a
a = fib(n)
fibonaccinumbers.append(a)
print a
Run Code Online (Sandbox Code Playgroud)
我哪里出错了?
pok*_*oke 12
print a
Run Code Online (Sandbox Code Playgroud)
好吧,你打印最终值.
还有一些关于您的代码的评论:
numberlist = []
i = 0
for i in range(20):
numberlist.append(i)
Run Code Online (Sandbox Code Playgroud)
你不需要在i那里初始化,for循环就是为你做的.此外,您只需执行以下操作即可简化整个块:
numberlist = list(range(20))
Run Code Online (Sandbox Code Playgroud)
鉴于您实际上并不需要将其作为列表,您根本不需要构建它,但您可以for n in range(20)稍后运行.
然后你fib一遍又一遍地在循环中重新定义你的函数.您应该在它之外定义它,然后重复使用它.
此外,当您知道要创建多个斐波纳契数列表时,只需存储您计算的所有数字.这样你就不必一遍又一遍地做同样的事情.您还可以使用生成器函数使这一切变得更容易:
def fibGenerator():
a, b = 0, 1
yield 0
while True:
a, b = b, a + b
yield a
fibonaccinumbers = []
fib = fibGenerator()
for n in range(20):
fibonaccinumbers.append(next(fib))
Run Code Online (Sandbox Code Playgroud)
相反迭代一个范围,并呼吁的next手动发电机上,然后你也可以只使用take-配方从itertools做到这一点,就像这样:
fibonaccinumbers = take(20, fibGenerator())
Run Code Online (Sandbox Code Playgroud)
但是还不太确定发电机的功能.
生成器是一个Python函数,它生成一系列返回值.这些值是懒惰生成的,这意味着当您请求它时.您只需使用yield而不是创建生成器return.A yield将"返回"一个值并暂停生成器.下次请求值时,生成器将从中断处继续.
使用生成器可以创建无限序列.正如您在fibGenerator上面的定义中所看到的,有一个无限的while循环,它有一个yield内部.当发电机停止时,尽管有这个循环,它也不会挂起.
这是一个快速的自我解释的例子:
>>> def example():
print('begin')
i = 0
while True:
print('Calculating next value')
yield i
i += 1
>>> g = example()
>>> next(g)
begin
Calculating next value
0
>>> next(g)
Calculating next value
1
>>> next(g)
Calculating next value
2
>>> next(g)
Calculating next value
3
>>> next(g)
Calculating next value
4
Run Code Online (Sandbox Code Playgroud)
该next函数是内置函数,它从迭代中请求下一个值.迭代是你可以迭代的任何东西(例如for x in iterable: ...); 并且任何生成器也是可迭代的.