Python бесконечно, пока l oop проблема - PullRequest
0 голосов
/ 04 мая 2020

Я пытаюсь создать сценарий, который запрашивает ввод данных пользователем в Python, предполагается, что он выдаст ошибку «Пожалуйста, введите имя», а затем вернет пользователя в ответ на запрос исходного ввода.

Это не работает, вместо того, чтобы спросить имя и фамилию, если имя не указано для обоих, я брошен в бесконечное число l oop первой ошибки.


# User input for first name
first_name = input('Enter FIRST name here: ')
# User input for last name
last_name = input('Enter LAST name here: ')

def print_name():

    # store user input in separate variable
    fname = first_name
    lname= last_name

    while True:
        # throw error if user enters no first name
        if len(fname) == 0:
            # error msg
            print('No FIRST name entered...')
            # loop back to prompt asking for first name
            continue
        else:
            # if first name given move on to prompting for last name
            # break loop
            break

    # loop into prompting user for last name
    while True:
        # throw error if user enters no last name
        if len(lname) == 0:
            print('No LAST name entered...')
            # loop back to prompt asking for last name
            continue
        else:
            # if last name given move on to running print command
            # break loop
            break

        return fname, lname

    print(f'your name is {fname} {lname}')

print_name()

Пожалуйста, кто-нибудь может помочь мне понять, что здесь происходит не так? Следует только l oop вернуться к запросу имени (или фамилии), когда ничего не указано, в противном случае следует вывести имя пользователя на консоль. оба имени также должны быть заданы, если имя не указано, тогда в первом случае l oop может ожидать ошибку, как и в случае, если фамилия не указана.

Также есть лучший способ сделать это это? использование 2 в то время как циклы кажется неправильным?

Ответы [ 5 ]

3 голосов
/ 04 мая 2020

Не повторяйся. Если вы копируете и вставляете часть кода, остановитесь и подумайте. Это должна быть либо функция, либо al oop.

def wait_for_input(prompt):
    data = ""
    while data == "":
        data = input(prompt).strip()
    return data


def print_name(fname, lname):
    print(f'your name is {fname} {lname}')


first_name = wait_for_input('Enter FIRST name: ')
last_name = wait_for_input('Enter LAST name: ')

print_name(first_name, last_name)

Кроме того, не используйте комментарии, чтобы повторять то, что говорит код.

2 голосов
/ 04 мая 2020

Проблема с вашими бесконечными циклами, вы можете упростить вашу функцию, как:

def print_name():
    first_name = ""
    last_name = ""
    # User input for first name
    while first_name == "":
        first_name = input('Enter FIRST name here: ')
    # User input for last name
    while last_name == "":
        last_name = input('Enter LAST name here: ')
    print(f'your name is {first_name} {last_name}')
1 голос
/ 04 мая 2020

Я не совсем понимаю, зачем вам так много петель. Что-то вроде этого должно сделать:

def print_name():
    fname = input('Enter FIRST name here: ')
    if len(fname) == 0:
        raise Exception('No FIRST name entered...')

    lname= input('Enter LAST name here: ')
    if len(lname) == 0:
        raise Exception('No LAST name entered...')

    print(f"your name is {fname} {lname}")

И если все, что вам нужно, это повторить это l oop, все, что вам нужно сделать, это вставить вашу функцию print_name () в al oop.

РЕДАКТИРОВАТЬ: Теперь, когда я видел другие ответы, я думаю, что @Tomalak ответ лучше, не получал то, что вы действительно хотели.

1 голос
/ 04 мая 2020

У меня сложилось впечатление, что вы новичок в этом:

В то время как циклы обычно выглядят следующим образом:

while <condition>
...
<check_condition>
...

Это означает, что в большинстве случаев в каждый раз l oop выполняется, условие пересчитывается и проверяется снова while.

В вашем случае это может выглядеть примерно так:

while (len(fname) == 0)
<show_error_message>
<get fname again>

Случай, который вы написали здесь (while true) также существует и используется регулярно, но в очень разных случаях, например в многопоточных программах, основанных на событиях:

while true
<get_event>

Это означает, что часть программы (так называемая поток) ожидает события (например, нажатие кнопки), чтобы быть пойман, а затем что-то происходит. Однако в основном это делается в многопоточных приложениях, что означает, что «основная» программа что-то делает, а подпрограмма обрабатывает поступающие события.

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

Попробуйте этот код:

def print_name():

    # store user input in separate variable
    first_name = input('Enter FIRST name here: ')

    fname = first_name



    while True:
        fname = first_name


        # throw error if user enters no first name
        if len(fname) == 0:
            # error msg
            print('No FIRST name entered...')
            first_name = input('Enter FIRST name here: ') 
            # loop back to prompt asking for first name
            continue
        else:
            # if first name given move on to prompting for last name
            # break loop
            break

    # loop into prompting user for last name
    while True:
        last_name = input('Enter LAST name here: ')
        lname= last_name

        # throw error if user enters no last name
        if len(lname) == 0:
            print('No LAST name entered...')
            # loop back to prompt asking for last name
            continue
        else:
            # if last name given move on to running print command
            # break loop
            break

        return fname, lname

    print(f'your name is {fname} {lname}')

print_name()
...