為非程式員準備的簡潔Python語言教材,歡迎提問。
Python 的中文意思是巨蟒,大蟒蛇。
電腦編程主要概念¶
電腦語言編程的主要內容就這些:數字,文字,迴圈,公式,變數
數 字: 1, 2, 3, 5.6, 120, 32.4, 3.1415926, -3, -0.123
文字: 你好,我好,你太牛了,很黃很暴力,這類的文字。一般用雙引號(")或者單引號(')括起來。術語叫字串 ,就是一堆字元,串起來。
迴圈: 迴圈(loop)就是重複的做一件事。電腦是一個很笨的機器,基本上只會做加,減,乘,除,大於,小於,等於和迴圈這種簡單的工作。編程就是把複雜的問 題,拆成簡單的單元讓它重複。
幸虧有下面講到的公式,所以很多較複雜的問題已經有瞭解決方法,我們只是重 複的套用別人的解決公式就可以了,不用拆得太細。
Python 語言最大的優勢,就是這個語言中包含了大量解決常見問題的公式,你想乾的事,基本上都有人幫你幹了,你只是需要把他們組織,捆綁起來就可以了。比如下載文 件的公式,分析網頁內容的公式,壓縮檔的公式,處理電子郵件的公式等等。
公式: 就像數學公式 (a+b)2= a2 + 2ab + b2 這種。算的時候帶入具體數值,比如:(3+4)2 = 32 + 2*3*4 + 42 = 9+24+16 = 49 。前面的 (a+b)2 就是我們的公式名(當然編程時,我們會用一些比較容易明白的片語做為公式名,比如“和的平方”這種,英語或者拼音都可以),他需要兩個參數a,b;後面的 a2 + 2ab + b2 是具體怎麼算出來的步驟,這就是我們的公式內容。
在 電腦裡,公式的術語叫“函數”或者“方法”。我們定義一個函數,就是定義一條公式,用的時候,拿來參數a,b什麼 的,套一下公式就行了。
為了程式的結構清晰,我們往往會定義很多函數。把複雜的問題分成很多小問題,每個小問題放到一個函數 裡,然後在解決複雜問題的函數裡,使用這些小問題函數解決大問題。更重要的是我們可以大量的使用別人寫好的函數來解決自己的問題。
函數的作用是讓程式結構清晰,而且可以在不同的地方重複套用。
變數: 就是上面的a,b這種可以代表任何值,可以放進不定值的單詞。我們用變數來儲存我們程式中用到的各種數字,文字,公式。所謂參數,就是定義公式時候用到的 變數,就叫參數,換個馬甲而已。
換成術語,我們有:
數字 (number) => 數字
字串 (string) => 文字
迴圈 (loop) => 迴圈
函數/方法 (function/method) => 公式
變數 (variable) => 變數
到這裡,基本上編程就沒什麼可學得了。剩下的就是掌握各種程式設計語言特定的函數和迴圈的書寫格式,再掌握了別人已 經寫好的函數的用法,組合起來就得了。
基本編程¶
最基本的python程式:
print ("世界,你好!")存 到檔案 hello.py 裡,然後命令列下輸入 python hello.py 就可以看到結果了。
這裡就用到了 函數和字串,在螢幕上輸出一行:世界,你好!
Python 裡函數的用法是:函數名(參數1, 參數2)
這 裡 print 是函數;在螢幕上列印內容,"世界,你好!"是參數。
學會怎麼用函數了,再學會定義函數的格式,就差不多了。
定義函數¶
def a_b_pingfang(a, b): c = a**2 + 2*a*b + b**2 return c我 們定義一個(a+b)2的函數,def 是英語 define 的縮寫,意思是定義函數,定義公式。
第 1 行就是說我們要定義一個函數名叫 a_b_pingfang 的函數,用它的時候,需要兩個參 數a 和 b。尾巴上有個冒號,冒號的意思是說:“下面的一段就是公式定義了,要注意了”。
電腦編程裡,* 代表乘法,/代表除法,** 代表乘方, b**2 就是 b 的二次方。
注意: Python 是用 縮排空格 來表示段落的,冒號(:)來表示段落開始。
第 2 行先縮排4個空格,說明下面縮排4格的,都是同一段落。用來具體計算上面的定義的公式的。把 a2+2*a*b+b2 的計算結果,放到c裡。
c類似於a,b,都是表示一個變數,它可以用來存放數字,文字,甚至函數。這裡它存放的是用a,b計算後得到的 結果。因為不是在函數名裡,所以術語叫做“變數”,在函數名裡,就叫參數了。
“變數”就是用一個單詞來代表一個可以變化的量的。單詞裡可 以有字母,數字和下加線(_),數字不能打頭。
第 3 行,把存在c裡的結果,傳回給函數的使用者。
return 命令的意思,就是立即結束函數的執行,把return後面的值傳給調用者,可以傳回多個值。
現在可以使用這個公式了,我們叫調 用函數 :
ping2 = a_b_pingfang(2, 3)ping2 裡存放了 a_b_pingfang(2, 3)得到的結果,也就是上面 return c 這句,把 c 的內容,傳給了外面的ping2。
把結果列印出來:
print(ping2)全 部程式是:
def a_b_pingfang(a, b): c = a**2 + 2*a*b + b**2 return cping2 = a_b_pingfang(2, 3)print(ping2)存 到 test2.py ,跑 python test2.py 就可以看到輸出 25。
迴圈 (loop)¶
當然還有迴圈,怎麼讓程式重複的做事?我們有 while(當...), for(對於...) 命令來進行迴圈控制。
a = 0while a < 100: a = a + 1這 個迴圈說,當 a < 100 的時候,把 a 增加 1,然後重複。當 a 等於100了,就結束了。
我們有 <, >, ==, <=, >=, != 來判斷大於,小於,等於,小於等於,大於等於,不等於。
還有 and, or, not 來進行邏輯運算,所謂邏輯運算,就是測試已有判斷之間的關係的:
a == 1 and b != 2 來測試這兩個判斷是否同時成立。 a == 1 or b != 2 來測試這兩個判斷裡是否有至少一個成立。 not a == 1 來測試這個判斷是否是錯的。錯的就是對的,對的就是錯的,顛倒黑白。
我們還有 break(中斷) 來打斷迴圈,和 continue(繼續) 來立刻回到迴圈開始,也可以用 if(是否) 命令來進行判斷:
a = 0while True: a = a + 1 if a >= 100: break這 裡 True 表示總是正確,相對的是 False 表示錯誤。這一段是說一直執行,因為 while 總是正確。下面在 if 處判斷a是否大於等於100,如果是,那麼執行 if 下的段落,這裡我們打斷了迴圈。
for 迴圈是利用下面介紹的的列表資料結構對列表進行迴圈。
Python 資料概念¶
下面具體到python特殊的規定,它有幾個特殊的儲存資料的格式。
列 表: list
元組: tuple
字典: dict (dictionary)
列表 (list)¶
列表:把很多變數存進一個列表裡,叫列的意思,就因為他像列車一樣,一節一 節車廂,每廂放一個變數。格式為 b, c, 1, 3, 5, '葡萄', '葡萄皮兒',可以看到,方括弧裡,可以放具體的數字,文字,也可以放變數,用逗號分隔。
這些內容是在固定位置上,可以通過他們的位置, 來提取:
alist = [1, 3, 5, '很傻', '葡萄', '葡萄皮兒', a, var1]print (alist[0]) # 列印 "1"在 python裡,數數是從0開始數的,開始是0,然後是1,2,3,4,5,所以上面的列表 alist的第一個內容,可以用alist[0]來 提取,第二個用alist[2]來提取。
print (alist[4]) # 列印 '葡萄'
這裡,我們可以介紹用 for 迴圈來訪問這個列表裡的所有內容:
for me in alist: print (me)上 面這一段,列印所有alist裡的內容。
這個迴圈是,對於列表 alist ,從 0 開始,訪問它的每一個位置,把這個位置上的值, 放到me裡,然後針對不同的me值,重複執行下面段落的內容。
in 表示me在alist裡,也可以用來判斷:
if "葡萄" in alist: print "葡萄在alist裡!"這 個列表的內容是可以改變的,我們可以把第4個位置設為"很天真":
alist[3] = alist[3] + ' 很天真'print (alist[3]) # 列印 '很傻 很天真'元組 (tuple)¶
元組:元組就是列表,但是他的內容是不能改變的。 他的內容只能一開始就設定。但是,元組和列表之間是可以用函數互相轉變的,轉成列表就可以改變內容,轉回元組就不能改了。
元組是用圓括弧 來表示,所以叫元組嘛。
atuple = (2, 3, "老子")alist = list(atuple) # 變成 [2, 3, "老子"]alist[0] = 0tuple2 = tuple(alist) # 變回 (0, 3, "老子")在 python 裡,字串也是一種特殊的元組,也就是內容不可變的字元列表。
txt = 'abcdefg'print(txt[1]) # 'b'字典 (dict)¶
字典:字典就像一般的字典,一個字,一個解釋,再一個字,再一個解釋。用大 括弧表示:
adict = {1: "我是解釋", 2: "我是解釋2", "我是3": 3, "我是4": 4}前 面的字叫鑰匙(key)或者索引,後面的解釋,叫"值"。索引不能重複,必須是唯一的。
我們可以看到,前面的字,和後面的解釋可以是數 字,文字,還可以是函數或者元組。但是前面的字,不能是列表,因為列表內容是可變的,可變的東西都不能做索引。
我們用索引來提取值,而不 是用位置:
adict[1] # "我是解釋"adict["我是3"] # 3模組 (module)¶
Python 裡包涵了很多別人寫好的函數、方法讓我們直接利用。譬如寫網路程式的函數,數 學計算的函數,分析電郵檔案的函數,加密的函數。
這些函數 分門別類的放到叫“模組”的東西裡。一個模組裡,包括很多功能相類的函數。而具體實現上,一個模組,就是一個python的程式檔案。
如 果模組還還需要細分更多層,那麼每層就是一個檔案目錄。裡面有很多做為模組的python檔案。
要使用模組,我們用“進口”這個命令: import
import timenow = time.clock()print (now)這 裡,我們先進口 time 模組,然後使用 time 模組裡的函數 clock() ,得到目前時間,列印出來。
用個句點表示模組 time裡的clock函數: 模組名.函數名
在 python 裡,我們會用到很多別人寫的模組,能自己少寫點兒源碼,盡量少寫,懶不是?
類 (class)¶
其實編程來說,類並不是必須的,但是因為很多python提供的模組,裡面 的函數都是包在類裡面的,所以我們需要介紹一下類。
物件導向編程,是現在比較流行的編程模式,是個人都得用“面像對象”的思路來編程。基 本上就是把同類的函數,打包放到一個叫“類”的東西裡。
這個“類”一般上是以具體的東西為模子,譬如物種:人類,貓類;物品:傢俱類,電 器類。他裡面打包的函數,基本上是針對這個類進行操作的,譬如人說話,人吃飯,貓逮耗子,家居磨損。
使用類的時候,我們先具體化他,把類 變成個體。人類變成某人,貓類變成某貓,傢俱變 成某傢俱文法上比較怪,只好變成一件傢俱。這個具體化的類,就是所謂的“對象(object) ”。然後我們就可以使用這個具體人,貓,家居的函數,針對具體的人,物進行操作了。
定義類¶
class RenLei: def __init__(self, mingzi): # self 是一個固定參數,代表這個對象自己。 self.mingzi = mingzi # 把名字存到對象自己的 mingzi 變數上。 def shui2(self): return self.mingzi在 類的定義裡,每一個函數,他的第一個參數,都是規定死的,必須是self。self代表這個對象自己。這個對像本身的變數,函數,都是通過這個自己來存取 的。
你可以管他叫wo3, you, me,用什麼名字隨便,但是第一位置的,就是代表對象自己。
def __init__(wo3, mingzi): wo3.mingzi = mingzi也 可以。
在調用類裡的函數時,不用提供 self 這個參數,程式自動加入 self。我們只要提供其他參數即可。
__init__() 這個函數是特殊函數,他代表建立函數的時候,需要的使用的參數。通過類建立函數的時候,程式會自動調用 __init__()函數。
具體化類,建立對象¶
# 建立對象,提供的函數對應__init__() 函數,self 參數程式自動提供,不用我們提供。xiaozhang1 = RenLei("小張") mingzi = xiaozhang1.shui2() # 使用“對象名.函數名()”的格式來調用類裡的函數。print mingzi <-- "小張"字串的對象性質¶
Python 裡的字串,列表,元組,字典,都是面對對象的類,所以他們本身帶有很多函數可以對自己進行操作,譬如:
a = "握手 不一定 就是 友誼".split()split 是字串的函數,他可以把字串在給定位置分段,當我們不給他參數的時候,會在所有空白位置分割,然後返回一個列表,裡面是被割裂的字串。
結 果,a 的內容是 ["握手", "不一定", "就是", "友誼"],這是一個有4個元素的列表。
對於字串,列 表,字典之類的操作,請熟讀說明手冊他們的說明,python編程,主要就靠字串,列表和字典了。
Python 程式書編程習慣¶
寫一個 Python 程式,我們一般步驟是:
進 口所有會用到到模組 import
定義我們自己的類和函數。每個函數裡要用到的函數,被調用的函數一般放在調用函數的前面定義。這樣 我們讀程式的時候,就知道調用的函數,在前面是怎麼定義的,有什麼功能,需要什麼參數,返回什麼值。
在檔案的最下面,調用上面定義的 函數和類,開始工作。
盡量使用python提供的內建函數和模組裡的函數,所以我們對Python的模組說明手冊要很熟悉。
Python 運行,是從檔案的上面往下走的,看到命令執行命令,一直到最後一行。當我們定義函數和類的時候,他們只是定義,而沒有執行,所以Python 看到他們,先存起來,直到看到定義外的具體命令,才真正的執行。如果這個命令調用上面的函數,那麼就把存起來的函數執行一下。
Python 裡注釋符號是"#"。就是說,在 # 符號後的那一行文字,都當做解釋,不做為程式的命令。
print ("打醬油!") # print ("關我屁事")只 列印出 “打醬油”,剩下的,因為是在 # 後面,所以程式把他們當做注釋語言自動忽略了。
完整例子: 把一個兩列的檔案input.txt,分割成兩個檔案col1.txt, col2.txt,一個檔案一列。 input.txt 內容:
a1 啊阿ai1 挨埃哀ao2 熬鼇翱獒程 序內容:
def split_file(filename): # 把檔案分成兩列 col1 = [] # 儲存第一列 col2 = [] fd = open(filename) # open 函數用來開啟檔案,返回一個檔案對象 text = fd.read() # fd.read 讀入檔案fd 的內容。 lines = text.splitlines() # 把讀入的內容分行 for line in lines: # 迴圈每一行 part = line.split(None, 1) # 分割一行。 col1.append(part[0]) # 把分割的第一部分放到col1後面。 col2.append(part[1]) return col1, col2 # 返回 col1, col2def write_list(filename, alist): # 把文字列表內容寫入檔案 fd = open(filename, 'w') # 開啟輸出檔案col1.txt,'w'指定使用寫入模式。 for line in alist: fd.write(line + '/n')def main(): # 主函數,程式進入點,習慣性叫他 main() filename = 'input.txt' # 把輸入檔案名稱 input.txt 放進一個變數 col1, col2 = split_file(filename) # 調用分割函數,結果存入 col1, col2 write_list('col1.txt', col1) # 調用寫入函數 write_list('col2.txt', col2)main() # 唯一的函數外命令,程式開始執行,調用上面的 main() 函數數。這 裡,輸入的檔案名稱是寫死的 input.txt ,我們可以使用模組 optparse 來通過命令列讀取使用者提供的檔案,會更靈活些。
參考資料¶
更多的功能,函數,請參考python的官方教學和手冊。
先熟悉:
內建函數
內建資料類 型 (字串,數字,列表,字典,檔案對象)
sys 模組
re 模組
os 模組
optparse 模組
熟悉這些,基本上編程沒問題了。
深入 Python是一本經典的參考書,雖然沒有涵蓋所有python模組的內容,但是對初學者基本夠用。而且它 是一個自由檔案,說俗了就是合法免費的,又有中文翻譯版,難得。
也可以參考 Python 絕對簡明手冊這個中文說明。
如果需要網路編程,還要熟悉網路相關的模組。如果想 要圖形介面,建議使用pygtk或者pyqt圖形介面函數庫,這時候,也需要熟悉面對對象編程的概念。
對於英文不好的人,建議買一本有Python函數模組介紹的中文書,作為參考書,在編程的時候,邊編邊翻書。
Python 的中文意思是巨蟒,大蟒蛇。但是這個語言的具體出處是一個叫Monty Python的英 國電視劇。
本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/suiyc/archive/2010/06/24/5692844.aspx