как войти в систему с помощью Pin-кода

#python

#python

Вопрос:

 status_login = False
use_atm = "y"

 data =[{"norek":932012042,
                "pin":123,
                "name":"grizly",
                "bank":"BCA",
                "balance":5000000},
                {"norek":932012052,
                "pin":1234,
                "name":"Basuki Pepeh",
                "bank":"BRI",
                "balance":4000000},
                {"norek":932012099,
                "pin":1235,
                "name":"Bambang Gentolet",
                "bank":"Mandiri",
                "balance":3500000}]
def cek_login(p):
    for login in data:
        if login['pin'] == p:
            return login
    return False  

while use_atm == "y":
    while status_login == False:
        print("Welcome to ATM")
        print("insert your pin")
        pin = input("PIN : ")
        if cek_login(pin) != False:
            print("welcome " cek_login(pin)['name'])
            status_login = True
        else:
            print("")
            print("Ops Your PIN is wrong")
            print("")
            print("")
 

Я хочу войти в систему с помощью PIN-кода, но почему результат всегда неправильный, что не так с приведенным выше кодом

Добро пожаловать в банкомат введите свой PIN-код PIN-код: 123

Ops Ваш PIN-код неверен

Комментарии:

1. pin в ваших данных целое число. pin в вашем вводе есть str . Они никогда не будут сравниваться равными. Научитесь использовать исходный отладчик для поиска логической проблемы.

Ответ №1:

PIN-код в ваших данных — int.

ввод — str.

str не равно int .

 pin = int(input("PIN : "))
 

Ответ №2:

Ваше сравнение не cek_login выполняется, поэтому выведите значения с использованием repr() и посмотрите, почему они не сравниваются. Обратите внимание, что это repr() дает отладочное представление данных, чтобы было легче обнаружить различия:

 def cek_login(p):
    for login in data:
        print(repr(long['pin']),repr(p))   # see why they don't compare
        if login['pin'] == p:
            return login
    return False  
 

Вы увидите:

 Welcome to ATM
insert your pin 123
123 '123'                # note integer versus string (quoted).
1234 '123'
1235 '123'
 

Преобразуйте входные данные в целое число, чтобы устранить проблему.

 pin = int(input("PIN : "))
 

Вы также обнаружите, что после правильного ввода PIN-кода вы войдете в бесконечный цикл, потому use_atm что он никогда не меняется.

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

Ответ №3:

Здесь было несколько ошибок, и некоторые другие люди уже указали на них:

  1. cek_login(p) использует data , который представляет собой список словарей, поэтому вам нужно сначала получить доступ к словарю в списке по индексу ( [0] , [1] , …), а ЗАТЕМ получить доступ к элементу dictionary с обозначением в скобках, например ['pin']
  2. data[0]['pin'] является an int , тогда как результатом input() является a str , поэтому вам нужно ПРЕОБРАЗОВАТЬ str в an int с помощью int(my_str_input)
  3. Аналогично пункту 1, оператор print в цикле while, который печатает имя пользователя, должен сначала получить доступ к индексу в списке ( data ), прежде чем обращаться к значению словаря ( [name] )

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

 status_login = False
use_atm = "y"

data =[{"norek":932012042,
                "pin":123,
                "name":"grizly",
                "bank":"BCA",
                "balance":5000000},
                {"norek":932012052,
                "pin":1234,
                "name":"Basuki Pepeh",
                "bank":"BRI",
                "balance":4000000},
                {"norek":932012099,
                "pin":1235,
                "name":"Bambang Gentolet",
                "bank":"Mandiri",
                "balance":3500000}]
def cek_login(p):
    print(int(p))
    print(data[0]['pin'])
    if data[0]['pin'] == int(p):
        return True
    return False  

while use_atm == "y":
    while status_login == False:
        print("Welcome to ATM")
        print("insert your pin")
        pin = input("PIN : ")
        if cek_login(pin) != False:
            print("welcome "  data[0]['name'])
            status_login = True
            use_atm = "n"
        else:
            print("")
            print("Ops Your PIN is wrong")
            print("")
            print("")
 

Комментарии:

1. cek_login — это функция. Проблема не в этом. У @Mark Tolonen это правильно. Он сравнивает str с int, который никогда не будет успешным.

2. извините, изменил ответ, попробуйте обновленный сейчас 🙂

3. обновлено еще раз, пожалуйста, проверьте сейчас! запуск кода должен работать, протестирован в python3

4. были дополнительные ошибки cek_login(p) как в самом print заявлении, так и в нем. Исправлена инструкция print на print("welcome " data[0]['name'])

5. Ответы только для кода бесполезны. Объясните проблему и решение.