哪些语言特征使得python脚本可以如此短小?
时间:2021-07-01 10:21:17
帮助过:69人阅读
原来很少用 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么?