ruby和python比较_为什么说Ruby比Python容易阅读
这是一篇充满偏见的语言战争文章,是一场无意义的锤子和锤子的比拼。语言的复杂性可以通过选择语言回避,而问题本身的复杂性是选择哪个语言都无法回避的。
不屑语言战争的人可以轻松无视此文。
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容易阅读相关推荐
- 零基础学python 视频_零基础入门学习PYTHON(第2版)(微课视频版)
小甲鱼畅销图书重磅升级,针对Python 3.7,通过生动的实例,让读者在实践中理解概念,在轻松.愉快中学会Python! 本书提倡理解为主,应用为王.因此,只要有可能,小甲鱼(注:作者)都会通过生动 ...
- windows10安装python环境_在windows10下安装python(配置环境变量),Windows10
建议使用:anaconda(环境管理和包管理)+Pycharm (强大的IDE开发工具) python环境变量设置: window系统高级设置-> 系统环境变量里 变量名: PYTHONPATH ...
- 怎么查看自己安装的python版本_教你如何检查 Python 版本
本教程介绍如何使用 命令行检查操作系统上安装的 Python 版本.这在安装用 Python 编写的需要特定版本 Python 的应用程序时非常有用. Python 是世界上最流行的编程语言之一.它用 ...
- geany搭建python环境_第一章:搭建Python的开发环境
第一步: 我们在Python的官网上下载Python的安装包,此安装包内含有Python解释器.Python运行的基础库,以及交互式运行工具--Python Shell 第二步: 安装时弹出下面对话框 ...
- 头条上python广告_满大街都是Python广告,真的如广告说的那样方便吗?,学精通后真能月如过万吗?业内大佬怎么看?...
在编程领域.Python语言已经被吹得神乎其神.很多人已经产生了一种错觉:仿佛当今编程世界,唯Python莫属,其它语言皆为渣渣. 就连地产大佬潘石屹也发微博为Python背书,不愧两者都姓" ...
- python练习_如何使用Logzero在Python中练习记录
python练习 Logzero is a Python package created by Chris Hager that simplifies logging with Python 2 an ...
- python+[:]+切片_我从C ++到Python的方式:概念上的改变
python+[:]+切片 by asya f 由asya f 我从C ++到Python的方式:概念上的改变 (How I went from C++ to Python: a conceptual ...
- sublime运行python代码_怎么用sublime运行python
首先需要安装一个Sublime Text(http://www.sublimetext.com/)和一个Python(https://www.python.org/downloads/) 接下来打开S ...
- pycharm python部署_使用PyCharm配合部署Python的Django框架的配置纪实
安装软件安装 Python 2.7.PyCharm.pip(Python包管理工具).Django ( pip install Django) 部署PyCharm 新建Django工程 完成后,其目录 ...
- 人生苦短python作伴_“人生苦短,我用Python”
经过人机大战,AlphaGo一战成名,Python也确立了人工智能时代头牌开发语言的地位,国家相关教育部门更是把它纳入到了传统教育体系中. 对于有跨界转型需求的小伙伴来说,get这门技能是个不错的切入 ...
最新文章
- 高逼格的 SQL 写法:行行比较
- NB-IoT与eMTC差异全解析
- python如何安装Django框架
- Help:立体图绘制以及根据X,Y,Z三坐标值,在图上描点
- 08-Scrum过程-办公环境 每日立会(Standup Meeting)
- Bootstrap 分页导航
- 【海洋女神原创】Installshield脚本拷贝文件常见问题汇总
- L1-030 一帮一 (15 分)
- 对称加密算法和非对称加密算法介绍
- c语言交通灯程序闪烁,单片机交通灯闪烁程序
- Typora免费版,不是破解版,是没有升级的老版本,用的还是比较舒服的
- mobi电子书中删除多余的空格
- 电信光猫 友华PT921G 研究
- 自动化测试 之连连看外挂项目实战
- c语言通讯录设计毕业论文,本科毕业设计(论文)_c语言.doc
- Gentoo 安装笔记 2021/8
- A3NCF: An Adaptive Aspect Attention Model for Rating Prediction
- 迅捷ocr文字识别软件是如何将图片转成文字的?
- 404, NOT_FOUND - no queue 'rep_queue' in vhost '/'
- ASCII码对照表(C++17 实现ANSI、UTF8、Unicode字符编码互转)
热门文章
- C++编程基础二 13-函数与string对象
- 进入全屏 nodejs+express+mysql实现restful风格的增删改查示例
- 浏览器调试时控制台出现:Uncaught SyntaxError: Unexpected identifier
- 六、Struts2的配置文件
- string 和 stringbuilder 的区别
- python面试题之python下多线程的限制
- (转)RabbitMQ学习之安装
- 2016年Esri技术公开课全年资料分享
- java获取当前月第一天和最后一天,上个月第一天和最后一天
- Android 渗透测试学习手册 第七章 不太知名的 Android 漏洞