使用list comprehension可以杜绝掉50%以上的for循环,后者的效率极其低下(可以看看C源码的实现),而且不够紧凑。我之前上面举的第一个粒子就是list comprehension的很好的运用。 随便举个python官方文档的粒子: >>> [(x, y) for x in [1,2,3] for y in [3,1,4] if x !=y] 运行结果得到, [(1, 3), (1, 4), (2, 3), (2, 1), (2, 4), (3, 1), (3, 4)] 反转一个数列的例子,j2直播,是个one-liner : lis[::-1] 3. 正则表达式 Python正则表达是内置的。一个粒子是我在实验室测试Josephson Junctions时碰到的情况,简化的说就是:我有几百个文件夹,每个文件夹有几百个文件,每个文件有几万条数据,每几个数据我要处理完然后存在另外一个文件夹的另外一个文件里。我要做的工作有: - 用正则表达式找到我要的文件夹和文件,剔除不需要的; - 逐行读出txt文件里面的数据; - 每几个数据设个参数平均,最小二乘处理,剔除几个极端情况,画出图; - 保存 这里Python就起到了一个脚本语言应尽的责任了。 整个从打开文件到保存 不超过150行,还加上我罗哩叭嗦的注释。如果用C写... 呵呵呵呵呵呵。当然这个用Shell也不会太差,不过实验室用的是windows,用windows脚本我还不如去死。自从我写完这个脚本后,从此我们实验室的testing就过上了幸福的生活。(可能么?) 4.reduce, lambda, filter 和map 这些全来自于函数式编程。比如找到prime之内的质数: filter(lambda prime: all(prime%num for num in range(2, prime)), range(2,prime)) 如果作为中文读出来则是(prime是之前给定的一个数):在2到prime之间,过滤出那些所有不被2到自己整除的数。难道还能更简单么!如果用的C, 呵呵。 这里出现了Zen of Python没有提到但是是Python里非常重要的一点,对“数”的操纵。毕达哥拉斯信奉一切皆数,程序语言更应算更是如此,只有对“数”和“类型”的完全掌控,才能如鱼得水。 5. 语言的动态性 Python是动态语言,这是非常重要的一点,一直忘了说。这一点可以直接完爆C++自己一向自豪的泛型编程,模板编程。且看一个strangeness为0的粒子: def build(type, value): return type(value) build(int, 0) 所以稀饭们请看过来, 你们家C可以三行写出这种东西么?!!没完,接着: def impose(func, value): return func(value) def anyfunc(value): return value*value print impose(anyfunc, value) #此处是python2.7的语法 一看就知道是函数式编程。请问C可以么?! 当然还有之前说的函数参数的灵活性: 如果定义一个函数 def print_whatevercrapsthefuckinguserinputs (**params): print params 你就可以想输入多少参数就输入多少了,比如: print_whatevercrapsthefuckinguserinputs(“I",”dont", "give", "a", "fuck“), 只要有print函数的接口(这又涉及了鸭子类型和类似haskell的typeclass的性质, 呱....)。其实际作用是 比如你想在数据库里输入大批量用户信息,mi amigo,对于这样一个蛋疼的函数名字,调用一次就够了。 在Python里类型,函数,全部都是可操作的对象。这可以改变一切。第一个例子显示了对数据类型的操作,第二个是对函数的操作,第三个是对参数的控制。我不想想象用C写这个例子了,因为C根本写不出来。 以上所有这些Python的特性,你可能说我用C实现一个一样的就好了。诚然,你可以在C里一个个写出来自己喜欢的特性,但是你写到后面你会发现你只是再次发明了Python,然后拿C重新写了一个解释器, 而且实现得更烂而已。Please! Don't re-invent the wheel。 Python的类库齐全 (责任编辑:本港台直播) |