当前位置: 首页 > 编程日记 > 正文

通过 for 循环,比较 Python 与 Ruby 编程思想的差别

5127609ba556bc202190c0fa7311285f.gif

作者 | Doug Turnbull

译者 | 豌豆花下猫@Python猫

来源 | Python猫

Ruby 与 Python 之间的差异在很大程度上可通过for循环看出本质。

Python 拥有for语句。对象告诉for如何进行协作,而for的循环体会处理对象返回的内容。

Ruby 则相反。在 Ruby 中,for本身(通过each)是对象的一个方法。调用者将for循环体传递给这个方法。

在 Python 的语言习惯中,对象模型服从于 for 循环。而在 Ruby 中,for 循环服从于对象模型。

也就是说,在 Python 中,如果你想自定义迭代的过程,可以让对象告诉解释器该如何作迭代:

class Stuff:def __init__(self):self.a_list = [1,2,3,4]self.position = 0def __next__(self):try:value = self.a_list[self.position]self.position += 1return valueexcept IndexError:self.position = 0raise StopIterationdef __iter__(self):return self

在这里,Stuff 使用 __next__ 和 __iter__ 魔术方法使自身可迭代(变为了可迭代对象)。

for data in Stuff():print(data)

然而,在 Ruby 的用法中,你要做的恰恰相反。你要将 for 创建成一个方法,它接收代码(body 体)来运行。Ruby 将过程代码放在代码块中,这样它们就可以被用于传递。

然后,在each方法中,使用yield与代码块进行交互,将值传递给代码块来做你需要做的事情(对于任何方法,代码块都是一种隐式参数)。

如果我们重写上面的代码,会成这样:

class Stuffdef initialize@a_list = [1, 2, 3, 4]enddef eachfor item in @a_listyield itemendend
end

使用each进行迭代:

Stuff.new().each do |item|puts item
end

不是将数据传给 for 循环(Python),而是将循环代码传给数据(Ruby)。

但区别还远不止于此:

Python 构建类似于 for 的结构,用于各种处理;Ruby 将数据处理工作放到方法中。

优秀的 Python 代码使用列表和字典解析式来实现mapfilter,这些表达式的核心与 for/迭代的语义是相同的。

In [2]: [item for item in Stuff()]
Out[2]: [1, 2, 3, 4]In [3]: [item for item in Stuff() if item % 2 == 0]
Out[3]: [2, 4]

Ruby 则继续使用方法优先的方式,除了each方法,还有一系列常用于处理集合的新方法,如下所示:

class Stuff...def selectout = []each do |e|# If block returns truthy on e, append to outif yield(e)out << eendendoutenddef mapout = []# One line block syntax, append output of block processed on e to outeach {|e| out << yield(e) } out
end
puts Stuff.new().map {|item| item}
puts Stuff.new().select{|item| item.even?}

Python 说:“你告诉我们如何迭代你的实例,我们将决定如何处理你的数据。” Python 有一些基于语言的用作迭代和处理的原语,如果要自定义迭代,只需将正确的代码添加到 for 循环体(或表达式)中。

Ruby 反转了剧本,赋予对象更深层的可定制性。是的,在某些情况下,我们可以在代码块中添加更多的控制流。是的,我们也可以把 each 方法用来做 map。但是 Ruby 允许对象们实现不同的 map 和 each(如果将“each”的实现用于“map”,可能会非常不理想,甚至不安全)。Ruby 的对象在处理其数据方面,有着更好的方法。

在 Ruby 中,对象控制着功能可见性。而在 Python 中,是语法做着控制。

地道的 Python 对数据处理有着强势的看法。Python 说:“看,90% 的代码都能很好地融入这些想法,只要遵从它,完成工作就行了。”把你的对象变成可以 for-循环的,别再烦我了。

然而 Ruby 说:“在一些重要的情况下,我们不想给调用者太多能力。”所以 Ruby 让对象去控制它们被处理的方式,并要求开发人员遵循对象想要被交互的方式。Ruby 在数据处理上没那么强势。

Python 更像是基于 C 语言的“面向对象”编程的扩展。在基于 C 的 OO 中,就像 posix 文件描述符或 Win32 窗口句柄一样,语言并不强制将“方法”与对象本身绑定。相反,对象到方法的绑定只是基于约定。

Python 认为这个过程世界是可以进化的——它升级了这种思维方式,使之更安全。自由函数是存在的(Python猫注:应该指的是内置函数,因不依赖于任何类对象,故是“自由的”),而且确实经常比对象方法更受推荐。对象是存在的,但以一种相对犹豫的方式。

类方法接收“self”作为其第一个参数,几乎与 Win32 或 Posix API 中的 C 函数接受句柄的方式相同。当函数被传递时,它们几乎被当作 C 函数指针来对待。

Python 认为程序范式(procedural paradigm)是最重要的,它是一切的关键基础,在它之上是面向对象的语义层。

然而,Ruby 却将其颠倒过来。Ruby 将面向对象作为金字塔的基础。Ruby 在代码块中包含了混乱的过程世界,让对象使用这些过程块。

Ruby 并没有为了遵循语言的过程性基础而破坏对象,而是使过程性代码适应对象的世界观。Ruby 有真正的私有方法,不像 Python 的私有方法/参数,只是出于约定。

毫无疑问,当我从系统编程的角度接触 Python 时,它对我的观感来说是很自然的。具备着在必要的时候编写 C 语言的能力,它进化了,令那个世界更加安全。也许这就是为什么它在系统资源密集的数值计算领域中,找到了用武之地。

难怪 Ruby 很适合开发人员构建更流畅、也许更安全的 API 和 DSL。Ruby 希望程序员对领域进行建模,而不是对编程环境进行建模,这对于许多工作来说,似乎是正确的方法。

9acb28fdd41f0662f436046869bed5ce.gif

28f09a497e65d7bac517b210683441e9.png

资讯

OpenAI真的open了,更加开放

资讯

Meta新语音模型可支持128种语言交流

资讯

Meta研发触觉手套助力元宇宙

论坛

移动云区块链开发者论坛来了!

14e574a9fc6ef82407a565fbcb354cdf.png

分享

e27dfb3e841e53da9c5fba6f93e5b1bc.png

点收藏

03749c7ef1a24c338ca8add386fe92d0.png

点点赞

8f5758325dc1370c8fa62c91926ef02c.png

点在看

相关文章:

Blippar放大招,要开源其AR和计算机视觉技术

AR公司Blippar将向第三方开发者提供AR和计算机视觉技术API&#xff0c;来推动他们的AR商业应用解决方案的发展。 致力于用AR技术帮助一些大品牌进行品牌故事和消费者营销的AR公司Blippar&#xff0c;最近对外宣布&#xff0c;要将他们的AR和计算机视觉技术API&#xff0c;提供…

Linux CPU数量判断命令

其实只要 #include <unistd.h>long num sysconf(_SC_NPROCESSORS_ONLN); 便可以获得当前CPU的数量。。。 判断依据&#xff1a;1.具有相同core id的cpu是同一个core的超线程。2.具有相同physical id的cpu是同一颗cpu封装的线程或者cores。 英文版&#xff1a;1.Physical…

5月.CN域名注册量持续上涨至1199万个 净增14万

IDC评述网&#xff08;idcps.com&#xff09;06月11日报道&#xff1a;根据中国互联网络信息中心&#xff08;CNNIC&#xff09;最新公布的数据显示&#xff0c;在5月份&#xff0c;.CN域名总量持续增至11,990,264个&#xff0c;环比上月&#xff0c;净增143,346个&#xff0c;…

人工智能/云原生/数据科学/计算等方向内容整理志愿者招募了!

持续招募内容整理志愿者&#xff01;云原生、数据科学、AI、低代码、计算等方向&#xff0c;有意愿的小伙伴&#xff0c;欢迎识别二维码提前报名哦。我们将持续为爱学习、有时间的小伙伴&#xff0c;提供多重福利&#xff01;要求&#xff1a;1. 你需要具备一定学术背景&#x…

三个轻量级WebServer--lighttpd,thttpd,shttpd介绍

国内绝大部分的web server不是IIS就是Apache&#xff0c;而论市场占有率&#xff0c;我认为Apache是大赢家了&#xff0c;至少是占据了半壁江山。但除了IIS/Apache外&#xff0c;其实我们有很多选择&#xff0c;对于高负载/大并发的网站而言&#xff0c;高性能、轻量级的web se…

实验四 主存空间的分配和回收

实验四 主存空间的分配和回收 一、目的和要求 1.1. 实验目的 用高级语言完成一个主存空间的分配和回收程序&#xff0c;以加深对动态分区分配方式及其算法的理解。 1.2. 实验要求 采用连续分配方式之动态分区分配存储管理&#xff0c;使用首次适应算法、循环首次适应算法、最佳…

技术“摸鱼” 大神,国外小哥 5 年白拿 45 万工资!

整理 | 孙胜出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09;自从2017年谷歌旗下的AlphaGo以3比0战胜柯洁后&#xff0c;“人工智能即将取代人类工作”一度成为人们热议的话题。然而最近一位国外小哥用他亲身经历告诉我们&#xff0c;虽然程序终将代替人类执行重复劳…

Python杂篇

一&#xff1a;文件保存 def save_to_file(file_name, contents):fh open(file_name, w)fh.write(contents)fh.close()save_to_file(mobiles.txt, your contents str)结果&#xff1a; 将字符串修改则覆盖原来的字符串 将字符串用变量替代 将 fh open(file_name, w)写的权限去…

整理了 70 个 Python 面向对象编程案例,怎能不收藏?

作者 | 周萝卜来源 | 萝卜大杂烩Python 作为一门面向对象编程语言&#xff0c;常用的面向对象知识怎么能不清楚呢&#xff0c;今天就来分享一波文章很长&#xff0c;高低要忍一下&#xff0c;如果忍不了&#xff0c;那就收藏吧&#xff0c;总会用到的在 Python 中创建一个类及其…

ionic中的ion-option-button

2019独角兽企业重金招聘Python工程师标准>>> 代码 <ion-option-button class"button-assertive" ng-click"df(itemData)">批准 </ion-option-button> 效果图 转载于:https://my.oschina.net/u/1416844/blog/465730

memset函数详细说明

1。void *memset(void *s,int c,size_t n)总的作用&#xff1a;将已开辟内存空间 s 的首 n 个字节的值设为值 c。2。例子#include <stdio.h>#include <string.h>void main(){char s[]"hello";memset(s,*,2);printf("%s",s);} 输出&#xff1a…

CES Asia专题|微鹅展示无线充电,智能手机的无线充电时代何时来临?

无线充电离商业化应用还有多远&#xff1f; 此前一直有传闻苹果在新一代iPhone上会推出无线充电&#xff0c;在CES Asia上&#xff0c;我们也看到了无线充电技术方案解决商微鹅带来的最新产品。 据了解&#xff0c;目前我们所说的无线充电其实是指近场无线充电&#xff0c;让充…

Linux下Socket编程

Linux下Socket编程 网络的Socket数据传输是一种特殊的I/O&#xff0c;Socket也是一种文件描述符。Socket也具有一个类似于打开文件的函数调用Socket()&#xff0c;该函数返回一个整型的Socket描述符&#xff0c;随后的连接建立、数据传输等操作都是通过该Socket实现的。 什么…

看大众点评如何通过实时监控系统CAT打造7*24服务

为什么80%的码农都做不了架构师&#xff1f;>>> 看大众点评如何通过实时监控系统CAT打造7*24服务 2015-06-08 尤勇 高可用架构 https://github.com/dianping/cat 本文根据尤勇在【QCon高可用架构群】中的分享内容整理而成。 尤勇是大众点评网资深工程师&#x…

Python 快速实现分列转到行!

作者 | 黄伟呢来源 | 数据分析与统计学之美之前看到一篇文章&#xff0c;用Excel快速实现分列转到行的操做。数据源大致是这样的&#xff1a;基于此&#xff0c;我动起了一个念头&#xff1a;看看如何用Python快速实现这个操作。数据源已经构造好&#xff0c;咱们开干&#xff…

javabean属性的类型选择包装类还是基本数据类型

学生 参加考试&#xff0c;需要在表中存放分数score字段 &#xff0c;score是采用double 还是Double &#xff1f; 假如有个同学张三 没有参加考试&#xff0c;double 默认值 0 &#xff0c; Double 默认值 null 使用原始类型&#xff0c;无法区分0值没有数据&#xff0c;还是值…

C语言实现的Web服务器

另一篇&#xff1a;标准C实现WEB服务器http://blog.sina.com.cn/s/blog_4b73e7600100b02c.html本文原文地址&#xff1a; http://blog.sina.com.cn/s/blog_4b73e760010007id.html自己研究了好几天终于写出来一个&#xff0c;哈哈&#xff0c;当然也从网上得到了很多的帮助拉。谢…

使用深度学习检测混凝土结构中的表面裂缝

作者 | 小白来源 | 小白学视觉混凝土建筑裂缝介绍表面裂缝检测是监测混凝土结构健康的一项重要任务。如果裂纹发展并继续扩展&#xff0c;它们会减少有效承载表面积&#xff0c;并且随着时间的推移会导致结构失效。裂纹检测的人工过程费时费力&#xff0c;且受检验人员主观判断…

Python学习笔记--序列

Sequence序列 1.序列操作 seq[ind1:ind2] seq[ind] seq1 seq2 seq1 * seq2 seq * n obj in seq obj not in seq 2.切片操作 #反转操作 seq[::-1] #隔一个取一个 seq[::2] #取全部 seq[:None] ##序列类型可用的内建函数 enumerate(seq) #接受一个迭代对象&#xff0c;返回由索引…

「深度」线下大数据正成为构建精准“用户画像”的最大助力

不管是针对消费者的宣传还是营销&#xff0c;或者是针对公司的管理运营&#xff0c;大数据在其中的作用从本质来讲就是在构造“用户画像”。 近年来&#xff0c;在智能化趋势的推动下&#xff0c;社会经济的众多领域都发生了翻天覆地的变化&#xff0c;其中尤其以金融、零售等…

Android上成功实现了蓝牙的一些Profile

前段时间做蓝牙方面的开发&#xff0c;Google的Android只实现了Handset/Handfree和A2DP/AVRCP等Profile&#xff0c;而其 它常用的Profile如HID/DUN/SPP/OPP/FTP/PAN等却没有实现&#xff0c;并且Google方面关于何时实现也没有一个时间表。 前段时间我实现了HID/DUN/SPP三个Pro…

拥有「人类智能」的全球首款有「思想」的机器人,活细胞培养的神经元

出品 | AI科技大本营&#xff08;ID:rgznai100&#xff09; 脑机接口&#xff0c;其主体是人的大脑&#xff0c;利用人大脑中产生的信号转换为命令而执行任务。 首款有思想的机器人&#xff1f;是的&#xff0c;你真的没有看错&#xff01; 反过来说呢&#xff0c;比如主体是机…

使用VS2010调试技巧让C指针无处遁形

Linux 下调试远没有windows下的VS方便&#xff0c;不管是VC6还是VS2003&#xff0c;2005&#xff0c;2008&#xff0c;2010&#xff0c;2012. VS2012自动格式化代码 CtrlKD VS下调试一定要注意尽量不要用F11&#xff0c;要用F10&#xff01;不然需要引入库文件&#xff0c;提示…

Maven就是这么简单

2019独角兽企业重金招聘Python工程师标准>>> 什么是Maven Maven是一个采用纯Java编写的开源项目管理工具, Maven采用了一种被称之为Project Object Model (POM)概念来管理项目&#xff0c;所有的项目配置信息都被定义在一个叫做POM.xml的文件中.. **Maven是一款跨平…

C语言的内联函数的作用

关内联函数键字inline void myprintf(int a){priintf("%d",a);}int main(){for(i0;i<100;i)myprintf(3);}对于这个函数&#xff0c;在进行反复的打印3的过程中我们是不是要反复的调用myprintf(int a)这个函数&#xff0c;进函数和出函数是需要时间的&#xff0c;假…

推荐 2个十分好用的 pandas 数据探索分析神器!

作者 | 俊欣来源 | 关于数据分析与可视化今天小编给大家推荐两款超好用的工具来对数据进行探索分析。更好地帮助数据分析师从数据集当中来挖掘出有用的信息PandasGUI一听到这个名字&#xff0c;大家想必就会知道这个工具是在Pandas的基础之上加了GUI界面&#xff0c;它所具备的…

DoubleViewPager

https://github.com/eltld/DoubleViewPager https://github.com/eltld/DoubleViewPagerSample

OCQ亮相中国移动办公峰会 荣获2017中国移动办公创新品牌

11月21日至23日&#xff0c;由中国软件网主办的“新格局 再出发——企服三会”在北京中关村软件园国际会议中心隆重举行!国内市场上移动办公、CRM、HR三大领域的主流企业参加会议&#xff0c;百位业界专家学者汇聚一堂&#xff0c;交流经验&#xff0c;碰撞思维&#xff0c;对三…

typedef和define具体的详细区别

1) #define是预处理指令&#xff0c;在编译预处理时进行简单的替换&#xff0c;不作正确性检查&#xff0c;不关含义是否正确照样带入&#xff0c;只有在编译已被展开的源程序时才会发现可能的错误并报错。例如&#xff1a; #define PI 3.1415926 程序中的&#xff1a;areaPI*r…