Почему здесь не работает функция l oop и выдает ошибку - PullRequest
0 голосов
/ 11 июля 2020
row1=['a ','b ','c ']
row2=[' d',' e','f ']
row3=['g ','h ',' i']


def myfunc():
    a=' '
    while a not in (list(range(1,10))):
        a=int(input('Enter a  number between 1 to 9'))

        if a==1:
            return row1[0]
        elif a==2:
            return row1[1]
        elif a==3:
            return row1[2]
        elif a==4:
            return row2[0]
        elif a==5:
            return row2[1]
        elif a==6:
            return row2[2]
        elif a==7:
            return row3[0]
        elif a==8:
            return row3[1]
        elif a==9:
            return row3[2]

Здесь нормально, когда я набираю числа (1-9), но когда я набираю что-то неправильное, я ожидаю, что мой оператор будет повторяться до тех пор, пока он не получит правильно. Но этого не происходит. Отображается ошибка.

Ответы [ 4 ]

1 голос
/ 11 июля 2020

Предположим, вы собираетесь ввести в качестве входных данных что-то помимо чисел, поэтому вы получите сообщение об ошибке при вычислении int. Вы должны использовать блок try/except следующим образом:

row1=['a ','b ','c ']
row2=[' d',' e','f ']
row3=['g ','h ',' i']


def myfunc():
    a=' '

    while a not in (list(range(1,10))):
        try:
            a=int(input('Enter a  number between 1 to 9'))
        except ValueError:
            continue

        if a==1:
            return row1[0]
        elif a==2:
            return row1[1]
        elif a==3:
            return row1[2]
        elif a==4:
            return row2[0]
        elif a==5:
            return row2[1]
        elif a==6:
            return row2[2]
        elif a==7:
            return row3[0]
        elif a==8:
            return row3[1]
        elif a==9:
            return row3[2]

Таким образом, когда пользователь вводит строку, которая не может быть преобразована в int, возникшее исключение не завершает вашу программу.

1 голос
/ 11 июля 2020

Это намного проще, если вы используете явный оператор continue и немного модульной арифметики c

def myfunc():
    
    while True:
        
        a=int(input('Enter a  number between 1 to 9'))
        if a not in range(1,10):
            continue

        # E.g., divmod(5-1, 3) == 1, 1
        row, index = divmod(a-1, 3)

        # select the row
        if row == 0:
            row = row1
        elif row == 1:
            row = row2
        else:
            row = row3

        # return the element of the selected row
        return row[index]
0 голосов
/ 11 июля 2020

Коротко и мило.

row1=['a ','b ','c ']
row2=[' d',' e','f ']
row3=['g ','h ',' i']

def myfunc():
    a=0
    while not (1<=a<=9):
        try:
            a=int(input('Enter a  number between 1 to 9: '))
        except ValueError as e:
            print ("Illegal entry.")
    r,i=divmod(a-1)
    return [row1,row2,row3][r][i]
0 голосов
/ 11 июля 2020

ваша проблема в том, что вы пытаетесь разобрать String на Int. Но это может потерпеть неудачу, поэтому int() выдает ошибку. Вы можете поймать эту ошибку и continue, чтобы получить следующий ввод. Это должно сработать. И ваш отступ неверен (вероятно, это ошибка копирования и вставки)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...