首页 > 解决方案 > 如何通过 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")

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

标签: pythonpython-3.xargvsys

解决方案


这是对您的代码进行的重构,并进行了以下更改:

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

推荐阅读