“Python是AI专用语言”、“全民学Python”种种,说明的不是Python被高估了,而是Python被曲解了。

Python是通用编程语言,只是在AI、大数据等方面(还是技术栈上层;底层还是靠C/C++)应用得比较多。专用语言出了专用的领域就不能用了。python零基础学习

固然,Python有它的相对简单性(相对简单性指的是语言和各种库都给好了再去写的时候比较简单)。首先是它的语法简洁,语法糖多,模板少,比如文件读取。然后是一些特性支持比较好,比如int理论上可以任意大,又如读JSON不用模板。

然后就是Python真正复杂到可怕的一些特性了,这里仅举几例。

首先,动态类型。这就允许a是个int型的然后a=str(a),就要小心变量的类型在转换前后发生变化。Python还允许函数参数类型不事先确定,只要用到的时候类型不出错就可以了,比如只用到加减乘除,如果没有显式的类型检查,就适用于整数、浮点数、复数、分数,甚至素数域或扩域里的数了。如果要用某个第三方库的函数,还要看这个函数各个参数是什么含义、支持什么类型、推荐用什么类型;不给或给不全就只能要么分析库源码要么尝试了。

其次,作用域。一个函数里面(只要不是里面再套一层函数),if、try、while、for的局部变量甚至可以在跳出之后使用,编程时极易不小心引用到名称十分相近的变量(而IDE可能不会报错)。

再次,异构类型集合(collection)和匿名类型(注意不是匿名类)。集合(collection)在Python里面包括元组(tuple)、列表(list)、集合(set)、字典(dict)等,所述四种collection中除set的元素和dict的键必须是可hash的这个要求以外,对存放元素的类型并无要求,甚至可以混合存放。可以想象,编程者对collection中哪个位置存放什么类型的元素必须十分清楚。至于匿名类型,大概是JSON里怎么表示对象的,Python里就怎么写,不用class,却也要清楚哪个键对应什么类型的值;甚至直接用元组,不仅要清楚哪个位置存放什么类型的元素,还要清楚哪个位置存放的元素是什么含义。

最后,抛出异常的位置和程序出错的位置或许相隔较远。可能只是一个TypeError或ValueError或AttributeError,程序出错的位置离抛出异常并中止的位置可能隔了几个函数,而且成因或许很复杂,比如不同的类型执行“相同的”函数,实际却差之千里。

所以,如果要用Python做一些正经的事,请一定先学静态程序分析,而其中的类型分析在这里尤为重要。

python相对来说比较容易,但其实我觉得python的坑还是比较多的,单从语言本身讲,我觉得不如java来的稳定和健壮(指开发方面不是运行方面)。同时python的运行性能比java差很多特别是线程方面。所以如果用python的web服务,都需要支持协程(coroutine)比如tornado。需要并发的时候,就需要使用多进程的方案了。

python还有二进制文件的反编译问题,这个java也有。

python还有版本兼容问题,比如2和3,这个java好点。

但是我仍然坚持我的一贯观点,尽可能用python脚本代替shell脚本吧。很多场景可能python无法替代shell,但是更多的场景,python是远胜shell的。很多人批评go语言是70style,那么shell脚本我觉得就是60style了,有浓郁的历史气息,各种节俭,省略的作风。类似的还有makefile,GNU autoconf的m4脚本……。反正我每次读这些都有一种读易经的感觉,嗯,就是坑龙有悔的感觉。

所以总的来说Java是否被高估了?我觉得并没有,因为在好多应用上python并没有被高估,反而还降低了好多人对他的期待值,如果,你要是问我python到底值不值学习,我认为是非常值得学习的



 

更多推荐

python是否被高估了?