python - 如何通过 sys.argv 执行函数
问题描述
我对编码非常陌生(两天前开始),为了练习,一位朋友给了我编写一个程序的任务,该程序提供第 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")
(小细节,虽然不重要:我将字符串从德语翻译成英语,这也是为什么它说“{}.value”而不是“{}st/nd/rd/th”的原因,这些情况之间的区别是一个问题以后的日期。)
现在我希望在这里偏离目标数英里,但使用一些适用于我基于 input() 的代码的表达式几乎是我现在的最后一个想法。谁能给我一个关于如何在这里进行的指示?即使是关于我应该谷歌的提示也会有所帮助,但到目前为止我完全没有想法。
编辑:我不知道这是否是你应该做的,但我已经解决了我的问题,我想我不妨发布我的代码,以防其他人偶然发现这个线程有类似的问题。这是我的解决方案。
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")
请注意,我仍然是一个绝对的初学者,这个解决方案可能效率低下,写得不好,格式混乱,我不知道。我能保证的是它可以完成这项工作。
解决方案
这是对您的代码进行的重构,并进行了以下更改:
- 不要两次定义相同的函数。相反,定义两个单独的函数,并根据所需的语义决定调用哪一个。
- 不要大写变量。大写的名称通常保留给 Python 中的类名。
- 删除最后的
input
. 您的朋友肯定希望您制作一个可以正确重用的程序;要求用户交互破坏了这一点。 - 不要
sys.argv[0]
用于任何事情。如果未使用,则无需捕获它(如果您以后需要它,它仍然存在)。 - 将入口点包装在
if __name__
... 中,以便可以将这段代码import
编辑到另一个程序中而不会产生副作用。
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))))
推荐阅读
- python - Xarray (from grib file) to dataset
- java - Refactoring very similar JDBC prepared statements
- linux - Why xdotool's window position and geometry don't add up to the total size of the display?
- css - 响应式网站不遵守 CSS 百分比
- c# - 重新创建对象和 DI
- ssl - WAMP 服务器 3.2.3
- c - 数组声明是否意味着连续的内存分配?
- python - 元素的无效递归
- compiler-errors - 处理草图未正确编译
- strapi - Strapi - 按 DynamicZone 查询/过滤