From C to Python
http://docs.google.com/View?docid=ajkxs9k6pqxr_98gkkgx8從 C 到 Python
作者: gasolin
版本: 0.9.2
1. 從 C 到 Python
語言只是工具,在恰當的時候使用合適的工具做正確的事情,那就足夠了麼?
C 語言是一門有用的語言, 可以讓妳完成妳的工作.
如果妳已經能運用 C 語言寫作程式,
那麼學習 Python 語言則可以讓妳在寫程式的同時還能獲得樂趣.
經驗
學習 C 語言的過程並不容易, 但是跨出從 C 語言到 Python 語言轉換的過程卻相當簡單.
我得承認在我剛開始學習 Python 語言時也是拿我熟悉的 C 語言程式來作修改,
在我最初寫作 Python 語言程式時, Python 程式裡那些 C 語言才使用分號都還留著
(python 語言並不需要結束符號, 但仍然可以使用), 得到的結果是一個骨子裡是 C 語言的 Python 程式.
學習 Python 語言的原因只為Python 語言跟 C 語言的語法超像, 貪圖使用 Python 語言時不用預先編譯的方便性.
(這些 Python 語言的特性將在文中一一介紹).
後來漸漸深入學習 Python 語言, 才發現原來 Python 語言有它自己的特色與風格: 簡單, 易讀, 可移植性, 高效率.
相同點
首先, Python 語言直譯器是用 C 語言撰寫的,
你可以期望 Python 語言與 C 語言的語法有很多相近之處.
雖然 Python 語言是直譯式的語言, 但是 Python 語言也具有很高的執行效能.
Python 語言像 C 語言的近親 C++ 語言一樣是物件導向 (Object-Oriented) 的程式語言,
但是用起來簡單地多. 同時妳仍然可以用 C 語言流程式的方式來撰寫程式.
額外的優點
* Python 程式不需編譯就能透過直譯器互動式地執行
* 能輕易讀懂其他人寫的 Python 程式
* 編寫一次程式, 就能在 10 多種平台上執行
* Python 可以使用 C 語言來擴展
一個可以達到的目標
我們從一個實際的例子開始: 將一個接受使用者輸入數字 n ,
然後輸出 2 的 n 次方結果的 C 程式改寫成 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 C 語言原程式
power.c
/*************************
* 計算 2 的 n 次方
*************************/
#include <stdio.h> // 導入IO處理函式庫
/* 計算 n 次方 */
power(int base, int level) // 接受變量 base(基底), level(級數)
{ // 函式區塊開始
int result; // 宣告輸出使用的變量
if (level != 1): // 判斷: 如果輸入變量值不等於1
{ // 判斷區塊開始
result = base**level; // 程式運算
} // 判斷區塊結束
else // 其他情形
{ // 判斷區塊開始
result = 1; // 程式運算
} // 判斷區塊結束
// ex: 輸入 2 得 2**2 = 4
printf("輸入 %d 得 %d**%d = %d", &input, &base,
&level, &result); // 印出結果至螢幕
return result // 返回結果
} // 函式區塊結束
/* 接受使用者輸入並印出結果 */
main() // 主程式
{ // 函式區塊開始
int input; // 宣告輸入使用的變量
scanf("請輸入數字:", %input); // 讀入數值到 input 變量
power(2, input); // 呼叫 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
C 語言的輸入與輸出需要使用到 IO 處理函式庫 stdio.h,
取用其他函式庫的方式是使用 include 語句
Python 中取用其他函式庫的方式則是使用 import 語句.
而在 Python 語言中, 輸入與輸出函式是內建的
參考閱讀:
1.3 註解 Comment
註解相當的重要, 它可以讓妳在程式中寫下讓閱讀這程式的人更容易瞭解這份程式的註釋.
它也可以幫助妳在六個月後還能快速讀懂妳自己的程式.
所以呀, 請儘量地在妳的程式裡加入註解吧.
C 語言中使用兩個斜線符號 "//" 來為各行加上註解,
Python 語言中使用井字符號 "#" 來為各行加上註解.
對於較長的註解, C 語言中使用:
/*
斜線接星號開始
星號接斜線結束
*/
Python 語言中可以使用(註1)
"""
三個雙引號開始
三個雙引號結束
"""
參考閱讀:
註1: 三個雙引號包含的字串並不完全是註釋, 它也可以是物件的一部分, 請參考
1.4 宣告與型態
C 語言中使用變量前需要事先宣告型態.
python 語言中使用變量則不用事先宣告型態, 這個特性稱為動態型別 (Dynamic Typing)
在使用 Python 語言時, C 語言中宣告的部份都可以省略
python 裡可以還可以使用其他方便資料結構
參考閱讀:
參考 列表, 字典, 對於較長篇的代換, 還可以使用樣板(template)
1.5 輸入與輸出
1.5.1 輸出
C 語言的輸出函式是 printf,
Python 語言的輸出函式是 print
兩者僅有些微妙的差異.
C 語言中使用:
printf("輸入 %d 得 %d**%d = %d", &input, &base,
&level, &result); // 印出結果至螢幕
Python 語言中使用:
print "輸入 %d 得 %d**%d = %d"%(input, base,
level, result) # 印出結果至螢幕
python 中可以使用單引號'', 雙引號""表示字串,
或是使用三個雙引號來表示長字串(與長補註相同).
參考閱讀:
1.5.2 輸入
C 語言的輸入函式是 scanf,
Python 語言的輸入函式是 raw_input (註1)
C 語言中使用:
scanf("請輸入數字:", %input); // 讀入數值到 input 變量
Python 語言中使用:
input = int(raw_input("請輸入數字:"))# 讀入數值到 input 變量
注意 python 語言中的型態不會動態改變, 所以我們使用 int() 函式來強制指定 input 變量為整數(int)型別
若寫成
input = raw_input("請輸入數字:")
則讀入的 input 變量會是字串(string)型別.
參考閱讀:
註1:
scanf 與 raw_input 並不完全等同。scanf 中可以有格式設定字串,raw_input 中則不能直接使用格式設定字串
1.6 程式和腳本
1.6.1 函式的呼叫
c 語言中標示首次執行需使用主函式 main() 表示,
python 語言中並沒有主函式 (main()) 一說。在導入時,程式碼將從頭自動執行。
python 語言中可以用
if __name__ == "__main__":
語句來判斷一個模組(或檔案)是直接運行還是導入後運行, 頗似 C 語言中使用 main() 函式的執行效果.
C 語言中使用:
main()
{
...
}
Python 語言中可以使用:
if __name__ =="__main__":
...
來判斷一個模組(或檔案)直接運行時應執行的內容
1.6.2 腳本
C 語言是編譯式的語言, 在運行程式前必須先行編譯.
Python 語言是直譯式語言, 程式在編寫時就可以直接運行.
妳可以在互動式直譯器中獲得立即的執行結果.
其實 Python 語言裡並不需要用到 main 函式, Python 程式也可以用腳本的方式運行.
改寫後的腳本可以在 1.12.2 節取得
參考閱讀:
1.7 程式碼縮排
1.7.1 區塊判斷
c 語言中以大括號標示一個判斷區塊的開始和結束, 這種表示方法被許多語言所沿用.
Python 語言不需要以大括號標示, 而是區塊的前一句以冒號 ':' 結尾以判斷區塊的開始, 並以"程式碼縮排"來表示一個判斷區塊的區段,
具有不同縮排程度的地方代表不同區塊的結束.
一個程式碼縮排的適當距離是4個空格的距離.
注意到就像 C 語言中一定要在每個區塊前後加上大括號一樣,
Python 語言對在 Python 中起到相同作用的"縮排"要求一樣非常嚴格.
當 C 程式中少加了一個大括號時, C 語言編譯器會出現括號不匹配的錯誤訊息;
當 Python 程式中縮排或是冒號 ':' 結尾不正確時, Python 語言直譯器也會顯示解譯錯誤的訊息.
在我學習 Python 語言後, 我會把縮排這習慣帶到我的 C 語言程式中,
所以我的 C 語言程式也讓人看起來很舒服.
1.7.2 易讀性 Readable
C 語言無所不能, 妳可以用 C 語言完成任何事.
但是取用其他人寫的 C 語言程式時, 有時會發現拿到的程式碼實在難以閱讀.
C 語言的程式當然也可以寫得讓人看起來很舒服, 但我無法要求其他人寫出的 C 程式都易於閱讀.
Python 程式因為縮排約定(indent)的關係(註1), 無論是誰寫的都具有同樣的規格,
這些約定形成了 Python 語言風格 (pythonic) 的一部分.
使用 Python 語言, 任何人都可以寫出美麗而且容易閱讀的程式碼.
參考閱讀:
(註1) 縮排約定只是 python 語言風格的一部分, Python 語言除了有公認的程式設計格式約定之外, 程式裡也內建 Python 禪學的原則供參考.
1.8 運算符
C 語言與 Python 語言中常使用的運算符幾乎是一致的
參考閱讀:
1.9 流程判斷
C 語言中的 if/else 語句與 Python 語言中的 if/else 語句完全相同.
不同的是 Python 語言不需要以大括號標示一個判斷區塊的開始或結束,
所以 if/else 語句後要加上一個冒號表示 if/else 判斷區塊的開始.
Python 語言的不同之處是多數的語句都針對可讀性而做出改善.
例如多重判斷的情況下, 使用 C 語言常寫成, if / else if ... / else 語句.
到 Python 語言中則是簡化為 if / elif ... / else 語句.
Python 語言中的 for, while, try 語句都可以搭配 else 語句,而 C 語言中沒有。
參考閱讀:
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 物件導向
C 語言是流程導向的程式語言, 並沒有物件導向 (Object-Oriented) 的設計觀念.
C 語言的近親 C++ 語言雖然加入了物件導向觀念,
但使用上較為複雜.
學習Pyhton 可以讓妳迅速掌握物件導向程式設計.
參考閱讀:
1.11 程式優化
在看到這個範例的同時, 聰明的妳可能已經開始想著怎麼優化 (refinement) 這個笨程式.
妳可能會想用C 語言中陣列來取代簡單的2次方結果, 好省下一些 CPU 計算時間.
在 c 語言中妳可能會這麼寫:
#define LOOKUP_SIZE = 10
int lookup[LOOKUP_SIZE];
lookup = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024];
if (level <= LOOKUP_SIZE)
{
result = lookup[level-1];
}
.....
在 Python 語言中可以這麼寫:
lookup = [2, 4, 8, 16, 32, 64, 128, 256, 512, 1024]
if (level <= len(lookup)):
result = lookup[level-1]
這個寫法用到"列表"這個 Python 型別.
或者, 妳也可以用 Python 高效能的"字典" 型別來快取妳已經計算過的結果, 稍後再遇到相同輸入值的時後可以馬上取出結果.
和C語言最大的不同點是, Python 語言在優化的過程中, 隨時可以運行以確認妳的程式碼是否正確.
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 語言的樂趣.
http://docs.google.com/View?docid=ajkxs9k6pqxr_3fb3njp
[url]http://docs.google.com/View?docid=ajkxs9k6pqxr_98gkkgx8[/url]
收藏了:loveliness:
页:
[1]