鱼C论坛

 找回密码
 立即注册
查看: 2066|回复: 1

[已解决]25课,课后作业提问!

[复制链接]
发表于 2017-2-22 10:33:15 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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(): 执行之前就先声明全局变量,但是也不能成功。我想知道为什么?

还有个问题,我这里的文件是采用的,打开读取或写入后立即关闭,不知道这是不是合理?还是说应该在整个程序结束后再关闭?
还有,悬赏怎么设置?


  1. """
  2. 0.尝试利用字典的特性编写一个通讯录程序。

  3. """
  4. import os
  5. import json


  6. def add_contact():
  7.     contact_name = input('请输入联系人姓名:')
  8.     if contact_name in contact:
  9.         print('该联系人已存在!%s -->%s' % (contact_name, contact[contact_name]))
  10.         choice_yn = input('是否修改用户资料(Y/N):')
  11.         while choice_yn not in ['Y', 'N']:
  12.             choice_yn = input('输入错误,请重新输入!是否修改用户资料(Y/N):')
  13.         if choice_yn == 'Y':
  14.             fix_contact(contact_name)
  15.         elif choice_yn == 'N':
  16.             return
  17.     else:
  18.         fix_contact(contact_name)


  19. def fix_contact(contact_name):
  20.     contact[contact_name] = input('请输入用户联系电话:')
  21.     contact_save()
  22.     print('已保存!')


  23. def contact_save():
  24.     with open(r'E:\通讯录.txt', 'w') as f:
  25.         json.dump(contact, f)
  26.         f.close()


  27. def menu():
  28.     doc = ("""
  29.     |---欢迎进入通讯录程序---|
  30.     |---1:查询联系人资料 ---|
  31.     |---2:插入新的联系人 ---|
  32.     |---3:删除已有联系人 ---|
  33.     |---4:退出通讯录程序 ---|
  34.     """)

  35.     print(doc)


  36. def open_contact():
  37.     if not os.path.exists(r'E:\通讯录.txt'):
  38.         global contact          # 位置1
  39.         contact = {}
  40.         contact_save()
  41.     else:
  42.         with open(r'E:\通讯录.txt') as f:
  43.             # global contact        #位置2
  44.             contact = f.read()
  45.         contact = json.loads(contact)
  46.         f.close()

  47. # global contact       #位置3
  48. open_contact()
  49. menu()

  50. while True:
  51.     choice = input('请输入相关的指令代码:')

  52.     if choice == '1':  # 查询联系人
  53.         contact_name = input('请输入联系人姓名:')
  54.         print('%s : %s' % (contact_name, contact.get(contact_name, '未找到该联系人!')))
  55.         while not contact.get(contact_name, False):  # 询问是否添加不存在的联系人
  56.             choice_YN = input('是否需要添加改联系人(Y/N):')
  57.             if choice_YN == 'Y':
  58.                 fix_contact(contact_name)
  59.             elif choice_YN == 'N':
  60.                 break
  61.             else:
  62.                 print('输入错误,请重新输入!')
  63.     elif choice == '2':  # 添加联系人
  64.         add_contact()
  65.     elif choice == '3':  # 删除联系人
  66.         contact_name = input('请输入联系人姓名:')
  67.         if contact.get(contact_name):
  68.             print('%s 已删除!' % contact.pop(contact_name))
  69.             contact_save()
  70.         else:
  71.             print('未找到该联系人!')
  72.     elif choice == '4':  # 退出程序
  73.         print('|---感谢使用通讯录程序---|')
  74.         break
  75.     else:  # 出错时打印选单
  76.         print('输入错误,请重新输入!')
  77.         menu()
复制代码
最佳答案
2017-2-22 14:36:13
代码好长,看着有点辛苦,只能解答一点点,位置2那里的contact是局部变量没错,这个局部变量是一个与全部变量名称一样的局部变量,只适用于open_contact()区域中。声明全局变量只有在函数内部才有意义,在在函数外部的变量基本都是全局变量,定义全局变量没意义。文件不要打开读取或写入后关闭,操作文件之后才来关闭,这样才有意义
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-2-22 14:36:13 | 显示全部楼层    本楼为最佳答案   
代码好长,看着有点辛苦,只能解答一点点,位置2那里的contact是局部变量没错,这个局部变量是一个与全部变量名称一样的局部变量,只适用于open_contact()区域中。声明全局变量只有在函数内部才有意义,在在函数外部的变量基本都是全局变量,定义全局变量没意义。文件不要打开读取或写入后关闭,操作文件之后才来关闭,这样才有意义
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-2-25 13:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表