從Ruby 到Python

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 公開第一版

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章