Как использовать словарь в качестве базы данных для паролей в Python - PullRequest
0 голосов
/ 04 июля 2018
print("Please confirm your identity user(lower case):")
pins = {"abra":9999,"anna":1888}
name = input("")
print("Now please confirm you pin:")
pin = int(input(">>"))
if pin == pins.value[0] and name == pins.keys[0]
    print("You are great")
elif pin == pins.value[1] and name == pins.keys[1]
    print("you are dumb")

Теперь я хочу сопоставить введенные пользователем данные со словарем, который я уже сохранил в памяти. Пожалуйста, помогите мне с функциями, которые помогут мне сделать это. Также, пожалуйста, предложите мне любой другой способ, которым я могу это сделать.

Ответы [ 2 ]

0 голосов
/ 04 июля 2018

Я бы использовал другой метод.

for key, val in pins.items():
    if name == key:
        if val == pin:
            if name == 'abra':
                print('You are great!')
                break
            if name == 'anna':
                print('You are dumb!')
                break
    else:
        print('Incorrect username or pin, please try again.')

Для ясности: pins.items() распакует в заданные ключевые слова "key" & "val", так что вы сможете перебирать весь словарь.

Это поможет, если вы добавили 100 пользователей в свой словарь. Это означало бы, что единственное, что вам нужно изменить, это приветственные сообщения в зависимости от пользователя.

Вы можете сделать еще один шаг и составить список оскорблений, а затем случайным образом выбрать одно из списка, если Анна вошла в систему. Google random.choice(), поскольку это не связано с вашим первоначальным вопросом.

Функция / вывод для вашего метода:

def test_func_1(db=userpins):
               start_time = time.time()
               name = 'testname14'
               pin = 1248
               if db[name] == pin:
                   print('authenticated!')
               print("--- %s seconds ---" % (time.time() - start_time))

Выход:

test_func_1()

authenticated!
--- 0.048806190490722656 seconds ---

И функция / выход для моей функции:

def test_func_2(db=userpins):
               start_time = time.time()
               db = db.items()
               name = 'testname14'
               pin = 1248
               for user, pin_c in db:
                   if user == name:
                       if pin_c == pin:
                           print('authenticated')
               print("--- %s seconds ---" % (time.time() - start_time))

Выход:

test_func_2()

authenticated
--- 0.048050880432128906 seconds ---

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

Мне пришлось немного подправить. Таким образом, вместо того, чтобы распаковывать во время цикла for, мы делаем это непосредственно перед началом цикла. Затем мы перебираем список имен, соответствующих только имени, если имя совпадает, мы можем затем проверить пин-код.

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

Я также позволил себе составить словарь "булавки" в 50 раз. Я дам вам этот список здесь, на случай, если вы захотите проверить их:

{'testname1': 1235, 'testname2': 1236, 'testname3': 1237, 'testname4': 1238, 'testname5': 1239, 'testname6': 1240, 'testname7': 1241, 'testname8': 1242, 'testname9': 1243, 'testname10': 1244, 'testname11': 1245, 'testname12': 1246, 'testname13': 1247, 'testname14': 1248, 'testname15': 1249, 'testname16': 1250, 'testname17': 1251, 'testname18': 1252, 'testname19': 1253, 'testname20': 1254, 'testname21': 1255, 'testname22': 1256, 'testname23': 1257, 'testname24': 1258, 'testname25': 1259, 'testname26': 1260, 'testname27': 1261, 'testname28': 1262, 'testname29': 1263, 'testname30': 1264, 'testname31': 1265, 'testname32': 1266, 'testname33': 1267, 'testname34': 1268, 'testname35': 1269, 'testname36': 1270, 'testname37': 1271, 'testname38': 1272, 'testname39': 1273, 'testname40': 1274, 'testname41': 1275, 'testname42': 1276, 'testname43': 1277, 'testname44': 1278, 'testname45': 1279, 'testname46': 1280, 'testname47': 1281, 'testname48': 1282, 'testname49': 1283, 'testname50': 1284, 'testname51': 1285, 'testname52': 1286, 'testname53': 1287, 'testname54': 1288, 'testname55': 1289, 'testname56': 1290, 'testname57': 1291, 'testname58': 1292, 'testname59': 1293, 'testname60': 1294, 'testname61': 1295, 'testname62': 1296, 'testname63': 1297, 'testname64': 1298, 'testname65': 1299, 'testname66': 1300, 'testname67': 1301, 'testname68': 1302, 'testname69': 1303, 'testname70': 1304, 'testname71': 1305, 'testname72': 1306, 'testname73': 1307, 'testname74': 1308, 'testname75': 1309, 'testname76': 1310, 'testname77': 1311, 'testname78': 1312, 'testname79': 1313, 'testname80': 1314, 'testname81': 1315, 'testname82': 1316, 'testname83': 1317, 'testname84': 1318, 'testname85': 1319, 'testname86': 1320, 'testname87': 1321, 'testname88': 1322, 'testname89': 1323, 'testname90': 1324, 'testname91': 1325, 'testname92': 1326, 'testname93': 1327, 'testname94': 1328, 'testname95': 1329, 'testname96': 1330, 'testname97': 1331, 'testname98': 1332, 'testname99': 1333}

Вот скриншот с результатами "testuser99"

0 голосов
/ 04 июля 2018

Вы получите имя, я бы просто получил пин-код, используя это:

if pins[name] == int(pin) #input gives you a string

это вызовет исключение, если naem не в булавках, так что вы можете поймать это и использовать его, чтобы сообщить пользователю, что имя неверно.

В качестве альтернативы вы можете использовать safe pins.get (name), который не даст вам ничего, если имя не существует.

> pins = {"abra": 9999, "anna": 1888}
> pin = input ("")
1888
> int (pin) == pins ['anna']
True

...