Простой список контактов на Python

#python

#python

Вопрос:

Похоже, мой код не работает. Это создаст максимум один словарь. Если вы создадите другое имя и номер, он же словарь, он заменит текущий.

Вот мой код:

 list = {}

def start():
    print "Welcome to Contact  n nPlease enter your name: ",
    name = raw_input()
    print "Hi "   name   " would you like to check your current contacts or make new ones? nTo make new contacts type in 'New' nTo check current contacts type in 'Contacts'"
    print "Go to: ",
    choose = ""
    choose = raw_input()
    valid = False
    while(not valid):
        if choose == "'New'" or choose == "'new'" or choose == "New" or choose == "new":
            new_function()
        elif choose == "'Contacts'" or choose == "'contacts'" or choose == "Contacts" or choose == "contacts":
            contacts_function()

def new_function():
    global list
    list = {}
    print "nPlease input the name: ",
    contact_name = raw_input()
    print "Please input the number: ",
    contact_number = raw_input()
    list.update({contact_name:contact_number})
    print "Contact created nnWould you like to make more contacts or check current contacts? nTo make new contacts type in 'New' nTo check current contacts type in 'Contacts'"
    print "Go to: ",
    choose = ""
    choose = raw_input()
    valid = False
    while(not valid):
        if choose == "'New'" or choose == "'new'" or choose == "New" or choose == "new":
            new_function()
        elif choose == "'Contacts'" or choose == "'contacts'" or choose == "Contacts" or choose == "contacts":
            contacts_function()

def contacts_function():
    global list
    for keys,values in list.items():
        print "n---------------------------------------------------------"
        print str("Name: ")   str(keys)
        print str("Number: ")   str(values)
        print "---------------------------------------------------------n"
    print "Would you like to make more contacts or check current contacts? nTo make new contacts type in 'New' nTo check current contacts type in 'Contacts'"
    print "Go to: ",
    choose = ""
    choose = raw_input()
    valid = False
    while(not valid):
        if choose == "'New'" or choose == "'new'" or choose == "New" or choose == "new":
            new_function()
        elif choose == "'Contacts'" or choose == "'contacts'" or choose == "Contacts" or choose == "contacts":
            contacts_function()

start()
  

Извините, если это глупый вопрос, я все еще новичок в программировании.

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

1. Почему у вас есть словарь под названием list?

2. Ваши raw_input инструкции должны находиться внутри ваших while циклов. Если вы неправильно напишете команду, ваша программа будет бесконечно повторять while как есть. Кроме того, raw_input().lower() это поможет ограничить ваши if сравнения.

Ответ №1:

При каждом вызове new_function() вы делаете это:

 list = {}
  

Которые заменяют содержимое списка пустым словарем!

Просто удалите эту строку.


Поскольку вы новичок в программировании, позвольте мне указать на несколько других проблем с вашим кодом:

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

Взгляните на это и посмотрите, чему вы можете научиться из этого:

 def start():
    ...
    print "Hi "   name
    while True:
        print "Would you like to make more contacts or check current contacts? nTo make new contacts type in 'New' nTo check current contacts type in 'Contacts'"
        print "Go to: ",
        choose = raw_input().lower()
        if choose == "new":
            new_function()
        elif choose == "contacts":
            contacts_function()
  

Затем вы можете удалить этот повторяющийся код из конца new_function и contacts_function .

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

Наконец, обычно считается плохой практикой использовать глобальные данные подобным образом. Рассмотрите возможность объявления вашего словаря списка контактов в start() и передачи его в качестве параметра в new_function и contacts_function .

Ответ №2:

Вы выполняете сброс list при каждом вызове new_function :

 def new_function():
    global list
    list = {}
  

Который повторно привязывается list для указания на новый словарь, удалите эту строку. Если все, что вы делаете, это добавляете новые ключи в словарь, вам даже не нужна global строка здесь.

Далее по тексту строка:

 list.update({contact_name:contact_number})
  

действительно, правильно добавит новую запись в словарь. Использование dict.update() для добавления одной записи является излишним, однако вместо этого вы можете просто назначить ключ:

 list[contact_name] = contact_number
  

Обратите внимание, что использование list в качестве переменной — плохая идея, вы маскируете встроенный тип. Лучшим названием было бы contacts .