F's Blog

博客 收藏夹
Ruby VS. Python

20 Mar 2015

在同时用Python和Ruby,固做总结,用的越多,感悟也越多,比较乱,随时在变着!

对比

Python 没有太多新概念,不像 Ruby 的元编程、作用域等需要去适应。Python 唯一需要适应的就是实例方法的self参数以及继承父类时主动去调用父类的够找函数,这也是全凭self。

Ruby 的灵活性让它有了 Rails、DSL,所以 Ruby 更适合去创造创造其它东西的东西。Python 的简单让它更适合去探索已知的东西,比如调试器等。

不同的语言性格决定了它们的用途以及使用者的性格。所以不要死抱哪门语言,那是懒惰的借口,适合就去学着用。

用一门语言是因为它的性格和它背后的资源,包括社区和库。

再说语言只是表象的东西,对操作系统的包裹。想多线程、数据结构、网络协议这些东西是躲不掉的。

Ruby社区的东西都很漂亮,对比一想Python的官网就知道了。可以想象,用Ruby的都文艺些,Python的都Geek些。

语法

Python语法中那个让我纠结的冒号,因为根据缩进也可以达到冒号的语义作用,我给它找了理由:

因为是按缩进来定义代码段的,确实需要这么个冒号,要不可读性太差了。

方法

在Python中执行方法要加是(),如js中那样,而Ruby不用。就是这一点,造就了很大的代码差异。

加括号的好处是,方法的执行很明确,那么不加方法就是对这个方法的访问。

而Ruby因为不用加括号,更适合写出DSL。

想把一个方法作为参数传递,Python就传方法名即可,Ruby则要传Proc,要么是块。

lambda

说实话,Ruby的块真心好用!

很多时候,动态语言是对现有C库的封装或重新实现。

在Python中,通过self也就是当前实例,可以很容易的指定变量。Python的其它代码都是围绕着self转的,像self的衣服,self可以穿自己的,也可以穿它爸的。

yield

两边都有yield。

Ruby的是执行方法后的程序块,而Python是用来定义生成器。

分与合

分:开发软件时,为了去耦合会将代码分开写到各个文件里,修改时也只会影响这个文件。

合:把分开的模块合到一起使用,完成需求。不管是require还是import,都是把代码“copy and load”。

Ruby可以用include或extend模块来扩展类的方法,Python则偏向于使用self来在各个功能模块见传递变量。

变量

在Ruby中,实例变量就是以@开头的变量。

动态语言与静态语言的一个很大区别就是变量不需要提前定义了。当然都需要初始化。

Python 在访问变量时,如果方法内部没有定义这个变量,会自动去使用外部的,而赋值内部同名的变量,不会影响外部的变量,除非加上 global 关键字。 Ruby 的变量严格遵守作用域门的定义。

作用域

Ruby的变量作用域被class、module、def定义分开了,只要在里面就开不见外面的,因此需要闭包去引用外面的变量。而Python可以在里面访问外面的。

继承

包管理

Ruby require 一个文件后,相当于里面代码被复制了进来,如果在同一个 module 里,里面的类、方法等能够直接使用。

Python import 一个文件后,相当于Java里的import,只是引入了包,使用还是需要包名的。

而在Ruby里,这是靠module来实现的,可以在任何位置定义这个module。而Python是根据目录关系来管理。

不管是require还是import包时,都会将代码执行一遍,而且只执行一般,再引入就会提示已经引入了。 想重新加载,就用load方法。

感观

Python里面大写开头的单词比较少,即使是类,也用小心,用的时候就像调用方法。

更高的层面

站在哪个位置,看到哪个层面,就说哪个层面的事情。对程序员,就说编程语言、程序设计等,对于项目经理就是功能的实现,对于老板就说挣钱。

学会一门编程语言也很简单,关键是会用它做出东西。就像认识字很简单,可怎么样写出美丽的诗歌就是水平。

Rails比较难,是因为它需要有很多其它相关知识:浏览器如何工作、数据库的使用、操作系统原理、面向对象、设计模式、网页制作、DRY思想等。它是有哲学思想的框架。

“生活不只是眼前的苟且,还有诗和远方。”

领域

从社区的贡献看,Ruby适合做框架,因为有Rails,而Python比较多底层原理、科学运算、功能实现等。

想想这也是因为这两种语言的语法格式适合的。

Python侧重过程,而Ruby都是类。

优秀项目

Ruby

发现越来越多的安全项目和管理项目使用Ruby来做。

Python

而Python主要集中在具体的功能领域。

PyAutoGUI

自动操作。

PyInstaller

Python有个pyinstaller,真是个好东西,能打包成方便发行的二进制文件。Ruby也有(ocra)[https://github.com/larsch/ocra],但只支持windows平台。

pyinstaller -F xxx.py

就能打包成一个可执行文件,否则默认是-D,即打包成一个文件夹。前者在执行时也是在临时目录里先解压成一个文件夹。

是的,我特别喜欢能够分发的二进制文件,所以喜欢终端开发。

mitmproxy

感想

多掌握一门语言就如同多了个朋友。像Ruby和Pthon都是有十多年历史的语言,所以在批判之前最好要能理解。

掌握多种语言,就可以使用更多的资源。

动态语言,本来就不是以效率优先的,而是写代码的人的使用感受。

为什么安全工作者喜欢脚本语言呢,因为知道怎么做更重要!

参考

本文由 付豪 创作,采用署名 4.0 国际(CC BY 4.0)创作共享协议进行许可,详细声明