原来很少用 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,dict
3.first order function
4.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么?
Stellungnahme:Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn