我对编码很新(2天前开始),为了练习,朋友给了我编写程序的任务,该程序提供第n个斐波纳契数或直到第n个点的序列。我使用input()成功完成了该任务并直接向用户询问了n,现在他扩展了任务并让我尝试使用sys.argv获得相同的结果
在广泛使用谷歌后,我想出了如何打印所有给定的参数并计算它们,但我无法弄清楚在函数中使用这些参数的任何方法。不幸的是,我似乎也无法为谷歌找到合适的关键词,让我有点卡在无人的土地上。
这是我最近的尝试:
import sys
from math import sqrt
print('Number of arguments:', len(sys.argv), 'arguments.')
print ('Argument List:', str(sys.argv))
Fibonacci = sys.argv[0]
value = sys.argv[1]
sequence = sys.argv[2]
def fib(value): int(1/sqrt(5)*(((1+sqrt(5))/2)**value-(((1-sqrt(5))/2)**value)))
print("The {}. value is".format(value), fib(value))
input("Close")
(小细节,尽管不重要:我将字符串从德语翻译成英语,这也是为什么它说“{}。值”而不是“{} st / nd / rd / th”,这些情况之间的区别是一个问题为了以后的日子。)
现在我希望在这里离目标很远,但使用一些适用于我的基于输入()的代码的表达式几乎是我现在的最后一个想法。任何人都可以给我一个关于如何在这里进行的指针吗?甚至暗示我应该谷歌会有所帮助,但截至目前我完全没有想法。
编辑:我不知道这是不是你应该做的,但我已经解决了我的问题,我想我也可以发布我的代码,万一其他人偶然发现这个问题的线程。这是我的解决方案。
import sys
from math import sqrt
Fibonacci = sys.argv[0]
Entscheidung = (sys.argv[1])
n = int(sys.argv[2])
sequence = []
if Entscheidung == "Stelle":
def fib(n): return int(1/sqrt(5)*(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n))
print("Die {}. Stelle beträgt:{}".format(n, fib(n)))
elif Entscheidung == "Folge":
def fib(n): return int(1/sqrt(5)*(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n))
for i in range(n):
sequence.append(fib(i + 1))
print('[%s]' % ', '.join(map(str, sequence)))
input("Schließen")
请注意,我仍然是一个绝对的初学者,这个解决方案可能效率低下,写得不好,格式混乱,我不知道。我能保证的是它能完成这项工作。
是的,n = int(sys.argv[2])
是魅力。
既然你是破解sys.argv
的专家,你可能想要$ pip install click
并让那个包为你做一些解析:https://click.palletsprojects.com/en/7.x/
我想,有条件地执行def
是一种选择,但有点奇怪。将相同的定义粘贴到两个if
分支中是没有用的。只有def
它一次,顶部。
以下是对代码的重构,包括以下更改:
input
。当然,你的朋友希望你制作一个可以正确重复使用的程序;需要用户交互的废话。sys.argv[0]
。如果它没有被使用,就没有必要捕获它(如果你以后需要它,它仍然存在)。if __name__
中包装入口点......这样这段代码可以被import
ed到另一个没有副作用的程序中。from math import sqrt
def fib_nth(n):
return int(1/sqrt(5)*(((1+sqrt(5))/2)**n-((1-sqrt(5))/2)**n))
def fib_seq(n):
sequence = []
for i in range(n):
sequence.append(fib_nth(i + 1))
return sequence
if __name__ == '__main__':
import sys
entscheidung = sys.argv[1]
n = int(sys.argv[2])
if entscheidung == "Stelle":
print("Die {}. Stelle beträgt:{}".format(n, fib_nth(n)))
elif entscheidung == "Folge":
print('[%s]' % ', '.join(map(str, fib_seq(n))))