Почему итератор python выводит только первое ключ-значение словаря?
Есть код итерации словаря, при выполнении которого итератор проходит только по первым ключ-значениям, хотя в словаре их больше. Почему так и как это исправить?
Код
address_book_file = open("address_book_file", "rb") # Открытие файла с словарем
dict_contact = pickle.load(address_book_file) #Загрузка файла
for name, address in dict_contact.items(): # Итерация словаря
print(dict_contact) # Весь словарь
print(name, address) # Вывод итерации
Вывод
{'Mom': '[email protected]', 'Dad': '[email protected]', 'Sam': '[email protected]', 'kek': '[email protected]'}
Mom [email protected]
p.s
Пробовал играться с keys() и values(), но всё тщетно
upd
Больше кода
def search_contact():
address_book_file = open("address_book_file", "rb")
file_empty = os.path.getsize("address_book_file") == 0
if not file_empty:
search_name = input("Введите имя для поиска: ")
dict_contact = pickle.load(address_book_file)
for name, address in dict_contact.items():
print(dict_contact)
print(name, address)
if search_name == name:
print('\nКонтакт: {0}, с адресом {1}'.format(search_name, dict_contact[name]))
else:
print('Этого здесь нет')
return
else:
print('Нет контактов')
address_book_file.close()
Ответы (1 шт):
Автор решения: CrazyElf
→ Ссылка
Итерация у вас завершается досрочно из-за return в блоке else:
else:
print('Этого здесь нет')
return # после этого итерация прекращается
Лучше не перебирать все ключи словаря для поиска нужного ключа, а сразу моментально проверить наличие ключа в словаре (для чего словари собственно и предназначены):
if search_name in dict_contact:
print('\nКонтакт: {0}, с адресом {1}'.format(search_name, dict_contact[search_name]))
else:
print('Этого здесь нет')
И файл лучше открывать с помощью менеджера контекста, тогда он потом закроется автоматически по завершении блока кода:
with open("address_book_file", "rb") as address_book_file:
# остальной код