如何通过sys.argv

时间:2019-03-30 00:45:06

标签: python python-3.x argv sys

我是编码的新手(从2天前开始),为了练习,我的一个朋友给我写了一个编写提供第n个斐波那契数或第n个点的序列的程序的任务。我使用input()成功完成了该任务,并直接向用户询问n,现在他扩展了任务,并要求我尝试使用sys.argv

获得相同的结果。

在广泛使用google之后,我想出了如何打印所有给定参数并计算它们的方法,但是我无法弄清楚在函数中使用这些参数的任何方式。不幸的是,我似乎也找不到适合Google的关键字,这让我有点无人问津。

这是我最近的尝试:

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()的代码的表达式几乎是我目前的最后一个想法。谁能给我指点我该如何进行?甚至暗示我应该对Google有所帮助,但到目前为止,我已经完全没有主意了。

编辑:我不知道这是否是您应该做的,但是我已经解决了我的问题,我想我也应该发布我的代码,以防其他人偶然遇到与此类似的问题。 。这是我的解决方法。

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")

请注意,我仍然是一个绝对的初学者,我不知道这种解决方案可能效率低下,编写错误,格式混乱。我所能保证的就是它能完成任务。

2 个答案:

答案 0 :(得分:0)

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

现在,您是破解sys.argv的专家,您可能想要$ pip install click并让该程序包为您做一些解析:https://click.palletsprojects.com/en/7.x/

我想有条件地执行def是一个选项,但有点奇怪。 将相同的定义粘贴到两个if分支中没有帮助。 只需def一次,就可以了。

答案 1 :(得分:0)

以下是对代码的重构:

  • 不要定义相同的函数两次。而是定义两个单独的函数,然后根据所需的语义决定要调用哪个函数。
  • 不要大写变量。大写名称通常是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))))