2016-10-05 4 views
1

連絡先を表示、追加、削除して、電話メニューのプロジェクトを作成しようとしています。辞書に連絡先を追加したり、新しいファイルを作成したり、そこから書込み/読んだりすることで、どちらの方が良いでしょうか?電話メニュー - Python 3

空の辞書に新しい連絡先を追加してから、表示オプションを使用して表示しようとしましたが、まだ辞書が空です。

私の「プロジェクト」の最初のサンプルです:

condition = True 


while condition == True: 
    print("Menu") 
    print("contacts") 
    print("Add contacts") 
    print("Remove contacts") 

    phone_contacts = {} 

    def contacts(x): 
     for item in dict(x): 
      print(item, x[item]) 


    def add_contacts(x): 
     new_key = input("Enter a name\n") 
     new_value = input("Enter a number\n") 
     x[new_key] = new_value 
     print(phone_contacts) 


    def remove_contacts(x): 
     for item in dict(x): 
      print(item) 
     removing_contact = input("Enter a contact to remove\n") 
     if removing_contact in x: 
      del x[removing_contact] 
      print("Contact has been deleted!") 
     else: 
      print("There is no '%s\' contact!") % (removing_contact) 


    choose = input("Select option") 

    if choose == "1": 
     print(contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

    elif choose == "2": 
     print(add_contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

    elif choose == "3": 
     print(remove_contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 
    else: 
     print("You didn't type anything!") 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

ので、この方法は動作しません、私もそれにはない

condition = True 


while condition == True: 
    print("Menu") 
    print("contacts") 
    print("Add contacts") 
    print("Remove contacts") 

    phone_contacts = {} 

    def contacts(x): 
     for item in dict(x): 
      print(item, x[item]) 


    def add_contacts(x): 
     new_key = input("Enter a name\n") 
     new_value = input("Enter a number\n") 
     text = "%s - %d" % (new_key, int(new_value)) 
     savefile = open("text.txt", "w") 
     savefile.write(text) 
     savefile.read(text) 
     savefile.close() 

    def remove_contacts(x): 
     for item in dict(x): 
      print(item) 
     removing_contact = input("Enter a contact to remove\n") 
     if removing_contact in x: 
      del x[removing_contact] 
      print("Contact has been deleted!") 
     else: 
      print("There is no '%s\' contact!") % (removing_contact) 


    choose = input("Select option") 

    if choose == "1": 
     print(contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

    elif choose == "2": 
     print(add_contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

    elif choose == "3": 
     print(remove_contacts(phone_contacts)) 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 
    else: 
     print("You didn't type anything!") 
     choose_2 = input("End/Back to MENU").lower() 
     if choose_2 == "end": 
      break 
     elif choose_2 == "menu": 
      pass 

TEXT.TXTファイルに書き込みをしようとしましたどちらも動作しません。

どちらの場合でも私は間違っていますか?どのようにすれば、最初から2番目のものを選ぶべきですか?

私はこれらのヒントが問題に関係していない場合でも、私は自分のコードを修正することができますどのようなヒントに感謝します。

答えて

0

両方のオプションで、すべての繰り返しで辞書を上書きしています。ループの外側で一度だけ初期化する必要があります。最初のオプションは、次のようになります。

0

メインの前後にあるすべての機能を定義する必要があります(真)。 ifsブロックを入力を受け取る関数に変換する必要があります。 どのキーがどのオプションであるかを明示する必要があります。

list1=['a','b','c'] 

def operateList(number): 
    if number == '3': 
     try: list1.remove(input('Type what you want to remove:')) 
     except: print('not in List') 
    elif number == '2': 
     list1.append(input('Type in what you want to add:')) 
     list1.sort() 
    elif number == '1': 
     print(list1) 



while(True): 
    print('1: List') 
    print('2: Add') 
    print('3: Remove') 
    operateList(input('Input option number:')) 
0

最初に、phone_contactsとループ外の関数を宣言する必要があります。

第2に、条件に冗長性があります。

連絡先を保存するためのファイルを作成するというアイデアは素晴らしいです。私は.jsonファイルとして保存するのはとても簡単です。

ここに私がリファクタリングしたコードがあります。

import json 


phone_contacts = {} 


def print_contacts(): 
    if not phone_contacts: 
     print("Empty list.") 
     return 

    for name, number in sorted(phone_contacts.items()): 
     print(name, number) # explicit is better than implicit 


def add_contact(): 
    name = input("Enter a name\n") 
    number = input("Enter a number\n") 
    if name and number: 
     phone_contacts[name] = number 
     print("Contact added: {0}, {1}".format(name, number)) 


def remove_contacts(): 
    print_contacts() 
    removing_contact = input("Enter a contact to remove\n") 
    if removing_contact in phone_contacts: 
     del phone_contacts[removing_contact] 
     print("Contact has been deleted!") 
    else: 
     print("There is no '%s' contact!") % (removing_contact) 


def load_contacts(): 
    global phone_contacts 
    try: 
     with open('contacts.json', 'r') as file: 
      phone_contacts = json.load(file) 
    except (ValueError, OSError): # OSError catches FileNotFoundError 
     phone_contacts = {} 


def save_contacts(): 
    with open('contacts.json', 'w+') as file: 
     json.dump(phone_contacts, file) 


load_contacts() 
while True: 
    print("0. Exit") 
    print("1. Menu") 
    print("2. Add contact") 
    print("3. Remove contacts") 

    choose = input("Select option: ") 

    if choose == "0": 
     print("Exiting program...") 
     break 
    elif choose == "1": 
     print_contacts() 
    elif choose == "2": 
     add_contact() 
    elif choose == "3": 
     remove_contacts() 
    else: 
     print("You didn't type a valid option!") 

    # moved this block out as it's common to all options 
    choose_2 = input("End/Back to MENU\n").lower() 
    if choose_2 == "end": 
     break 
    # even if user typed anything different of menu 
    # he/she would continue in the loop so that else was needless 
save_contacts() 

また、phone_contactsはグローバルであるため引数として渡す必要はありません。

JSONの経験がなくても、わかりやすい読み込み機能と連絡先保存機能を追加しました。

疑問があり、私に尋ねたいと思っている場合は、心地よく感じてください。 ;)

+0

私を助けてくれてありがとう!コードでこの "try/except"メソッドを使用した理由を教えてください。私はそれについていくつかの情報を見つけようとしましたが、私はそれを得ていません。私はそれを使用する必要があり、目的は何ですか? –

+0

try/exceptは、プログラム内のエラーを処理するために使用されます。この例外がアプリケーションをクラッシュさせるのを避けるために、プログラムが予期しない方法で実行されるような処理を行うときはいつでも、このメソッドを使用してください。この場合、たとえば、try/exceptを使用して、存在しない可能性のあるファイルに存在しない可能性のあるコンテンツを読み取りました。したがって、例外が発生すると、コードは空の辞書を作成します。 try/except文を削除して、ディレクトリにファイルcontacts.jsonの有無にかかわらずコードを実行してください。また、[許してください](https://docs.python.org/3.4/glossary.html#term-eafp) –