概述:

本程序主要是模仿《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程序”的改进相关推荐

  1. python核心装饰_《python核心编程》中高级闭包和装饰器理解?

    1.<python核心编程>的这段程序怎么理解?对于这个函数,书上说两个wraaped是闭包,但是不知道谁是自由变量. 2.代码: from time import time def lo ...

  2. Python核心编程的四大神兽迭代器、生成器 、闭包以及装饰器

    本文将主要分为4大部分,分别介绍Python核心编程中的迭代器.生成器 .闭包以及装饰器. 生成器 生成器是生成一个值的特殊函数,它具有这样的特点:第一次执行该函数时,先从头按顺序执行,在碰到yiel ...

  3. python网络编程中,Cisco packet tracer 中两个交换机和一个路由器的配置

    python网络编程中,Cisco packet tracer 中两个交换机和一个路由器的配置 原理图如下所示: 配置PC6–PC11的ip地址和子网掩码: 配置路由器的左半部分的ip地址和子网掩码: ...

  4. Python核心编程(第3版)第2章网络编程中关于tcp/udp服务器和客户端实现代码的运行出错的修正

    在Python核心编程(第3版)第2章网络编程中, 关于tcp/udp服务器和客户端实现代码的运行会出现 ['str' does not support the buffer interface]之类 ...

  5. 拒绝从入门到放弃_《Python 核心编程 (第二版)》必读目录

    目录 目录 关于这本书 必看知识点 最后 关于这本书 <Python 核心编程 (第二版)>是一本 Python 编程的入门书,分为 Python 核心(其实并不核心,应该叫基础) 和 高 ...

  6. python3.5.0下载-python核心编程最新版下载

    python核心编程是一款专门为Python学习者打造的手机学习软件,同时也是老手编程重要的参考书,为用户提供高级的代码编辑.交互测试.调试等功能,十分的便捷好用,快来下载体验吧. 关于Python: ...

  7. python核心编程第三版_Python之父:自学python,这3本书能节约你一大半时间编程...

    今天给大家推荐三本书,有两本是属于一个系列,即<Python核心编程>第二版和第三版,一本讲基础和一本讲进阶,非常适合Python的初学者和有一定基础的学习者.还有一本书适合所有想学Pyt ...

  8. 《Python核心编程》第二版第36页第二章练习 -Python核心编程答案-自己做的-

    <Python核心编程>第二版第36页第二章练习 这里列出的答案不是来自官方资源,是我自己做的练习,可能有误. 2.21 练习 2-1. 变量,print和字符串格式化操作符.启动交互式解 ...

  9. python3 socketserver_《Python核心编程(第3版)》——2.5 *SocketServer模块

    本节书摘来自异步社区<Python核心编程(第3版)>一书中的第2章,第2.5节,作者[美] Wesley Chun(卫斯理 春),孙波翔 李斌 李晗 译,更多章节内容可以访问云栖社区&q ...

最新文章

  1. 数据结构-图-遍历-搜索
  2. 如何和相亲对象无限聊天?程序员甩了这份架构图……| 每日趣闻
  3. oracle mysql客户端——SqlDeveloper
  4. 第三章 python webdriver API(一)——浏览器操作
  5. vs2008页面布局GridLayout绝对定位的设置
  6. CSS之布局方式(内/外部显示及inline-block显示类型)附<行内块空白间隙解决方案>
  7. IOC 容器中那些鲜为人知的细节(关于 autowiring)
  8. SmartFoxServer 2X 安装
  9. 烟雾传感器应用程序linux,各种类型烟雾传感器的应用及原理解析
  10. Python3 Cobalt strike shellcode 免杀过 360 卫士和360杀毒
  11. 如何在官网下载hbase
  12. 下行法求最小割集案例_最小割集求法 -
  13. S3接口访问华为云OBS
  14. 字节跳动实习 视频面试
  15. mysql创建数据库表_mysql基础之创建数据库和表
  16. Xmy的Python----Numpy库
  17. 商标注册用免费商用字体整体
  18. h5在ios系统里调用微信jsdk失败
  19. Visio 32位下载
  20. Metrics 简介

热门文章

  1. 77. 组合(回溯算法)
  2. 4.11-固件映像包 ( FIP:Firmware Image Package )简介
  3. 13-SDEI: Software Delegated Exception Interface
  4. [专栏目录]-ATF/FF-A/specification学习 -- ongoing
  5. [ATF]-ATF的RT_SVC的详解(runtime service)
  6. 2022-01-12
  7. 使用 ZwUnmapViewOfSection 卸载并替换内存镜像
  8. 4、Java Swing JLable:标签组件
  9. 10、游标(Cursor)的定义及使用
  10. Python爬虫百度搜索