原来很少用 python,现在用得越来越多,发现了很多 python 让我惊喜的地方,其中之一就是脚本短小精悍。为什么呢?可以说是因为 python 具有 functional programming 的特点吗?回复内容:
设计目的不同。c++ / java 本身是为了严肃工程设计的语言,而 python / perl 之所以称为“脚本语言”,因为它们设计就是作为脚本,临时执行一下的,通常还负责“胶合”其它程序协作完成任务。(虽然 python 在各种脚本语言里是最偏向于工程的)从这个设计目的推倒,那么这些语言在执行一些常见功能的时候,肯定要更方便才好,否则人们直接用 java / c++ 就可以了啊。所以 bash 格外擅长调用和组合程序,perl 特别擅长字符串处理等。python 相对普通一些,提供了一个相对短平快而方便书写的语法以达到目的:“动态强类型”省略类型声明。c++ 11 刚刚开始引入 auto 进行类型推导。当然后者对正确的保证更强一点。内置丰富而高效的数据类型:array / list / dict。对比一下 new hashmap().get(“key1”).get(“key2”) 什么的……python 较早引入了一些 fp 语言的元素,如 map / filter / apply / itertools,还有 lisp comprehension 和 generator [1] 这种大神器。对比 c++ 11 / java 8 才引入 lambda 实在是……泪目。标准库,”battery included”。虽然在某些方面比 jre 不如,比 c++ std lib 那个弱 x 还是可以自豪得笑的。而且 python 更强的是有 pypi 和配套的 pip 工具,使得管理依赖项、自动安装和更新变得像 debian 系统包安装一样容易(这不是黑,真的)。java 后来也算有了 maven(鉴于需要手写 xml,我还是认为这货不是给人类使用的。clojure 的 leiningen 略好)。c++ 墙角哭去!当然,如果题主真的打算误入歧途寻找一下 the language 的话,没事可以围观一下 ruby 和 lisp 系语言……忘记是 paul graham 还是谁说的了……每个语言最后都会变成一种 lisp 方言 :)[1] http://www.dabeaz.com/generators/generators.pdf
我觉得主要是:built in string, unicode, bytes, tuple, list, dict, set, etc.,外加运算符重载;for … in statement;list comprehension;其他的一些基础设施,如zip()、map()、reduce()、包罗万有的标准库等等。
你要比较的可能是一些强类型的静态语言,如c++, java等。如果跟 ruby、haskell 比,不见得短小很多。那么我们来跟 c++ 比一下。个人感觉,自从c++11引进了那些新特性以来,包括匿名函数、range-based loop (for … in)、auto,以及加强的 stl 等,python就显得没那么『fancy』了。那么,python 剩下最方便的使得它可以『短小』的特性有:list comprehension. 这个应该是最方便的吧?有时 c++ 为了初始一个 2^n 的数组,需要专门写一个 for loop。在 python 里面可以直接一个 list comprehension 搞定。但是如果滥用并多重嵌套,会使得可读性很差。方便的内置类型,比如 list 原生支持 slice,以及 dict/set 很方便 c++11 里的 std::string 用起来略逊一筹,不过 std::unordered_map 已经基本上赶上 dict 了。named argument 以及 tuple 作为函数返回类型,使得定义一个灵活的函数方便很多。动态类型的语言可以更灵活,但是也更容易出错。初学者很多时候都会栽在类型匹配上面。作为一个 c++ 出身的程序员,i know what i am doing,基本上比较容易一次编译通过,同时也很容易找到语法出错在哪(这里要感谢 clang)。丰富的函数库。pypi 能直接安装各种 package,并且有 numpy/scipy + matplotlib 等神器的存在,把 matlab 矩阵计算的便利也吸引了过来,也因此衍生出各种 domain package,比如 nlp, machine learning, network analysis, data mining …. 而 c++ 比起来似乎逊色很多(至少没有一个统一、方便搜索的 repo)值得一提的是缩进来表示代码块。这里有它的 pros & cons,的确比 {} 省不少 lines,不过也似乎更容易出错一点。
1.动态类型2.强大的内置数据类型:list,dict3.first order function4.list comprehension & corountine(虽然这个有争议,不过官方说有就当他有吧)5.library多得数不过来
相比java来说:(1)python支持函数式编程,不用写个hello world就写好几行代码。(2)python没有强类型约束,变量使用用事先申明,一个变量可以接受任何类型赋值。(3)python中没有java中的那么多规范,比如不用写getter,setter。python异常捕获可以不申明捕获异常类型。(4)python支持运算符重载,java中只能写成方法的形式比如bigdecimal中的那些方法。(5)python中不使用{}来约束语句块。(6)python中的方法一般都设计设计成可以链式调用(官方库大多有这个设计),而java中的官方库基本都没有这么设计,而且javabean规范中好像也说setter返回类型应该为void。(7)python参数传递可以直接传递函数(万物皆对象),而java只能传递对象(method不是对象),android中的大量callback直接导致代码难看的要死!!!(8)python函数参数支持默认值,而java中只能通过多态来实现;(9)python支持lambda 等等。。。。python唯一烦的应该是decode吧。
难道不是自动gc和内置lib么?