如何通过执行函数系统参数

2024-09-29 20:17:19 发布

您现在位置:Python中文网/ 问答频道 /正文

我对编码非常陌生(两天前开始),为了练习,一个朋友给了我一个任务,写一个程序,提供第n个斐波那契数或第n个点的序列。我使用input()成功地完成了该任务,并直接向用户请求n,现在他扩展了该任务,并让我尝试使用input()获得相同的结果系统argv你知道吗

在广泛使用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") 

(小细节,虽然不重要:我把字符串从德语翻译成英语,这也是为什么它说“{}。值“而不是”{}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")

请注意,我仍然是一个绝对的初学者,这个解决方案可能是低效的,写得不好,格式混乱,我不知道。我能保证的就是它能胜任。你知道吗


Tags: fromimportinput参数valuedefsysmath
2条回答

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

  • 不要两次定义同一个函数。相反,定义两个单独的函数,并根据所需的语义决定调用哪一个。你知道吗
  • 不要大写变量。在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))))    

是的,n = int(sys.argv[2])就是魅力所在。你知道吗

既然您是破解sys.argv的专家,您可能希望$ pip install click让该包为您执行一些解析:https://click.palletsprojects.com/en/7.x/

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

相关问题 更多 >

    热门问题