|
|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 ooxx7788 于 2017-2-22 10:39 编辑
以下是我根据25课课后题目进行的一个延伸,把通讯录保存在本地文件里面。
但是其中def open_contact(): 中使用了 global来定义全局变量。
但是我试过了,只有在位置1(50行)定义的时候,程序才能顺利执行。
位置2(55行):按照我的理解,如果在 def open_contact(): 执行else条件的时候,那就没有声明全局变量,那contact应该只是局部变量,为什么程序反而能够继续执行呢?
位置3(60行):我想在def open_contact(): 执行之前就先声明全局变量,但是也不能成功。我想知道为什么?
还有个问题,我这里的文件是采用的,打开读取或写入后立即关闭,不知道这是不是合理?还是说应该在整个程序结束后再关闭?
还有,悬赏怎么设置?
- """
- 0.尝试利用字典的特性编写一个通讯录程序。
- """
- import os
- import json
- def add_contact():
- contact_name = input('请输入联系人姓名:')
- if contact_name in contact:
- print('该联系人已存在!%s -->%s' % (contact_name, contact[contact_name]))
- choice_yn = input('是否修改用户资料(Y/N):')
- while choice_yn not in ['Y', 'N']:
- choice_yn = input('输入错误,请重新输入!是否修改用户资料(Y/N):')
- if choice_yn == 'Y':
- fix_contact(contact_name)
- elif choice_yn == 'N':
- return
- else:
- fix_contact(contact_name)
- def fix_contact(contact_name):
- contact[contact_name] = input('请输入用户联系电话:')
- contact_save()
- print('已保存!')
- def contact_save():
- with open(r'E:\通讯录.txt', 'w') as f:
- json.dump(contact, f)
- f.close()
- def menu():
- doc = ("""
- |---欢迎进入通讯录程序---|
- |---1:查询联系人资料 ---|
- |---2:插入新的联系人 ---|
- |---3:删除已有联系人 ---|
- |---4:退出通讯录程序 ---|
- """)
- print(doc)
- def open_contact():
- if not os.path.exists(r'E:\通讯录.txt'):
- global contact # 位置1
- contact = {}
- contact_save()
- else:
- with open(r'E:\通讯录.txt') as f:
- # global contact #位置2
- contact = f.read()
- contact = json.loads(contact)
- f.close()
- # global contact #位置3
- open_contact()
- menu()
- while True:
- choice = input('请输入相关的指令代码:')
- if choice == '1': # 查询联系人
- contact_name = input('请输入联系人姓名:')
- print('%s : %s' % (contact_name, contact.get(contact_name, '未找到该联系人!')))
- while not contact.get(contact_name, False): # 询问是否添加不存在的联系人
- choice_YN = input('是否需要添加改联系人(Y/N):')
- if choice_YN == 'Y':
- fix_contact(contact_name)
- elif choice_YN == 'N':
- break
- else:
- print('输入错误,请重新输入!')
- elif choice == '2': # 添加联系人
- add_contact()
- elif choice == '3': # 删除联系人
- contact_name = input('请输入联系人姓名:')
- if contact.get(contact_name):
- print('%s 已删除!' % contact.pop(contact_name))
- contact_save()
- else:
- print('未找到该联系人!')
- elif choice == '4': # 退出程序
- print('|---感谢使用通讯录程序---|')
- break
- else: # 出错时打印选单
- print('输入错误,请重新输入!')
- menu()
复制代码
代码好长,看着有点辛苦,只能解答一点点,位置2那里的contact是局部变量没错,这个局部变量是一个与全部变量名称一样的局部变量,只适用于open_contact()区域中。声明全局变量只有在函数内部才有意义,在在函数外部的变量基本都是全局变量,定义全局变量没意义。文件不要打开读取或写入后关闭,操作文件之后才来关闭,这样才有意义
|
|