Python 能干什么(二)


4.3 强大的语句

这是 Python 最大的与众不同。我们可以看看下面的例子:

多参数同时赋值

s = ('simon', 'shi', 066, 'simonshi@gmail.com')
firstname, lastname, weight, email = s

交换就可以交换

a, b = b, a

神奇的字符串操作

fruits = ['cherry', 'coconut', 'blueberry', 'kiwi']
print ', '.join(fruits)
==> cherry, coconut, blueberry, kiwi

一行的循环

A = [1, 1, 2, 3, 5, 8, 13, 21]
[isOdd(a) for a in A]
==> [True, True, False, True, True, False, True, True]

不需要 if 的判断语句

is_generic_color = color in ('red', 'green', 'blue')

打开并读取文件

with open('data.csv') as f:
    data = f.read()

生成函数

pythondef log(l, m):
    print "[{level}]: {msg}".format(level=l, msg=m)

from functools import partiallog

debug = partial(log, 'debug')
log_warn = partial(log, 'warn')
log_debug('debug level log')
#==> [debug]: debug level log
log_warn('warn level log')
#==> [warn]: warn level log

函数式编程(匿名函数)

pythonargs = [42, 21, 18, 33, 19]
#more expessive than using 'for-else'
if all(map(lamba a:a>=18, ages)):
    print 'All are adults!'

五、Python之殇

运行时错误

Python没有编译过程,int+string的运行时错误,只有当代码被真正执行的时候,才会暴露出来。因为对于一个变量来说,在写代码的时候,有时候很容易就忘记这个变量到底是什么类型。

允许同名函数

在 Python 里面,可以允许同名函数的出现,后一个函数会覆盖前一个函数,这有时候会导致系统中隐藏很严重的错误。对于一个工程来说,这些都就意味着只有在客户真正开始使用的时候,问题才会被发现。要完全避免发生这样的事情,Python 代码的 UT 覆盖率就要做到变态的100%(或者接近100%),同时也要经常使用 PyLint 这样的代码静态检查工具。

无法真正的多线程

Python 的 GIL(注2)导致无法真正的多线程,大家可能会说我用多进程不就完了。但如果一些计算需要涉及到多进程交互,进程之间的通讯开销也是不得不考虑的。

安装软件包比较麻烦

部署 Python 服务的时候,需要在服务器上面安装一堆的包,这一点就很麻烦,虽然可以通过puppet,salt这些自动化工具可以解决部署问题,但相比较静态编译语言只用扔一个二进制文件而言,还是很麻烦的。

Python 更容易产生烂代码

这是因为 Python 更容易产生代码。Python 非常灵活简单,写 C 几十行代码才能搞定的功能,Python 一行代码没准就能解决。但正是由于太简单了,反而会导致很多程序员无法对代码进行深层次的思考,对整个架构进行细致的考量。程序员接收到一个新需求后, 啪啪啪(别想歪了),键盘敲完快速实现,结果就是代码越来越混乱,最终导致了整个项目代码失控。虽然这也可能是因为没好的代码复查机制,没有好的项目规范等原因,但如果一个程序员没经过良好的编码训练,用 Python 更容易写出烂的代码,因为太自由了。


六、Python 适合大工程吗?

一般来说,反对者会提出“性能问题”, “运行时出错”, 和 “缺乏开发工具”等理由。但这些真的是问题吗?

现在除了超大型互联网公司需要静态语言来省电以外,没有听说过多少因为语言速度慢而出现的软件问题。何况现在慢的程序,以后未必就慢了。硬件一定会越来越快的,可是程序员的开发速度,可是一直很难提起来。

无论多么严格的检查都无法阻止程序员写出垃圾来。C的检查比C++弱,但是它在TIOBE上排得比C++要靠前。C语言相信程序员能够做好自己的事情所以没有做出过多的假定,C++看起来严格遵守了很多编程范式,其实过于复杂,直到今天,C++的编译器也不能明确地解决它最复杂的内存泄露问题,这个检查有等于没有。

实际上IDLE已经非常好用了,而且还有Eclipse这个神器在;不论是编辑 Python 还是 Python 的 UT 都已经支持的非常不错了。C++倒是什么工具都有,这让它变好了吗?

其实Python做大项目没什么问题,至少不会比其它主流语言更差,项目的可控规模多大,主要还是取决于人,不是语言——语言当然有差别,但是没有宣传的那么大。至于错误在运行时,这就看自动化测试的水平了。Python项目出现的bug不会比C++或Java更高。

最后说一个题外话:

好奇号宇宙飞船的两百五十万行的代码,绝大部分都是用Python书写,然后生成C再执行的。


七、从现在起,从自己做起

不论之前是如何看待 Python 的,希望在看到这里的时候,你愿意动手去写简单 Python 小工具(例如:批量修改文件名、用正则表达式搜索文件、甚至Windows GUI),而不是使用那些破解版的工具(^-^),或者愿意在你正在工作的项目中尝试使用它在制作原型,那就更完美了。


注1: 了解完整的Python 哲学理念,可以在任意一个Python 交互解释器中键入import this 命令

注2:GIL,即全局解释器锁(Global Interpreter Lock)。

评论关闭