这是一篇充满偏见的语言战争文章,是一场无意义的锤子和锤子的比拼。语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个语言都无法回避的。

不屑语言战争的人可以轻松无视此文。

1、字符串格式化

Python

"%s=%s"%(k, v)

在阅读 Python 字符串格式化的时候,视线先看到字符串的 %s 字样,但是不知道这指的是什么,然后看后面的变量 k,再接着看第二个 %s ,再看后面的 v 视线必须不停地在字符串和变量之间跳动。

Ruby

"#{k}=#{v}"

而阅读 Ruby 字符串格式化的时候,看到需要变量的地方,变量就在那里。

顺便一说

"%s = %s"%[k,v]

这种风格的代码在 Ruby 里面也能用,Ruby 的理念认为解决问题的方法可以不止一种,选择哪种取决于程序员的喜好。

2、映射(迭代)

这在 Python 中叫做列表解析,不过不管叫什么,实际上这是迭代的一种。

[elem*2foreleminli]

li 是一个 list。阅读这行代码的时候,先看到 elem*2,但是不知道 elem 是什么。继续看,再次看到 elem ,还是不知道是什么。一直看到 in li,奥,原来 elem 是 li 中的元素,对了,刚才对 elem 做了什么来着?

如果一个元素的解析还不太迷惑,继续看下面这个例子。

["%s=%s"%(k, v)fork, vinparams.items()]

请问我应该先看哪个部分。

下面是 Ruby 版。

li.map {|elem|elem*2}

params.map {|k, v|"#{k}=#{v}"}

求 params 的映射(map),其中的元素是原本params里面 k, v 键值对组成的字符串,我不确保没有 Ruby 基础的人会不会习惯这种 block 语法,但是我可以保证阅读代码的时候是从左到右的单一顺序。

3、DSL(领域语言)

为了举一个现实中有代表意义、但是又足够简单的例子,我找到了 webpy 和 sinatra,这分别是 Python 和 Ruby 社区热门的简洁风格 web 框架。

前置的说明是,webpy,甚至是 Python,都不是一个追求 DSL 的社区。而 Ruby 社区则以 DSL 见长,这样比较似乎有失公允。但这里可以比较 DSL 的有无对于代码的可读性有什么帮助。

webpy 的 hello world

importweb

urls=('/','hello')

app=web.application(urls, globals())classhello:defGET(self):return'Hello, world!'if__name__=="__main__":

app.run()

我对 webpy 原本的 helloworld 做了简化,以便和 sinatra 比较。

坦率地说,webpy 的 hello world 已经够简洁了。相比起 Java EE 和 .net 庞大的 IDE 和那根本不知道拿来做什么的规范,webpy 让我们回归了单纯,简约而不简单。

但是,简约方面,Ruby 的 DSL 文化更是做到了极致,看 sinatra 的例子

require'sinatra'get'/'do"Hello World!"end

sinatra 的 DSL 非常简练,甚至让人怀疑它是否是一个玩具。或者可以看下 sinatra 的文档或者用户列表,现在请先暂且相信,它做的事跟 webpy 没什么两样。

DSL 是语言层面的封装,把复杂性留在库的内部,把接口用 DSL 的形式暴露给程序员。这其实跟类和函数方式的 API 没有什么不同。不过 DSL 会让人忘记自己正在使用什么语言,Rubyists 的说法是:魔法。

总结

Python 和 Ruby 虽然同为动态语言时代的佼佼者,不过开发和社区风格有很大的不同。这归根于两个语言诞生时的理念不同:Python 注重规范化,一个问题只有一个方法,缩进的强制约束,便于多人合作;而 Ruby 注重人性化,便于阅读,一个问题有几个方法,过多的魔法需要使用者自己锻炼驾驭能力。

这样的结果就是偏重数学,偏重模范化的人喜欢 Python;偏重乐趣,偏重人类语言化的人喜欢 Ruby。

ruby和python比较_为什么说Ruby比Python容易阅读相关推荐

  1. 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)

    小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...

  2. windows10安装python环境_在windows10下安装python(配置环境变量),Windows10

    建议使用:anaconda(环境管理和包管理)+Pycharm (强大的IDE开发工具) python环境变量设置: window系统高级设置-> 系统环境变量里 变量名: PYTHONPATH ...

  3. 怎么查看自己安装的python版本_教你如何检查 Python 版本

    本教程介绍如何使用 命令行检查操作系统上安装的 Python 版本.这在安装用 Python 编写的需要特定版本 Python 的应用程序时非常有用. Python 是世界上最流行的编程语言之一.它用 ...

  4. geany搭建python环境_第一章:搭建Python的开发环境

    第一步: 我们在Python的官网上下载Python的安装包,此安装包内含有Python解释器.Python运行的基础库,以及交互式运行工具--Python Shell 第二步: 安装时弹出下面对话框 ...

  5. 头条上python广告_满大街都是Python广告,真的如广告说的那样方便吗?,学精通后真能月如过万吗?业内大佬怎么看?...

    在编程领域.Python语言已经被吹得神乎其神.很多人已经产生了一种错觉:仿佛当今编程世界,唯Python莫属,其它语言皆为渣渣. 就连地产大佬潘石屹也发微博为Python背书,不愧两者都姓" ...

  6. python练习_如何使用Logzero在Python中练习记录

    python练习 Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 an ...

  7. python+[:]+切片_我从C ++到Python的方式:概念上的改变

    python+[:]+切片 by asya f 由asya f 我从C ++到Python的方式:概念上的改变 (How I went from C++ to Python: a conceptual ...

  8. sublime运行python代码_怎么用sublime运行python

    首先需要安装一个Sublime Text(http://www.sublimetext.com/)和一个Python(https://www.python.org/downloads/) 接下来打开S ...

  9. pycharm python部署_使用PyCharm配合部署Python的Django框架的配置纪实

    安装软件安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 部署PyCharm 新建Django工程 完成后,其目录 ...

  10. 人生苦短python作伴_“人生苦短,我用Python”

    经过人机大战,AlphaGo一战成名,Python也确立了人工智能时代头牌开发语言的地位,国家相关教育部门更是把它纳入到了传统教育体系中. 对于有跨界转型需求的小伙伴来说,get这门技能是个不错的切入 ...

最新文章

  1. 高逼格的 SQL 写法:行行比较
  2. NB-IoT与eMTC差异全解析
  3. python如何安装Django框架
  4. Help:立体图绘制以及根据X,Y,Z三坐标值,在图上描点
  5. 08-Scrum过程-办公环境 每日立会(Standup Meeting)
  6. Bootstrap 分页导航
  7. 【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
  8. L1-030 一帮一 (15 分)
  9. 对称加密算法和非对称加密算法介绍
  10. c语言交通灯程序闪烁,单片机交通灯闪烁程序
  11. Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
  12. mobi电子书中删除多余的空格
  13. 电信光猫 友华PT921G 研究
  14. 自动化测试 之连连看外挂项目实战
  15. c语言通讯录设计毕业论文,本科毕业设计(论文)_c语言.doc
  16. Gentoo 安装笔记 2021/8
  17. A3NCF: An Adaptive Aspect Attention Model for Rating Prediction
  18. 迅捷ocr文字识别软件是如何将图片转成文字的?
  19. 404, NOT_FOUND - no queue 'rep_queue' in vhost '/'
  20. ASCII码对照表(C++17 实现ANSI、UTF8、Unicode字符编码互转)

热门文章

  1. C++编程基础二 13-函数与string对象
  2. 进入全屏 nodejs+express+mysql实现restful风格的增删改查示例
  3. 浏览器调试时控制台出现:Uncaught SyntaxError: Unexpected identifier
  4. 六、Struts2的配置文件
  5. string 和 stringbuilder 的区别
  6. python面试题之python下多线程的限制
  7. (转)RabbitMQ学习之安装
  8. 2016年Esri技术公开课全年资料分享
  9. java获取当前月第一天和最后一天,上个月第一天和最后一天
  10. Android 渗透测试学习手册 第七章 不太知名的 Android 漏洞