从Ruby 到Python

本文探讨了从Ruby语言转学到Python语言的路径,比较了两种语言的特性,并通过实例展示了Ruby程式如何转换为Python程式,强调了Python在多用途领域的优势与学习曲线的平滑性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

From Ruby to Python

从Ruby 到Python

作者: gasolin

版本: 0.8.2

1. 从Ruby 到Python

语言只是工具,在恰当的时候使用合适的工具做正确的事情,那就足够了么?

Ruby 语言是一门有用的语言,可以让妳完成妳的工作.

如果妳已经学习过Ruby 语言, 并以Ruby 语言写过程式.

那么学习同为动态语言的Python 语言也是一样容易的事.

经验

学习Ruby 语言的过程不难, 大多数人学习Ruby 语言的原因是因为Ruby On Rails 网页框架的热门所致.

虽然Ruby 语言是多用途的语言, 但是并不那么地普及. Ruby 的解译器相对来说执行效能不佳.

Python 语言相当容易学习, 也有Django, TurboGears, 等网站框架可以用来开发网站.

Python 语言是多用途的语言, 并且已熟练地运用于系统维护, 科学计算, 视窗程式, 网页开发等许多领域中.

Mac, FreeBSD, Linux 等作业系统均内建Python 语言,

Python 语言解译器具有相当好的执行效能.

Python 语言的语法比较接近其他主流的程式语言,

学习Python 后再学习其他主流语言的门槛较低;

如果妳具有Java 语言或c 语言的背景,

那么使用具有类似语法的Python 语言来写作是相当自然的事.

相同点

首先, Python 语言与Ruby 语言一样简单.

它们都是直译式的语言, 两者都不需编译就能透过直译器互动式地执行.

Python 语言与Ruby 语言一样一样是物件导向(Object-Oriented) 的程式语言

Python 语言同样也拥有发展相当良好的Django 与TurboGears 网页框架.

如同Ruby 语言在JAVA 语言上有JRuby 实现,

Python 语言在JAVA 语言上有Jython 实现. 在.Net 平台上有IronPython 实现.

额外的优点

* 执行效率高

* 第三方模组众多

* Python 语言可以使用C 语言来扩展

* C/C++/C#/Java 语言可以使用Python 语言来扩展

* 能轻易读懂其他人写的Python 程式

* 编写一次程式, 就能在10 多种平台上执行

一个可以达到的目标

我们从一个实际的例子开始: 将一个接受使用者输入数字n ,

然后输出2的n次方结果的 Ruby 程式改写成Python程式.

执行结果为:

输入1 得2**1 = 2,

输入2 得2**2 = 4,

输入3 得2**3 = 8,

输入4 得2**4 = 16,

输入5 得2**5 = 32,

依次类推。

1.1 程式展示

1.1.1 Ruby 语言原程式

power.rb

 #

# 计算2 的n 次方

#

#!/usr/bin/env ruby

# 计算n次方

def power(base, level)        #接受变量base(基底), level(级数)

  result = 0                          #宣告输出使用的变量

  if level != 1                     #判断:如果输入变量值不等于1

    result = base ** level;   #程式运算

  else                                  #其他情形

    result = 1;                     #程式运算

  end                                        #判断区块结束

  # ex: 输入2得2**2=4

  puts "输入#{level}得",

       "#{base}**#{level}=#{result}" #印出结果至萤幕

   return result; # 返回结果

end                                         #判断区块结束

# 接受使用者输入并印出结果

puts "get an input"             #印出问题至萤幕

input = gets.chomp              #读入数值到input变量

power(2, ipnut.to_i)            #呼叫power函式,以2为基底

1.1.2 改好的Python 程式

下面的程式是改写好的Python 程式. 后文中会作讲解

power.py

"""

    计算2 的n 次方

"""

# 计算n 次方

def power(base, level): # 接受变量base(基底), level(级数)

    if (level != 1): # 判断: 如果输入变量值不等于1

        result = base**level # 程式运算

    else: # 其他情形

        result = 1 # 程式运算

            

    print "输入%d 得%d**%d = %d"%(input, base,

           level, result) # 印出结果至萤幕

    return result # 返回结果

# 接受使用者输入并印出结果

if __name__ =="__main__": # 运行这个档案时执行

    input = int(raw_input("请输入数字:")) # 读入数值到input 变量

    power(2, input) # 呼叫power 函式, 以2 为基底

1.2 导入Import

Ruby 语言的输入与输出函式是内建的,

导入其他函式库的方式是使用require 语句

在Python 语言中, 输入与输出函式是内建的

Python 中导入其他函式库的方式则是使用import 语句.

参考阅读:

1.3 注解Comment

注解相当的重要, 它可以让妳在程式中写下让阅读这程式的人更容易了解这份程式的注释.

它也可以帮助妳在六个月后还能快速读懂妳自己的程式.

所以呀, 请尽量地在妳的程式里加入注解吧.

Ruby语言中使用井字符号"#" 来为各行加上注解,

Python 语言中使用井字符号"#" 来为各行加上注解.

对于较长的注解, Ruby 语言中使用:

=begin

    等号后接begin 开始

    等号后接end 结束

=end

 Python 语言中可以使用(注1)

"""

    三个双引号开始

    三个双引号结束

"""

参考阅读:

注1: ​​三个双引号包含的字串并不完全是注释, 它也可以是物件的一部分, 请参考

1.4 宣告与型态

Ruby 语言与python 语言中使用变量不用事先宣告型态, 这个特性称为动态型别(Dynamic Typing)

python 里可以还可以使用其他方便资料结构

参考阅读:

参考列表, 字典, 对于较长篇的代换, 还可以使用样板(template)

1.5 输入与输出

1.5.1 输出

Ruby 语言的输出函式是puts 和print,

Python 语言的输出函式是print

Ruby 语言中的puts 与Python 语言中的print 相似,

都会在字串尾端自动印出换行符号.

Ruby 语言中使用:

  puts "输入#{level}得",

       "#{base}**#{level}=#{result}" #印出结果至萤幕

Python 语言中使用:

print "输入%d 得%d**%d = %d"%(input, base,

       level, result) # 印出结果至萤幕

Ruby 语言中的print 是不会自动印出换行符号版本的puts,

在Python 语言中以print 字串后加上一个逗号(,) 来表示不自动换行(注1),

Ruby 语言中使用:

print "嗨, 妳好, \n今天Ruby 了没?"

Python 语言中使用:

print "嗨,妳好, \n今天Python了没?" ,

python 中可以使用单引号'', 双引号""表示字串,

或是使用三个双引号来表示长字串(与长补注相同).

 参考阅读:

注1:python 的print '...', 会在后面加空格,和ruby 的print 不完全一样。

1.5.2 输入

Ruby语言的输入函式是gets.chomp ,

Python 语言的输入函式是raw_input

Ruby 语言中使用:

puts " 请输入数字: "

input = gets.chomp # 读入数值到input变量

Python 语言中使用:

input = int(raw_input("请输入数字:")) # 读入数值到input 变量

注意python 语言中的型态不会动态改变, 所以我们使用int() 函式来强制指定input 变量为整数(int)型别

若写成

input = raw_input("请输入数字:")

则读入的input 变量会是字串(string)型别.

参考阅读:

1.6 程式和脚本

 1.6.1 函式的呼叫

在Ruby 语言中,传回值可以用return 返回

如果没有写return, Ruby 语言自动将函式中最后一个物件传回.

在Python 语言中需要指定返回值,若未指定返回值, 则函式执行完会传回None .

1.6.2 脚本

Ruby语言与 Python语言同样是直译 ​​式语言,程式在编写时就可以直接运行.

妳可以在互动式直译器中获得立即的执行结果.

两种程式都可以用脚本的方式运行.

改写后的脚本可以在1.12.2 节取得

参考阅读:

1.7 程式码缩排

1.7.1 区块判断

Ruby 语言中以判断语句标示一个判断区块的开始, 以End 标示一个判断区块的结束.

Python 语言的结束不需要以End 标示, 而是以"程式码缩排"来表示一个判断区块的开始或结束.

一个程式码缩排的适当距离是4个空格的距离.

注意到就像Ruby语言中一定要在每个区块后加上End语句一样,

Python 语言对在Python 中起到相同作用的"缩排"要求一样非常严格.

当Ruby 程式中少加了一个End 时, Ruby 语言直译器会出现解译错误的讯息;

当Python 程式中缩排不正确时, Python 语言直译器也会显示解译错误的讯息.

在我学习Python语言后, 我会把缩排这习惯带到我的Ruby语言程式中,

所以我的Ruby 语言程式也让人看起来很舒服.

1.7.2 易读性Readable

Python 程式因为缩排约定(indent)的关系(注1), 无论是谁写的都具有同样的规格,

这些约定形成了Python 语言风格(pythonic) 的一部分.

使用Python 语言, 任何人都可以写出美丽而且容易阅读的程式码.

比起ruby

     a = [0, 1, 2, 3, 4, 5, 6]

     a.each do |i|

     print i, " " if i == 1 .. i == 5

    

python 还是比较接近其他主流的程式语言的语法

    

     a = [0, 1, 2, 3, 4, 5, 6]

     for i in a:

         if i in range(1,6): print i

参考阅读:

(注1) 缩排约定只是python 语言风格的一部分, Python 语言除了有公认的程式设计格式约定之外, 程式里也内建Python 禅学的原则供参考.

1.8 运算符

Ruby 语言与Python 语言中常使用的运算符几乎是一致的

参考阅读:

1.9 流程判断

Ruby 语言中的if/else 语句与Python 语言中的if/else 语句几乎相同.

不同的是Python语言不需要以End标示一个判断区块的结束,

所以if/else 语句后要加上一个冒号表示if/else 判断区块的开始.

Python 语言的不同之处是多数的语句都针对可读性而做出改善.

例如多重判断的情况下,使用C语言常写成, if / else if ... / else语句.

到Python 语言中则是简化为if / elif ... / else 语句.

Python 语言中的for, while, try 语句都可以搭配else 语句

参考阅读:

Python 语言2.5 版中, 如本例中的简单流程判断可以写在一行之内:

如原程式:

    if (level != 1): # 判断: 如果输入变量值不等于1

        result = base**level # 程式运算

    else: # 其他情形

        result = 1 # 程式运算

可以改写为

    result = (base**level) if (level != 1) else 1

关于其他的elif, for, while, try 语句请参考

1.10 物件导向

学习Ruby 语言与Pyhton 语言都可以让妳迅速掌握物件导向程式设计.

 参考阅读:

1.11 程式优化

1.12 Python 程式

1.12.1 改好的Python 程式

power.py

"""

    计算2 的n 次方

"""

# 计算n 次方

def power(base, level):                 

    if (level != 1):                    

        result = base**int(level) # 程式运算

    else:                               

        result = 1                      

            

    print "输入%d 得%d**%d = %d"%(input, base,

           level, result)               

    return result                       

if __name__ =="__main__":               

    input = raw_input("请输入数字:")

    power(2, input)

1.12.2 Python 脚本

pyscript.py

#!/usr/bin/env python

def power(level):

     result = 2**int(level)

input = raw_input("请输入数字:")

power(2, input)

或更简单流程式的脚本:

pyscript2.py

#!/usr/bin/env python

input = int(raw_input("请输入数字:"))

2 ** input

有没有感觉到一点Python 语言的直觉了呢?

1.13 进一步的提高

请参考列出的参考书籍或文章, 进一步感受使用Python 语言的乐趣.

咬一口Python语言

网页框架TurboGears

网页框架Django

python.tw台湾Python语言使用者群组

python.cn大陆Python语言使用者群组

Ruby: A Python Programmer's Perspective

文件修改历史

--------------------------------

0.8.2 2007/6/15

0.8 2007/1/12 公开第一版

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值