如何通过sys.argv执行函数

问题描述 投票:1回答:2

我对编码很新(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")

请注意,我仍然是一个绝对的初学者,这个解决方案可能效率低下,写得不好,格式混乱,我不知道。我能保证的是它能完成这项工作。

python python-3.x argv sys
2个回答
0
投票

是的,n = int(sys.argv[2])是魅力。

既然你是破解sys.argv的专家,你可能想要$ pip install click并让那个包为你做一些解析:https://click.palletsprojects.com/en/7.x/

我想,有条件地执行def是一种选择,但有点奇怪。将相同的定义粘贴到两个if分支中是没有用的。只有def它一次,顶部。


0
投票

以下是对代码的重构,包括以下更改:

  • 不要两次定义相同的功能。相反,定义两个单独的函数,并根据所需的语义决定调用哪个函数。
  • 不要将变量大写。通常为Python中的类名保留大写的名称。
  • 删除最后的input。当然,你的朋友希望你制作一个可以正确重复使用的程序;需要用户交互的废话。
  • 不要使用sys.argv[0]。如果它没有被使用,就没有必要捕获它(如果你以后需要它,它仍然存在)。
  • if __name__中包装入口点......这样这段代码可以被imported到另一个没有副作用的程序中。
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))))    
© www.soinside.com 2019 - 2024. All rights reserved.