工作多年,因为项目需要,用过的编程语言不少了:c/c++、java、c#、汇编、vb、objective c、apple script。不过主要使用的还是c/c++,一方面是用得久了,习惯了。另一方面,思考问题的方式已经偏“底层”了,不想内存、不考虑指针,似乎就浑身冷汗,无法编程了。连带我在面试一些小朋友的时候也会不自觉的问一些底层的知识点。再有一方面,就是想要程序的运行效率更高一些,个人一直以写高效的(算法)程序为目标,而c/c++是除了汇编之外的,能写出的运行效率最高的编程语言——大家别喷,有不同意见很正常——而我目前唯一一次用汇编做项目,也是在MS写microsoft excel的底层函数库,也是为了提升excel的计算效率。
不过c/c++写一些“短平快”的、运行一遍就能扔的文本程序很不方面,又要考虑字符编码、又要考虑文本格式、又要解析字符串等等。而python的设计初衷,就是为了节省程序员的编程时间,(当然不可避免的增加了程序运行时间),从前一直想学python,刚好借这个机会,以具体小任务为驱动,边学边做。现在感觉还是挺爽的。
用python写程序的确挺快。语法比较简洁,内置工具比较多。对于我从前纠结的运行效率,也有惊喜:如果直接运行脚本的话,速度还是挺快的——python的默认底层实现应该是cpython,也就是很多模块是用c支持的、且编译好的。运行这些模块,就是在调用编译好的c程序。不过如果调试的话——我用的 python2.7 + eric4 ——运行速度就会降低的很厉害,慢十倍左右吧,感觉调试的时候要用PVM解释器,很多编译好的c模块无法直接运行,应该是造成调试的时候运行时间大大加长的原因。
总之,python写程序挺快;只要写对了,运行也不太慢。本猿比较满意。
附:由于是任务驱动来学习python的,没有啃什么书,基本过程就是不会就问度娘,度娘不会就问谷哥。从前搜索的、积累的一些问题和解法,列出如下,python大拿们请绕行:
1. 按照每行读取文件,去除问价末尾的换行符 fileIn = open ("fileName", "r") for line in fileIn: line.strip()...... 2. 字符串查找、分隔 #查找分隔符‘#’,并把‘#’前面的内容存储到一个字符串中,‘#’后面的内容存储到另一个字符串中 for line in fileIn: sepPosition = line.strip().find(‘#‘) frontString = line.strip()[:sepPosition] backString = line.strip()[sepPosition+1:] 3. appDict是个字典,key是app name,value是app的某个属性,按照key排序,并输出到文件中 step1:按照key排序,输出到list中 # sort by the package name appDictSorted = sorted (appDict.iteritems(), key=lambda x:x[0], reverse=False) step2:将appDictSorted 中的内容输出到文件中 for item in appDictSorted: fileOut.write (item[0] + "#" + item[1] + "\n") 4. python的for循环往往是遍历容器中的元素,如: itemList = {‘a‘, ‘b‘, ‘c‘} for item in itemList do something 问题是,如何像c/c++中那样,重复执行某些操作n次?答:用range函数 for i in range(0, 100) do something 100 times i的值从0 开始,累计到99结束 5. 由列表生成集合,用集合构造函数set() itemSet = set (itemList) 6. 求两个集合itemSetOne和itemSetTwo的交集和并集 交集:itemJoinSet = itemSetOne & itemSetTwo 并集:itemUnionSet = itemSetOne | itemSetTwo 差集:itemDiffSet = itemUnionSet - itemJoinSet 7. 求词典中元素的个数?用len()函数 appDict = dict() ...... appCount = len(appDict) 8. 如何遍历词典?答:遍历词典的key即可,用keys()函数返回词典中key的集合 for key in appDict.keys(): value = appDict[key] #做爱做的事情 写法上也可以不特意调用keys()函数,不过作用是一样的,如: for key in appDict: value = appDict[key] #做爱做的事情 9. 文件打开了要关闭,调用文件的属性函数close(),如: fileIn = open (fileName, "r") ...... fileIn.close() 10. 元组、列表、字典的初始化 元组的初始化用小括号:a = (),元租对象的内容不可以改变 列表的初始化用中括号:a = [],列表对象的内容可以改变 字典的初始化用花括号:a = {},如果有内容,则:a = {key1:value1, key2:value2, ...} 11. 如何把文件中的带有百分号的数字,如:“80%”转成浮点数0.8 思路:先进行字符串处理,去掉“80%”中的百分号,然后缩小80这个数字到小数 theValue = float("80%".partition(‘%‘)[0]) * 0.01 str.partition(‘x‘)的作用是替代string中的find和replace方法,让字符串划分和替换的写法更加方便,具体来说,它是把str按照‘x‘分成一个三元组(a, ‘x‘, b),a是str中‘x‘前面的部分,b是后面的部分。 上面语句中 "80%".partition(‘%‘)[0] 就是把字符串“80%”根据“%”来进行分割,分成的三部分为(“80”,“%”,“”),‘[0]’表示取第一部分,也就是“80”,然后float函数把“80”转换成浮点数,然后进行比例缩放,就得到0.80了 12. eric4中,用open函数打开文件,当确定文件路径正确,而eric4提示说找不到文件,或者直接成功退出程序的时候,检查一下eric4的workspace的设置,是否是和被打开文件相同的目录,如果目录不相同,容易引起上面的错误,将目录改成文件所在的目录就OK了。