python初体验

近来帮人写些脚本工具,体会了下python便利与让人不太习惯的地方。
python的量在初始赋值时确定类型,并且在变量名区分大小写,而且,有不同生命周期的变量声明方法,全局变量,局部变量,类变量,对象变量,大体上根据定义的位置来确定,而类变量和对象变量的区别在于,类变量要在class定义之后,定义,而对象变量要在__init__方法体内使用,如果要引用外部变量,需要加上global限制。习惯了c++/Java之类的定义方式的程序员要适应下了。由于没有类属性表,关注数据的程序员也要适应下了。另外,try--finally语句中的变量声明空间try子句中的初次使用的变量,在finally中不可见,因此必须要将变量使用提前,但是赋值是个麻烦事情,比如操作文件,基本类型就不具备close的方法,因此在finally中调用变量的close方法会提示错误,好在可以预先设置为None(对应Java中的null,将变量类型确定延后,并且可以通过语法检查)。
python的import和Java、c++的对应语法相同,这个没什么说的,不过import之后,被import部分可以认为是一个对象,可以通过hasattr方法来判断是否支持由一个方法(动作)很方便动态程序设计或者可移植性程序的设计
python的异常很简化,连抛出异常的方式都很个性,raise Error,'errormessage',前面定义异常的类型,后面定义提示语句(当然你定义的异常的__init__中传入参数为str),用catch Error,e前面列表表示可以捕获的异常种类,注意这个列表的顺序决定了异常被捕获的先后顺序。至少python25使用try catch finally不会报错的。
python比较方便的是,它本身的库就全面到支持日常工作的地步,因此,学习过程中可以不断的跟windows shell对比学习,通过两种不同的处理方式来达到同样的预期,不过,在对python比较熟悉的情况下,我还是愿意用python来写,或者翻译批处理文件,主要的是如下:第一点是变量跟踪相对比较容易,不需要几个批处理对比的一行行看下来,windows batch中的命令参数很多,比如set就有不同的变体,如set /a;set /p;set %!var!%等等,眼睛的压力很大。第二点,编译器支持比较好,用python的UliPad可以方便的看到外部变量定义和方法类定义等等,有自动补全,windows batch 我就没找到好的编译起,一般的也就给个语法高亮,自己去弄太麻烦。第三,语法较严格,windows batch中把没有定义的变量认为是空,不会报错,而python中使用之前应该是被赋值过的,属性确定,这一点增加了程序编写和检查的便利。第四,好调试,batch我都不知道怎么调试了,不断的在代码中加上pause,打印信息出来看,效率低啊,python的debug还行。
python虽然是脚本,但是不容许类型的随意转换,我估计这个会是一个坑,类型之间不能自由转换就不需一长串的转换函数。最常用到的是,str int等,str是用得比较多的,在打印字符串格式化中,可以用格式化命令来转换,其他情况下就只能使用split等一堆函数来处理,效果如何取决与熟练程度与智力无关。
python的文件读写比较奇怪的是有readline读取一行,read来读取一定长度byte数组,在对应的write方法中确没有writeline方法,如果要表明写入的是一样,需要主动加一个'/n',读取文件有多种形式,我比较熟悉的就是for in这种的了,完全够用。
--------------------------------------------------------------------------------------------------

近来还在帮人写脚本,大多都是从一个文件中统计数据,然后写入到另外一个文件,基本过程都是一样,先写入到临时文件,然后利用python自身可以调用windows batch 命令来改名字覆盖同名文件,这样的效率很明显那是相当的低,于是考虑用读写(r+)方式来操作之。但是在文件偏移上出现了问题。
采用先判断,如果判断不成功则读取当前位置的方式,当判断成功之后,使用这一个位置就为前一次readline所造成的偏移位置,然后通过seek,就可以将文件指针移动到此处然后再此处进行修改,注意在该位置上写入一行即可。但是操作完成之后发现新写入的内容被写入当前行的中间了,而且还覆盖掉了部分第二行,我斯巴达了。根据结果分析,就算是找对了,填充的字节也要和之前的相同,这个会相当的麻烦。
另外发现python的几个读文件的方法,由于很相似让人迷惑了,比如readlines(),readline(),for line in f:在某些需求中,比如要一次性读取一节内容时readlines由于没办法直接控制文件指针移向,所以就采用for line in f:这个line可以通过next方法主动的将指针移动,但是这个next有问题,他有buffer,导致一次返回给用户的指针位置和实际的指针位置不一样,reposition的时候就会移动到别处,而且next和readline一起绑定会出问题。
另外说说readline的问题,readline会读取一行中的/n如果一串字符串中间有多行需要多次调用readline来读取,如果将readline的结果写入其他文件,会看到文件格式不相同(writelines,write会判断/n为一行的结尾)。
还有一点readline返回的字符串包括了/n如果做字符串处理时需要屏蔽之
一下说说如何解决偏移出错的问题,在说说如何read的时候忽略/n字符
一个简单的方法是不用带buffer的read方法,用line = f.readline()
while line:dosomething()line=f.readline();注意此中间不要使用到next()方法(python中没有do while只好这样了)
对于readline的时候忽略/n字符,最简单的是用buffer,设置最大行包含的字符数,但是这样第一个问题就没办法。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值