#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:
Здесь было несколько ошибок, и некоторые другие люди уже указали на них:
cek_login(p)
используетdata
, который представляет собой список словарей, поэтому вам нужно сначала получить доступ к словарю в списке по индексу ([0]
,[1]
, …), а ЗАТЕМ получить доступ к элементу dictionary с обозначением в скобках, например['pin']
data[0]['pin']
является anint
, тогда как результатомinput()
является astr
, поэтому вам нужно ПРЕОБРАЗОВАТЬstr
в anint
с помощьюint(my_str_input)
- Аналогично пункту 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("welcome " data[0]['name'])
5. Ответы только для кода бесполезны. Объясните проблему и решение.