(根据我在博客园上连载的四篇文章整理,见http://yanxy.cnblogs.com,转载请注明出处)

近两天内的目标是在我博的每个栏目发一篇文章,先都占个坑再说,空着不好看:) 《程序设计》这个栏目里,就从我刚开始学的Python开始吧。

一、引言

Python是一种简单却又强大的语言,我觉得它很适合非专业程序员(特别是科研人员)使用。比如作一些科学计算、数据处理工作等,Python简单的语法和丰富的第三方库可以有效帮助我们提高工作效率。

本文并不主要介绍Python编程的语法,或Python怎么安装、运行、调试等,有兴趣可以到科学网潘超的Blog去看看,那里有一些不错的入门资源。整理这篇文章的主要目的还是想介绍下我学、用Python的一些体会,希望能为大家提供借鉴。我学Python已经有十多天了,现在已经初步掌握了Python。我认为好的学习方法不光是看书或上网查资料,最好是能结合一个实际的例子一点点去深入,这样掌握起来会更快更牢。我在写了“Hello World”之后,第一个正式编的程序就是下面这个复制代码时去除行号的小工具。

二、分析与设计

现在很多专业计算机技术网站提供的各种源代码前,很多会带有数字行号。我们将这些代码复制下来运行前,要一行一行的去删除前面的代码,即浪费时间又容易出错。如果有一个程序能快速、正确的去除掉代码前的行号,无疑可以节省我们的很多时间(当然我写这个程序花了大概有10几个小时,不过正所谓“磨刀不误砍柴工”嘛:)。

网上代码前的行号排列大都比较有规律,多数采取如下形式:

1. abc

2. def

………………

1 abc

2 def

………………

以及[1]、1:、(1)等。

因此,要去除行号,首先就是要查找到每行的开头数字及前后分割符号,然后替换掉他们。根据这个思路,很容易写出如下的基本程序框架:

第1步:读取全部n行代码到一个字符串,然后将其转换为包含n个子字符串的数组(或列表);

第2步:对于每一个子字符串,从左至右开始查找每个字符,如果找到一个或多个连续的、可转换为整数的字符,就删除其左侧(包含数字自身位置)的全部字符,并用剩余部分生成一个新字符串。

第3步:如果新字符串左侧有空白或:.])等分割符号,就去除掉它们,再用剩余部分生成一个新字符串。

第4步:将所有处理过的字符串顺序连接起来,得到一个字符串,返回处理行号后的源代码。

三、初步的实现——字符串替换

由于Python语言提供了良好的字符串操作功能,因此很快可以写出一个初步的版本:

#代码1

# -*- coding: utf-8 -*-

defCutLineNum(inStr):#用def关键字声明函数,注意后边加冒号multiStr = inStr.splitlines(1)#将多行文本拆分为文本列表outStr = u''forsingleStrinmultiStr:#循环用for in的结构,后边也加冒号singleStr = singleStr.lstrip()#去除左侧空白i=0#迭代算子forcharStrinsingleStr:#从左至右循环查找字符ifcharStr.isdigit():#如果判断是数字类型i += 1#迭代算子加1elifi>0:#找到了一个非数字字符,而且前边已有数字字符singleStr = singleStr[i:]#返回从该位置起的剩余字符break#跳出循环else:#如果都没有,说明是空行break#跳出循环outStr += singleStr#将所有行组成完整代码returnoutStr#返回

(注意,# -*- coding: utf-8 -*-是使用utf-8编码,可以支持中文字符)

以上代码实现了基本程序框架中的1-3步,第4步由于情况较复杂(有的行号后有分割符,有的没有,而且空格数量也不一样),所以暂时用以下函数手工处理:

#代码2

# -*- coding: utf-8 -*-

defCutLeftChar(inStr):

outStr = u''multiStr = inStr.splitlines(1)forsingleStrinmultiStr:

singleStr = singleStr[1:]

outStr += singleStrreturnoutStr

这样虽然苯拙一点,但至少解决了问题。

四、进一步优化——正则表达式替换

正则表达式(Regular Expression,简称Regex),是指一个用来描述或者匹配一系列符合某个句法规则的字符串的单个字符串。关于Python中正则的入门材料可以参考《正则表达式30分钟入门教程》,(不过我觉得30分钟掌握正则表达式还是有困难的,为掌握它我还专门买了一本《精通正则表达式》)。正则表达式是一种处理文本的强大工具,删除代码行号对于它来讲是小菜一叠。下面用正则表达式改写代码1和2,如下:

#代码3

importre#导入Python的正则表达式模块

defCutLineNum (inStr):

multiStr = inStr.splitlines(1)

outStr = u''

p = re.compile(r'D*d+s?[.|:|]|)]?s?')#编译正则表达式forsingleLineinmultiLine:

outStr += p.sub('', singleLine,count = 1 )#用空字符替换每行的第一个匹配上述正则表达式的字符串returnoutStr#返回累加后的字符串

以上代码中的咖色部分就是一个Regex,它的含义是:0或多个非数字字符 + 至少1个数字字符 + 0或1个空白字符 + 0或1个分隔符(包括点、冒号、右圆/方括号,可添加其他分隔符) + 0或1个空白字符。

以上Regex符合大多数代码前行号的规则,删除行号就是用空字符替换掉每行代码中第一个匹配该Regex的字符串(注意只能是第一个,因为程序里可能会存在abc1.open等情况,如果全部匹配就会误删代码)。

五、继续优化——采用函数编程

代码3看起来还不够简洁,没关系,Python是一种“准”函数编程(Functional Programming,FP)语言,做这种简化代码的事情最拿手。在这里,我用到了两种函数编程手段——匿名函数(lambda)和一种高阶函数(map),将代码简化至一行,如下:

#代码4

importre#导入Python的正则表达式模块

outStr =''.join(map(lambdax:re.compile(r'D*d+s?[.|:|]|)]?s?').sub('', x,count = 1 ),inStr.splitlines(1))))

这样代码就只优化到了一行了,是不是很简洁呢?当然代码的可读性受到一定影响。所以函数编程不能滥用。(滥用的例子可以见我的文章《学习Python列表内涵:一行代码搞定双倍超立方数计算》)。函数编程是个稍微复杂点的问题,我觉得掌握与否均可,所以就不很详细地去解释上述代码了。如果对Python的函数编程感兴趣,可以参考《可爱的 Python:Python 中的函数编程》,很不错的一篇文章。

六、完整的程序——添加I/O

完整的程序肯定少不了输入输出功能。对于这个去除复制代码行号的小工具,我想到的输入输出方式一共有三种:

1、文件方式

将复制的代码存为一个文本文件,然后用程序读取它,去掉行号后在写回文件。这种方法应该说是最不方便的,可以算一下自己需要点多少下鼠标……麻烦,所以我没有实现它。关于Python的文件操作内容,网上有很多资料,可以搜索一下。

2、窗口方式

将复制的代码粘贴到一个窗体的文本框里,然后点击按钮去除行号,再从文本框里把处理后的代码复制出来。这是比较常规的做法,我分别用wxPython和PyQt4实现了这项功能,源代码见http://www.cnblogs.com/yanxy/archive/2010/02/19/YanxyFirstPython.html。由于GUI编程是个比较复杂的问题,我就不详细展开了,以后有时间再写。

3、剪贴板方式

复制代码到剪贴板后,启动处理行号程序,直接处理剪贴板内的文本,然后再复制到其他地方。这是最方便的一种方法,而且由于不用构建GUI,代码量也会很少。见下边:

#代码5# -*- coding: utf-8 -*-

importwin32clipboard as c#import包的时候,如果包名太长,可以用as起一个别名importwin32con as w#以上两个包都是专门针对windows平台的,注意importre

c.OpenClipboard()#打开剪贴板strList = c.GetClipboardData(w.CF_TEXT).splitlines(1)#读取剪贴板内容到一个字符列表c.EmptyClipboard()#清空剪贴板c.SetClipboardData(w.CF_TEXT,''.join(map(lambdax:re.compile

(r'D*d+s?[.|:|]|)]?s?').sub('', x,count = 1 ),strList )))#将去处行号后的字符写回剪贴板,此处用到代码3c.CloseClipboard()#关闭剪贴板

七、总结

以上就是我初学Python作的第一个程序,虽然很简单,但在编写这个程序的过程中,我学习到了:

1、Python的基本语法、类型与逻辑控制

2、Python的函数定以及函数编程方法

3、Python的图形用户界面设计(GUI)

4、正则表达式及其在Python中的应用

短时间内就可以学会这么多内容,足以说明Python的简单易学,你也应该能体会到Python的强大吧。此外,在完成这个程序的过程中,我所用到的基本思路是:

1、由粗到细

先根据功能要求实现程序逻辑框架,然后用你所掌握的最基本方法实现初步版本,先让程序能用。在此基础上,再去看是否有继续优化的可能(从代码简洁性或效率两方面),逐步细化,这时候才是提高的过程。

2、自内而外

先实现核心算法,再添加外围功能(I/O,GUI等)。有些编程初学者热衷于用IDE去拖拉控件、美化界面等(当然这项工作也是必要的),没有把更多精力集中到核心算法中去,这样不利于真正学好一门语言。

当然这个程序还有很多需要完善的地方,欢迎提出你的意见或建议。

如果需要了解更多关于Python的内容,可访问啄木鸟社区的《Python资源索引》。

转载本文请联系原作者获取授权,同时请注明本文来自闫小勇科学网博客。

链接地址:http://blog.sciencenet.cn/blog-404069-297132.html

下一篇:介绍几个图论和复杂网络的程序库 —— BGL,QuickGraph,igraph和NetworkX

我的第一个python程序源代码_科学网—我的第一个Python程序——删除代码前行号的小工具 - 闫小勇的博文...相关推荐

  1. perl mysql 数据推拉_科学网—从MySQL数据库中提取序列并进行引物设计的perl脚本 - 闫双勇的博文...

    利用MySQL数据库来储存序列,通过perl脚本获取序列,并进行引物设计.当然除了引物设计干其它事情也是可以的. 将FASTA文件导入MySQL数据库的方法: bp_seqfeature_load.p ...

  2. 如何用python爬视频_科学网—利用python爬取一个小视频 - 李鸿斌的博文

    工具 : requests 库 解析: beautifulsoup 任务: 视频抓取 1,分析目标网站 寻找一个虚拟的头文件 User-Agent: Mozilla/5.0 (Windows NT 6 ...

  3. python 基因序列提取_科学网—简单的Python脚本提取对应位置基因序列(fasta文件) - 王彬忠的博文...

    最近,用Python脚本提取,在基因号已知,位置已知条件下,相对应位置的基因序列时发现,这样很简单但是很实用的脚本,在网上却比较难找.而且,能被找到的脚本,相对于具有初级编程能力的人而言,有点难.本人 ...

  4. python 病毒 基因_科学网—RNA病毒基因组组装指南 - 倪帅的博文

    从前几年的猪流感和埃博拉,再到上个月在韩国流行的MERS, 病毒的每次爆发都能使全球陷入一阵恐慌,病毒虽然没有真正在全球爆发,但是各国在预防上消耗的资源比在治疗上消耗的还要多.殊不知,病毒是世界上最简 ...

  5. python 面板数据分析_科学网—Python中的结构化数据分析利器-Pandas简介 - 郑俊娟的博文...

    此文转载于XXXXXX处... Pandas是python的一个数据分析包,最初由AQR Capital Management于2008年4月开发,并于2009年底开源出来,目前由专注于Python数 ...

  6. python牛顿法解非线性方程组_科学网—求解多元非线性方程组F(x)=0的Newton-Raphson方法及其MATLAB实现 - 王福昌的博文...

    科学网对公式支持不太好,在博客园有相同博文 牛顿迭代法可以推广到多元非线性方程组 $boldsymbol{F}(boldsymbol{x})=boldsymbol{0}$的情况,称为牛顿-- 拉夫逊方 ...

  7. python 海象运算符_科学网—[转载]海象运算符 := - 龚云国的博文

    PEP 572: Assignment Expressions 新增一种新语法形式::=,又称为"海象运算符"(为什么叫海象,看看这两个符号像不像颜表情),如果你用过 Go 语言, ...

  8. 基于python的计算基因组_科学网—python3 计算 基因组测序结果文件 各碱基数目(个人练习) - 靳泽星的博文...

    基因组测学回来的结果后,从assembly(组装)里找到序列文件,格式可能是:.fasta..fastq..seq.和.contig.fastq要转化为fasta,转化方法网上一大把哈.我的基因组序列 ...

  9. python读取网站_科学网—python 获取网址 - 林清莹的博文

    Python获取网址的内容# coding=utf-8 import urllib url = "http://www.baidu.com" data = urllib.urlop ...

  10. hdc mfc 画扇形图_科学网—画扇形图(idl程序) - 张国印的博文

    IDL画扇形图还是有些麻烦的,今天中午没午休,以红移和RA为例写了程序,希望以后能用上 pro sector set_plot,'ps' device,file='F:Aprilmap.ps' REA ...

最新文章

  1. tp5+workman
  2. pygame中使用事件扫描实现对按键的检测以及小游戏的编写
  3. mysql主从同步搭建和故障排除
  4. MyBatis学习笔记(四) 注解
  5. 极简代码(五)—— 斐波那契数列
  6. java 反射 获取Class对象的三种方式
  7. 创建、复制、删除、重命名、获取文件名等常用的批处理bat命令
  8. 安卓手机投屏到win10电脑无需安装任何软件(电脑和手机必须连接同一网络或者wifi)【投影到此电脑灰色无法操作怎么办?】by qiweb 端午节
  9. 抓住每一次学习的机会
  10. java计算机毕业设计智慧防疫上报系统服务端源码+数据库+系统+lw文档
  11. 【3D目标检测】Monocular 3D Object Detection with Pseudo-LiDAR Point Cloud
  12. jenkins 报错 code=exited, status=127
  13. linux 代码搜索工具,程序员兵器之代码搜索工具
  14. 基于Matlab的小学毕业班成绩总评模糊聚类分析
  15. 光伏自动化出图系统 基于C#的AutoCad二次开发
  16. 【虚幻引擎UE】UE4/UE5 新人科普向
  17. SQL server 数据库多列分组查询
  18. 用3dmax怎么设置nbsp;3D室内设计…
  19. stp文件怎么变文件夹_教你使用Solidworks打开Stp或Step文件【图文】
  20. 关于计算机应用说课的视频,2015计算机应用技术教程说课课件.ppt

热门文章

  1. MySQL常见运算符详解
  2. Shell脚本工具三剑客 Sed
  3. 普歌-码上鸿鹄团队:在Nuxt(vue)渲染模板中使用mock.js随机生成数据
  4. 【我喜欢你,像风走了八千里】-末那大叔
  5. 深度Linux声卡驱动安装,Deepin Linux 的声卡驱动有点小问题
  6. 晋商消费金融被央行暂停征信系统查询权限
  7. TP笔记5、模型 文件上传 分页 会话技术与验证码
  8. 这是我见过最好的唐诗,而且通俗易懂
  9. 【学习记录】SPSS问卷调查表分析法
  10. fluent入门学习(一):三维卡门涡街算例