对《Python核心编程》中“第一个Python程序”的改进
概述:
本程序主要是模仿《Python核心编程》中3.6节——第一个Python程序,并在其基础上做了一些小的改进,而改进的要求则是来源于第三章的课后练习题。
本篇博客的一个核心问题就是在我们如何避免重复制造轮子。
课本源程序:
这里不对课本上的源程序作过多地讲解,因为课本本身就说得非常清楚而且易懂。
改进需求:
1. 可以创建新的文件;
2. 可以读取新的文件;
3. 可以让用户选择创建或是读取文件.
看到上面的需求,可以你的第一感觉就是,哦,这个太简单了。不就是把之前写过的代码在这里复制粘贴一下就好了啊,最多不过是多加一个if的判断,有什么难的?
当然我并不否认,这的确是一个简单的程序。不过从优良的代码质量来看,可不能是简单的复制和粘贴这么简单哦。因为复制代码到自己的程序中,这会导致代码的复用性大幅下降,对于小程序可能是没有什么影响,可是对于一些庞大的系统来说,这可能是一个致命的伤,因为维护起来可能会异常艰难。好了,说了这么多,那就来看看我是怎么解决这个需求的吧。
思路:
我把之前创建文件和读取文件的文件还是保留,然后在第三个文件makeNreadTextFile.py中使用代码去调用前两个文件中的方法。
代码分析:
makeNreadTextFile.py
#!/usr/bin/env python'makeNreadTextFile.py -- create or read a text file'import subprocess# call makeTextFile.py
def call_make():cmd = [ "python", "makeTextFile.py"]result = subprocess.call(cmd, 0, None, None, None, None)return result# call readTextFile.py
def call_read():cmd = [ "python", "readTextFile.py"]result = subprocess.call(cmd, 0, None, None, None, None)return result# get the choose to read or make a text file
choose = raw_input('Enter the choose(r/m)')if choose == 'm':call_make()
elif choose == 'M':call_make()
elif choose == 'r':call_read()
elif choose == 'R':call_read()
else:print 'your choose is error!'
大家可以看到上面有几个地方比较特殊:
1.import subprocess
你百度过后就会知道subprocess是开启一个新的线程,并与之通信。
2.result = subprocess.call(cmd, 0, None, None, None, None)
通过1就应该知道,这里就是正在通信。
当然,如果只是对书本上的代码做完整保留,可能达不到我们想要的效果。于是,需要做一些小小的修改。
makeTextFile.py
#!/usr/bin/env python'makeTextFile.py -- create text file'import os
ls = os.linesepdef make_text_file():# get filenamewhile True:fname = raw_input('Enter file name:')if os.path.exists(fname):print "ERROR: '%s' already exists" % fnameelse:break# get file content (text) linesall = []print "\nEnter lines('.' by iteslf to quit).\n"#loop until user terminates inputwhile True:entry = raw_input('>')if entry == '.':breakelse:all.append(entry)# write lines to file with proper line-endingfobj = open(fname, 'w')fobj.writelines(['%s%s' % (x, ls) for x in all])fobj.close()print 'DONE!'if __name__ == "__main__":make_text_file()
readTextFile.py
#!/usr/bin/env Python'readTextFile.py -- read and display text file'def read_text_file():# get filenamefname = raw_input('Enter filename:')# attemp to open file for readingtry:fobj = open(fname, 'r')except IOError, e:print "*** file open error:", eelse:# display contents to the screenfor eachLine in fobj:print eachLine,fobj.close()if __name__ == "__main__":read_text_file()
运行效果:
注:这里是利用执行其他Python程序的方式来实现复用。不过,如果你已经学习了《Python核心编程》的第13章或是了解了Python中的class的话,你同样可以利用类的面向对象来解决问题。
对《Python核心编程》中“第一个Python程序”的改进相关推荐
- python核心装饰_《python核心编程》中高级闭包和装饰器理解?
1.<python核心编程>的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量. 2.代码: from time import time def lo ...
- Python核心编程的四大神兽迭代器、生成器 、闭包以及装饰器
本文将主要分为4大部分,分别介绍Python核心编程中的迭代器.生成器 .闭包以及装饰器. 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yiel ...
- python网络编程中,Cisco packet tracer 中两个交换机和一个路由器的配置
python网络编程中,Cisco packet tracer 中两个交换机和一个路由器的配置 原理图如下所示: 配置PC6–PC11的ip地址和子网掩码: 配置路由器的左半部分的ip地址和子网掩码: ...
- Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正
在Python核心编程(第3版)第2章网络编程中, 关于tcp/udp服务器和客户端实现代码的运行会出现 ['str' does not support the buffer interface]之类 ...
- 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录
目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...
- python3.5.0下载-python核心编程最新版下载
python核心编程是一款专门为Python学习者打造的手机学习软件,同时也是老手编程重要的参考书,为用户提供高级的代码编辑.交互测试.调试等功能,十分的便捷好用,快来下载体验吧. 关于Python: ...
- python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...
今天给大家推荐三本书,有两本是属于一个系列,即<Python核心编程>第二版和第三版,一本讲基础和一本讲进阶,非常适合Python的初学者和有一定基础的学习者.还有一本书适合所有想学Pyt ...
- 《Python核心编程》第二版第36页第二章练习 -Python核心编程答案-自己做的-
<Python核心编程>第二版第36页第二章练习 这里列出的答案不是来自官方资源,是我自己做的练习,可能有误. 2.21 练习 2-1. 变量,print和字符串格式化操作符.启动交互式解 ...
- python3 socketserver_《Python核心编程(第3版)》——2.5 *SocketServer模块
本节书摘来自异步社区<Python核心编程(第3版)>一书中的第2章,第2.5节,作者[美] Wesley Chun(卫斯理 春),孙波翔 李斌 李晗 译,更多章节内容可以访问云栖社区&q ...
最新文章
- 数据结构-图-遍历-搜索
- 如何和相亲对象无限聊天?程序员甩了这份架构图……| 每日趣闻
- oracle mysql客户端——SqlDeveloper
- 第三章 python webdriver API(一)——浏览器操作
- vs2008页面布局GridLayout绝对定位的设置
- CSS之布局方式(内/外部显示及inline-block显示类型)附<行内块空白间隙解决方案>
- IOC 容器中那些鲜为人知的细节(关于 autowiring)
- SmartFoxServer 2X 安装
- 烟雾传感器应用程序linux,各种类型烟雾传感器的应用及原理解析
- Python3 Cobalt strike shellcode 免杀过 360 卫士和360杀毒
- 如何在官网下载hbase
- 下行法求最小割集案例_最小割集求法 -
- S3接口访问华为云OBS
- 字节跳动实习 视频面试
- mysql创建数据库表_mysql基础之创建数据库和表
- Xmy的Python----Numpy库
- 商标注册用免费商用字体整体
- h5在ios系统里调用微信jsdk失败
- Visio 32位下载
- Metrics 简介
热门文章
- 77. 组合(回溯算法)
- 4.11-固件映像包 ( FIP:Firmware Image Package )简介
- 13-SDEI: Software Delegated Exception Interface
- [专栏目录]-ATF/FF-A/specification学习 -- ongoing
- [ATF]-ATF的RT_SVC的详解(runtime service)
- 2022-01-12
- 使用 ZwUnmapViewOfSection 卸载并替换内存镜像
- 4、Java Swing JLable:标签组件
- 10、游标(Cursor)的定义及使用
- Python爬虫百度搜索