Как обновить глобальную переменную на основе количества пользовательских входов? - PullRequest
1 голос
/ 02 мая 2020

Я пытаюсь составить список весов, которые везут в путешествие в космос. То, как я пытался показать, сколько людей приходит, таково:

def flcr():
    try:
        Value1 = int(input())
    except ValueError:
        print("That was an incorrect format! Try again.")
        flcr()
    global x
    x = Value1

Затем пользователь должен вводить веса один за другим. Вот что я попробовал:

def enter():
    print("How much is each flight crew member bringing on the trip? Enter one entry at a time, this will be Earth weight.")
    amount1()
def amount1():
    try:
        if x > 0:
            equation1 = [float(input())]
            x - 1
            amount1()
        else:
            print(listFlcr)
    except ValueError:
        print("That was an incorrect format! Try again.")
        enter()

Когда я вводил веса, я предполагаю, что x просто сбрасывает себя, а не вычитает себя на 1, поэтому мой ввод бесконечен. Я хочу иметь код, который позволит мне ввести правильное количество весов, поэтому, если я скажу, что приходят 2 человека, я могу ввести только два веса.

Если бы кто-нибудь мог мне помочь, я был бы очень признателен!

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

Вам не нужно глобальное значение перед сравнением x в этой функции.

Как правило, мне проще называть вещи, которые я хочу глобальными, globals()[‘x’]. Таким образом, я знаю, что ничего странного не произойдет. Если globals () ссылается на глобальное пространство имен, представленное аналогично словарю, globals () ['x'] всегда будет указывать на глобальную переменную x.

Если предполагается, что она глобальная, объявите ее перед все остальное. За пределами всех функций x = None, или x = 0, или x = ''.

0 голосов
/ 02 мая 2020

Существует ряд проблем с вашей текущей реализацией.

  1. Вы используете рекурсию для повторного получения входных данных, что означает, что у вас есть функция (flcr, amount1), который вызывает себя до тех пор, пока не будут введены правильные данные. Хотя это может работать для пользовательских вводов, обычно это не нужно. Существуют лучшие способы запрашивать ввод данных пользователем, пока они не дадут действительный ответ , а в качестве , упомянутого в комментариях , вместо этого используйте al oop.

  2. Код x-1 не обновляется x. Это на самом деле ничего не делает, потому что результат нигде не сохраняется. Если вы используете IDE или линтер, он может предупредить вас, что это «бессмысленное утверждение». То, что вы, вероятно, хотели, было x = x - 1. enter image description here

  3. Вы используете глобальные переменные для отслеживания того, сколько весов необходимо ввести и сколько было введено до сих пор. Хотя это может также работать, оно снова не нужно. Было бы проще просто передать число членов летного экипажа в качестве аргумента функции .

Вот решение, которое заменяет рекурсивные вызовы циклами while и получает число людей из одной функции, а затем передает результат этого другой функции для получения весов:

def get_num_people():
    while True:
        try:
            return int(input("How many people are coming? "))
        except ValueError:
            print("That was an incorrect format! Try again.")

def get_weights(num_weights):
    print("How much is each flight crew member bringing on the trip?")
    all_weights = []
    while len(all_weights) < num_weights:
        try:
            all_weights.append(int(input()))
        except ValueError:
            print("That was an incorrect format! Try again.")

    print(all_weights)
    return all_weights

num_people = get_num_people()
get_weights(num_people)

Вот пример выходных данных:

$ python test.py
How many people are coming? 2
How much is each flight crew member bringing on the trip?
12
33
[12, 33]

$ python test.py
How many people are coming? 3
How much is each flight crew member bringing on the trip?
abc
That was an incorrect format! Try again.
89
def
That was an incorrect format! Try again.
100
4
[89, 100, 4]

Я знаю, что ваш вопрос был о том, как обновить глобальную переменную на основе пользовательских данных, ... но я думаю, что у вас есть глобальная x потому что вы использовали рекурсивные вызовы. Решение cleaner состоит в том, чтобы избавиться как от рекурсии, так и от глобальной переменной.

0 голосов
/ 02 мая 2020

попробуйте заменить:

Value1 = int(input()) 

на:

Value1 = int(str(input("")))
...