Как мне выполнять функции через sys.argv - PullRequest
1 голос
/ 30 марта 2019

Я очень новичок в кодировании (началось 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") 

(Мелкая деталь,хотя это и неважно: я перевел строки с немецкого на английский, и поэтому вместо «{} st / nd / rd / th» вместо «{} 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")

Обратите внимание, что я все еще абсолютный новичок, и это решение может быть неэффективным, плохо написанным, запутанно отформатированным, я бы не знал.Все, что я могу гарантировать, это то, что он выполняет свою работу.

Ответы [ 2 ]

0 голосов
/ 30 марта 2019

Вот рефакторинг вашего кода со следующими изменениями:

  • Не определяйте одну и ту же функцию дважды. Вместо этого определите две отдельные функции и определите, какую из них вызывать, в зависимости от желаемой семантики.
  • Не используйте заглавные буквы в переменных. Имена с заглавными буквами обычно зарезервированы для имен классов в 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))))    
0 голосов
/ 30 марта 2019

Да, n = int(sys.argv[2]) было обаянием.

Теперь, когда вы разбираетесь в взломе sys.argv, вы можете захотеть $ pip install click и позволить этому пакету выполнить для вас часть анализа:https://click.palletsprojects.com/en/7.x/

Условное выполнение def - вариант, я полагаю, но немного странный.Вставка одного и того же определения в обе ветки if не помогает.Просто def это один раз, наверх.

...