《Python3程序开发指南(第二版)》第4章 控制结构与函数 练习
来源:互联网 发布:关于化学的软件 编辑:程序博客网 时间:2024/05/19 03:46
1. 编写一个交互式程序,用于对文件中的字符串列表进行维护。
import osYES = frozenset({"y", "Y", "yes", "Yes", "YES"})def main(): dirty = False items = [] filename, items = choose_file() if not filename: print("Cancelled") return while True: print("\nList Keeper\n") print_list(items) choice = get_choice(items, dirty) if choice in "Aa": dirty = add_item(items, dirty) elif choice in "Dd": dirty = delete_item(items, dirty) elif choice in "Ss": dirty = save_list(filename, items) elif choice in "Qq": if (dirty and (get_string("Save unsaved changes (y/n)", "yes/no", "y") in YES)): save_list(filename, items, True) breakdef choose_file(): enter_filename = False print("\nList Keeper\n") files = [x for x in os.listdir(".") if x.endswith(".lst")] if not files: enter_filename = True if not enter_filename: print_list(files) index = get_integer("Specify file's number (or 0 to create " "a new one)", "number", maximum=len(files), allow_zero=True) if index == 0: enter_filename = True else: filename = files[index - 1] items = load_list(filename) if enter_filename: filename = get_string("Choose filename", "filename") if not filename.endswith(".lst"): filename += ".lst" items = [] return filename, itemsdef print_list(items): if not items: print("-- no items are in the list --") else: width = 1 if len(items) < 10 else 2 if len(items) < 100 else 3 for i, item in enumerate(items): print("{0:{width}}: {item}".format(i + 1, **locals())) print()def get_choice(items, dirty): while True: if items: if dirty: menu = "[A]dd [D]elete [S]ave [Q]uit" valid_choices = "AaDdSsQq" else: menu = "[A]dd [D]elete [Q]uit" valid_choices = "AaDdQq" else: menu = "[A]dd [Q]uit" valid_choices = "AaQq" choice = get_string(menu, "choice", "a") if choice not in valid_choices: print("ERROR: invalid choice--enter one of '{0}'".format( valid_choices)) input("Press Enter to continue...") else: return choicedef add_item(items, dirty): item = get_string("Add item", "item") if item: items.append(item) items.sort(key=str.lower) return True return dirtydef delete_item(items, dirty): index = get_integer("Delete item number (or 0 to cancel)", "number", maximum=len(items), allow_zero=True) if index != 0: del items[index - 1] return True return dirtydef load_list(filename): items = [] fh = None try: for line in open(filename, encoding="utf8"): items.append(line.rstrip()) except EnvironmentError as err: print("ERROR: failed to load {0}: {1}".format(filename, err)) return [] finally: if fh is not None: fh.close() return itemsdef save_list(filename, items, terminating=False): fh = None try: fh = open(filename, "w", encoding="utf8") fh.write("\n".join(items)) fh.write("\n") except EnvironmentError as err: print("ERROR: failed to save {0}: {1}".format(filename, err)) return True else: print("Saved {0} item{1} to {2}".format(len(items), ("s" if len(items) != 1 else ""), filename)) if not terminating: input("Press Enter to continue...") return False finally: if fh is not None: fh.close()def get_string(message, name="string", default=None, minimum_length=0, maximum_length=80): message += ": " if default is None else " [{0}]: ".format(default) while True: try: line = input(message) if not line: if default is not None: return default if minimum_length == 0: return "" else: raise ValueError("{0} may not be empty".format( name)) if not (minimum_length <= len(line) <= maximum_length): raise ValueError("{name} must have at least " "{minimum_length} and at most " "{maximum_length} characters".format( **locals())) return line except ValueError as err: print("ERROR", err)def get_integer(message, name="integer", default=None, minimum=0, maximum=100, allow_zero=True): class RangeError(Exception): pass message += ": " if default is None else " [{0}]: ".format(default) while True: try: line = input(message) if not line and default is not None: return default i = int(line) if i == 0: if allow_zero: return i else: raise RangeError("{0} may not be 0".format(name)) if not (minimum <= i <= maximum): raise RangeError("{name} must be between {minimum} " "and {maximum} inclusive{0}".format( " (or 0)" if allow_zero else "", **locals())) return i except RangeError as err: print("ERROR", err) except ValueError as err: print("ERROR {0} must be an integer".format(name))main()
0 0
- 《Python3程序开发指南(第二版)》第4章 控制结构与函数 练习
- 《Python3程序开发指南(第二版)》第1章 过程型程序设计快速入门 练习
- 《Python3程序开发指南(第二版)》第2章 数据类型 练习
- 《Python3程序开发指南(第二版)》第3章 组合数据类型 练习
- 《Python3程序开发指南(第二版)》第5章 模块 练习
- python3程序开发指南——第1章 笔记
- Python3程序开发指南(中文版第二版) PDF分享 百度云
- scala学习第二章 控制结构与函数
- Android编程权威指南(第二版)— 第10章挑战练习
- Android编程权威指南(第二版)— 第13章挑战练习-13.6
- Android编程权威指南(第二版)— 第13章挑战练习-13.8
- Python3程序开发指南(第三版)学习笔记
- 《Python3程序开发指南》01:安装与基础使用
- 第二章 控制结构和函数
- 第22讲-控制结构与流程图-练习
- 《快学Scala》第2章 控制结构和函数 练习
- 《Python3程序开发指南》02:文件的写入(简单)
- 《Android编程权威指南》第二版 第二章 挑战练习
- 第六节 Swift 协议(Protocol)和扩展(Extension)
- RaceWeb介绍(7):由500强公司数据快速生成百度地图——生成坐标字段及坐标数据
- js获取昨天今天和明天
- dup,dup2函数
- Visual C++ ActiveX 控件承载 Visual Basic 或 HTML 中的 Office 文档
- 《Python3程序开发指南(第二版)》第4章 控制结构与函数 练习
- 莫比乌斯反演
- vb.net机房收费登录功能
- 第七节 Swift 泛型(Generics)
- Xcode 5 环境下编译 ffmpeg 库
- 黑客 python之旅
- jsp的include指令和动作标识的区别
- svn服务器搭配apache服务器
- 协议,代理的简单应用