Выход из цикла python for с использованием логического флага, логики и ошибки отступа - PullRequest
0 голосов
/ 15 марта 2019

У меня есть следующий код, который ищет список имен пользователей и просто возвращает вывод «Found in index i» или «Sorry username not found» при первом выводе.

usernames=["u1","u2","u3"]
found=False

while found==False:
  username=input("Enter username:")
  for i in range(len(usernames)):
    if username==usernames[i]:
      found=True
      break

if found==True:
  print("Username found in index:",i)
else:
  print("Sorry,username not found")

Текущий код работает, если имя пользователя верно, но если используются ошибочные данные, например, 23234, то он повторяет вопрос и не переходит к оператору if внизу кода (эточто я хочу).

Может кто-нибудь исправить этот код с объяснением наиболее эффективного способа решения этой проблемы.Скорее всего, это связано с логическим флагом 'found', и я не понимаю, почему он не пробивается и идет к нижней части if.Заранее спасибо

Ответы [ 5 ]

1 голос
/ 15 марта 2019

Вам действительно нужен блок while?

usernames=["u1","u2","u3"]
index = 0
found = False

username = input("Enter username:")
for i in range(len(usernames)):
  if username == usernames[i]:
    found = True
    index = i
    break

if found:
  print("Username found in index:",index)
else:
  print("Sorry,username not found")
1 голос
/ 15 марта 2019

Вам не нужны эти булевы флаги, циклы на основе диапазона или дополнительные, если условия:

usernames=["u1","u2","u3"]

while True:
  user = input("Enter username: ")    
  if user in usernames:
    print("Username found at Index: {}".format(usernames.index(user)))
    break
  else:
    print("Sorry, username not found. Try again")

РЕДАКТИРОВАТЬ :

Но если вы должны продолжить с текущейподход использования цикла for, поместите блок else на внешний цикл for и остановите его, если он найден:

usernames = ["u1","u2","u3"]
found = False

while found == False:
  username = input("Enter username: ")
  for i in range(len(usernames)):
    if username == usernames[i]:
        print("Username found at Index: {}".format(i))
        break
  else: # not and indentation error
        print("Sorry, username not found. Try again")

EDIT 2 : (без логических флагов)

usernames = ["u1","u2","u3"]

while True:
  username = input("Enter username: ")
  for i in range(len(usernames)):
    if username == usernames[i]:
        print("Username found at Index: {}".format(i))
        break
  else: # not and indentation error
        print("Sorry, username not found. Try again")

ВЫХОД (во всех случаях):

Enter username: 2334
Sorry, username not found. Try again
Enter username: u2
Username found at Index: 1
0 голосов
/ 15 марта 2019

Это лучшая версия

usernames = ["u1", "u2", "u3"]

while True:
    username = input("Enter username:")

    if username in usernames:
        print("Username found in index:", usernames.index(username))
        break
    else:
        print("Sorry,username not found")

Редактировать по запросу:

usernames = ["u1", "u2", "u3"]
found = False

while found is False:
    found = False
    username = input("Enter username:")

    for i in range(len(usernames)):
        if usernames[i] == username:
            print("Username found in index:", i)
            found = True
            break

    if found is False:
        print("Sorry,username not found")
0 голосов
/ 15 марта 2019

Ваш код просто никогда не достигнет второго, если, поскольку он предназначен для достижения только второго if, если введено правильное имя пользователя.

Вы должны решить либо продолжать запрашивать имя пользователя, пока не введете правильное имя (это то, что вы делаете в бите while found == true).

Или вы спросите только один раз и посмотрите, найден ли он, для этого вам нужно удалить часть while found == true.

Я вижу, что вы имели в виду, вероятно, то, что сделал DirtyBit: https://stackoverflow.com/a/55183057

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

while found==False: делает это циклом, пока found не станет True.Поэтому, если он не находит имя пользователя, которое вы ищете, он зацикливается и снова спрашивает вас.

Кроме того, если вы хотите увидеть, существует ли строка в списке, просто используйте list.index() method :

username=input("Enter username:")
try:
    i = usernames.index(username)
except ValueError:
    print("Sorry,username not found")
else:
    print("Username found in index:",i)
...