2011年2月22日 星期二

3 -3 Python List

Python 的 Array 陣列叫做List, 不曉得怎麼說算不算正確?

目前來說, 這樣的解釋是最恰當不過的....

List的表示是利用 [](一組方括號)來定義的, 在一個list裡面,

你可以有多個數值放在裡面, 如下面的例子

ex1:
>>> integer_list=[1,2,3,4] -->整數的list
>>> string_list=['a','b','c'] -->字串的list
>>> combine_list=integer_list + string_list -->混合式的list
>>> combine_list
[1, 2, 3, 4, 'a', 'b', 'c']

ex2:利用for 回圈把數值讀出
>>> for i in combine_list: -->定義了一個變數i
... print i -->列印變數i, 在此要空兩格, 因為Python寫法要求有固定的形式
...
1
2
3
4
a
b
c


ex3:如何倒印上面的例子
>>> combine_list.reverse()
>>> for i in combine_list:
... print i
...
c
b
a
4
3
2
1

ex4: 如何知道list的長度?
>>> list
[1, 2, 3]
>>> len(list)
3
>>>


2011年2月18日 星期五

3 - 1 variable 變數


[宣告變數]

在python, 定義一個變數相當的簡單,

不用在意變數的型態(type)是整數(integer), 浮點數(float), 還是字串(string)

下面的例子, 可以讓讀者清楚地了解.

ex1: integer
>>> var1 = 1
>>> type(var1)

ex2: float
>>> var2 = 1.23
>>> type(var2)

ex3:string
>>> var3 = 'var3'
>>> type(var3)


[變數計算]
變數的宣告就是那麼的簡單, 讓我們來看看如何做一些計算與運用
ex4:
>>> var1 = 5
>>> var2 = 4
>>> var3 = var1+var2
>>> var4 = var1 / var2
>>> var5 = var3 * var1
>>> print var1, var2, var3, var4 , var5
5 4 9 1 45


這部份與python 的計算機功能非常相似, 所以W在此不多加介紹



2011年2月16日 星期三

10 - 1 正規表示-2

在上一個篇幅裡, W簡單的介紹了 search 跟 findall的功能(function),
還有如何使用pattern的概念.如果忘記了, 可以回第一篇復習一下 :)

在這個章節裡, 我們將更深入pattern的內部,了解有哪些regex的關鍵字可以使用,
及相對應的語法.

正規表示(regex)關鍵字:

. 任何字元,數字,符號,及空格
\w 任何字元,數字
\d 任何數字
\s 任何空格
+ 1個或1個以上
* 0個或0個以上

接下來,我們來看看以下的例子.

ex1:
>>> import re
>>> string='abc 123 cde'
>>> pat='..c'
>>> match = re.search(pat,string)
>>> match.group()
'abc'

pat='..c', 指的是找到三個字元,且最後一個字元為c的pattern,
所以會返回一個值, 'abc',
讀者可以試試看,找出開頭為1的pattern,那pat = ?


為了可以簡化流程, W在這裡多加一個功能(function)

def find(pattern, string):
match = re.search(pattern,string)
if match: print match.group()
else: print "not find"

讀者可以藉由這項功能, 不用狂打字, 可以專心練習正規表示的符號.

ex2: (找出開頭為1的pattern)
>>> pat='1..'
或者可以是,
>>> pat = r'\d+'
>>> find(pat,string)
123

pat = r'\d+' 在這個pattern, \d指的是"1"個數字, +加號表達是1個以上的數字,
既然要找的是'123',我們須要有一個以上的數字在我們的pattern之中, 所以要把+加號放在\d的後面, 然後find就會返回一個字串'123'


讓我們再試試看這個例子,

ex3:W把string改成 '1 2 3 123 abc cde', pattern該如何改才可以找到'123'?
>>> string = '1 2 3 123 abc cde'
>>> find(pat,string)
123

因為在'123'前面有三個單獨的數字'1', '2', '3', 很顯然 pat = r'\d+'會match所有的數字,
而我們卻只想要有三個數字黏在一起的'123', 下面是W給的pattern

>>pat = r'\d{3}' , 這樣的寫法表示, 只有三個數字不能多也不能少才是W要的,
然後regex就會去比對,
''1', '2','3'都是單一的數字, 所以不合乎我們的要求, 到了'123', 三個數字,
bingo!找到了黏在一起的'123',
除此之外, W相信大家注意到了, W在單引號(quote)前面放一個'r',
小寫r表示raw string, 意思是python不須要做任何特殊處理的動作,
如果單引號(quote)裡面有遇到反斜線(back slash) "\"!


下面這個例子就是用來解釋raw string,

ex4: 找到".abc"而不是"abc"
>>> string = '.abc 123 abc'
>>> pat = r"\.\w+"
>>> find(pat,string)
.abc

'\.' 的意思是 , 利用反斜線'\'是讓 '.' 原本可以代表任何字元的特殊意思被剔除,
所以'\.'代表的就是符號 點 '.'

再看看下面這個例子,

ex5:找到目錄(directory)路逕
>>> string = r'\home\python\pypyso 123455'
>>> print string
\home\python\pypyso 123455
>>> pat=r'\\\w+\\\w+\\\w+'
>>> find(pat,string)
\home\python\pypyso


'\\'兩個反斜線表示在字串之中找尋一個反斜線,

為什麼使用兩個反斜線呢? 第一個反斜線是用來拿掉反斜線的特殊意義,
所以要在字串裡找尋反斜線符號, 要有兩個反斜線(\\)








10 - 1 正規表示-1

W覺得正規表示法太重要了, 有多重要?

shell script 用不用?

perl 用不用?

Tcl 用不用?

想當然python絕對是不能缺席的!

所以只能說~~太太太重要了!

當讀者需要處理大量的文字訊息, 例如一整個網頁, 一份log, 逐字逐句的看嗎?

100行以內可能還可以辦到, 倘若1000000行, 或甚至更多的時候, 該怎麼辦?

好在, 早就有人發現了這個問題, 發明了regular expression (正規表示),

它的好處是可以處理掉讀者不想閱讀的部份, 或是過濾掉不必要的訊息,

只清楚地顯示你所需要的那一部份..


這樣解釋或許有點讓人不清楚, 讓我們看看以下的例子


在python之中, 要使用regular expression (簡稱regex), 只要import re這個模組,

ex1:
>>> import re
>>> pat='abc'
>>> string='123 abc'
>>> match = re.search(pat,string)
>>> match.group()
'abc'
>>>

在例子1當中,
1. 我們import re, re指的就是正規表示(regex)
2. 定義了要檢查的樣式(pattern), pat = 'abc', 意思是要找含有'abc'的樣式
3. string = '123 abc' 指的是將被搜尋的字串
4. 定義了match, 指的是如果正規表示找到了含有abc的字串, 把結果存入match這個物件(object)之中
5. re.search(patter,string), 當使用 re的search功能, 第一個需要放入檢驗用的樣式(pattern), 第二要放入將被搜尋的字串(string)
6. 透過 match.group()可以顯示出找到的字串

讓我們再看看下一個例子
ex2:
>>> string='123 abc abc abc'
>>> match = re.search(pat,string)
>>> match.group()
'abc'
>>>

在這, 我們可以發現search, 只會配對一次, 就算後面還有也不會處理,
所以match.group()只會單單顯示一個結果,
那如果我們想要找到所有的結果呢?

python 當然早就準備好囉!請看下面一個例子,

ex3:
>>> match = re.findall(pat,string)
>>> match
['abc', 'abc', 'abc']

我們在這用了 findall(), 用法跟search 十分相似, 也需要給pattern跟string.
,然後結果會返回一個串列(list), 如上所示.找到了三組'abc'

應該比想像中簡單吧? 在讓我們實驗一下下面這個例子,

ex4:
>>> pat = 'cde'
>>> match = re.search(pat,string)
>>> match
>>> type(match)

>>> match.group()
Traceback (most recent call last):
File "", line 1, in
AttributeError: 'NoneType' object has no attribute 'group'
>>>

1. 在這個例子, W把pat換成'cde', 當然會在string找不到配對成功的結果,
2. match這個物件(object)變成None, 因為re.search()找不到所以返回(return)一個空值(None)
3. W順便利用一下type(), 來檢驗一下match這個物件(object)的形態
4. 如上所示, type 是空值
5. 所以match.group()會有錯誤訊息告訴讀者, 沒有group這個屬性(attribute)

經過上面幾個例子的練習, W想大家應該對re摸組的search跟findall有一定的認識了,



不過老實說,

W還沒開始介紹真正的正規表示(regex), 嘿嘿~

其實正規表示指的是利用某些通用的符號或是正規表示的關鍵字, 達到處理字串的效果.

在正規表示的一開始, 總要先瞭解一下有那些function可以使用, 該怎麼用, 然後再來學習regex,

各位看官您說是吧?


在下一個篇幅, W就要正式切入正規表示法囉, 請務必練習一下上面的例子!

2011年2月15日 星期二

寫起來也是一種幸福

W這次吃了秤砣鐵了心, 也要把這裡搞得盡善盡美,

原因很簡單,

W也是健忘一哥, 常常是寫好寫過的東西,

一段時間沒有摸, 就給他忘得一乾二淨,

部落格就是一個W做筆記的好地方,

也可以有讀者觀看, 有任何錯誤可以被指證,

只能說有百利無害, 頂多累一點,

不過, 很久沒那麼熱血,

W只能告訴自己, 一定要好好的維持這裡的運作囉!

大家一起加油吧!


誰說30歲以後的人, 不能熱血?

3-3 python版的計算機

還記得W之前說的計算機功能嗎?

自從W使用python之後, 已經好久沒有用工程計算機了,

不過, 也沒有什麼機會做繁複的計算, 哈~

切入主題要緊, 就不剌賽了...

1. 進到python interpreter

2. 你會看到>>>


在此之後, W都會直接以>>>” 表示 python interpreter

現在, 妳就可以開始使用你的python計算機囉~

[基本計算]
ex1: >>> 2 + 3
會印出5

ex2: >>> 10 / 3
會印出3, 而不是3.33333

ex3: >>> 10 % 3
餘數為1, 所以會印出 1

ex4: >>>2.75 % 0.5
0.25

[Python的特殊之處]
例子三裡面, 因為python將被除數與除數, 認定為整數, 所以輸出為整數.

若想要看到小數點被完整呈現, 可以用幾種方式

ex5:>>> 10/3.0
ex6:>>> 10.0 / 3
ex7:>>> 10.0 / 3.0

[次方的表示]
次方的表示方式如下,

ex8:>>> 2 ** 3
8

負數的表示如下
ex9:>>> -2 ** 3
-8

[長整數的計算]
python 對於需要處理龐大的計算數值,

在新的版本裡, 有很大的進步,

python會在字尾加一個大寫的L,

如以下的例子

ex10: >>>3456345673456734567834567 * 1234567654323456
4267092570610506612065846777669315703552L

[十六進位(hex)與八進位(oct)]

十六進位, 開頭為 0x
ex11: >>> 0xAA
170

八進位, 開頭為0
ex12: >>> 020
16

大致上, 各位讀者已經對python的計算功能有足夠的認識了...
接著, W會在下一個篇幅介紹python的宣告與如何寫一個可以跑的小程式!







python的關鍵字

W覺得關鍵字十分重要, 尤其是在初學一個高階語言的階段,

怎麼說呢?

1. 減少變數命名上的錯誤

2. 可以與其它語言比較彼此間的關鍵字的差異(如果python並非你第一次學寫程式的語言)

Here is a list of the Python keywords. Enter any keyword to get more help.

and elif if print
as else import raise
assert except in return
break exec is try
class finally lambda while
continue for not with
def from or yield
del global pass

各位讀者就把這些keywords, 先掃過一遍吧!
很快的各位就會用到嚕!

zhpy中文版的python

今天W在python 菜市場逛著逛著就發現了這個有趣的project,

周蟒!

它是一個中文版的python, 怎樣?

還蠻酷的吧?

不過, W還是沒有發現中文版的Python, 有沒有什麼大市場,

畢竟中文寫code, 非主流..

但是真的是個有趣的project

讀者可以去這個link 瞧瞧 http://code.google.com/p/zhpy/w/list

搞不好可以找到你所期待的東西喔!

Python 編譯器 Interpreter

Python 提供了一個即時編譯器, 使用者只要在terminal或command prompt (命令字提示元),
鍵入python,

如圖所示, 會開啟一個python的介面.

From pypyso拍拍手Python教學

在尚未熟悉python語法前, W將使用這個編譯器(interpreter), 來解釋一些簡單的python程式,
讀者也可以利用這個編譯器做練習.

基本上W也很常把它當做一個計算機, 做一些簡單的計算..


接著讓大家熟悉一下Python 編譯器, 讓我們看看有那些已經配置好的功能!?

From pypyso拍拍手Python教學

在python 的提示字元下 (>>>), 鍵入 help(),

接著你會看到下列的訊息,

1. 第一次使用的人, 可以到 http://www.python.org/doc/tut/ (英文)找到教學,
或在pypyso拍拍手Python教學部落格, W也會全力以赴的教會大家喔!

2. 使用者可以鍵入各種模組名稱(module name) , 關鍵字(keyword), 主題(Topic), 得到help utility的協助

3. 離開help utility, 只要鍵入quit即可

4. 鍵入 topics, 可以看到很多主題如下

5. 鍵入keywords, 然後會顯示如下, 以下的字在Python之中都有特殊的意義,
W會在往後的章節裡一一介紹.

6. 鍵入任何一種的模組名稱, 可以得到類似Linux man page的解釋,
讀者可以試著鍵入sys, 它會展示出 sys這個模組的解說, 以及相關的資訊.


W並未要求讀者使用這個部份來學習python, 只是讓讀者多一份參考,
老實說google大神, 可以更快更準的找到須要的模組...

希望各位可以動動小手, 玩玩這個介面, 因為我們準備要開使寫Python 囉~~










2011年2月14日 星期一

選擇一個好的編輯器 Eclipse with Pydev

其實,

在市面上有很多很好用的編輯器,

但是W決定只使用兩種編輯器在這個教學上,

這兩個W想各位應該可以猜得到,

就是 VI/VIM 跟 Eclipse! (不會大家都不用這兩個吧?)

[VI/Vim]

Vi是一個非常powerful的editor, 但是要玩到很熟,

簡單說, 沒有個三五個月是還蠻困難的...

所以就不在此詳加介紹, 不過有興趣的朋友可以在下面聯結,

找到一些資訊.

http://www.eng.hawaii.edu/Tutor/vi.html

http://fanqiang.chinaunix.net/a1/b4/20010518/145820_b.html



[Eclipse]

eclipse 就是一個非常專業的 editor,

幾乎你想得到的語言都被eclipse給吃了下來,

舉凡 Java, C++, PHP, Ruby, 還有很多其他有的沒的,

還有支援版本控制 (version control)的套件,

實在是沒有理由選擇其他的編輯器,對吧?

不過剛開始使用eclipse的朋友,就要好好K一下英文囉,

不然繁多的設定就可以搞得你暈頭轉向....


另外一個原因,

W會選擇eclipse,

也是因爲多數人已經在其他語言已經接觸過eclipse,

所以使用有熟悉感的editor, 有助學習Python囉~



[如何使用Python透過Eclipse?]

1. download eclipse from http://www.eclipse.org/downloads/

2. 選擇 Eclipse Classic 3.6.1, (其實其他的也可以試試看喔!)

3. 將壓縮包解在適當的位置 (W是放在 /home/pypyso)

4. 在開啟eclipse之前, 先確定Python是否已經安裝完成

5. 點兩下那顆不清不楚的月亮, 開起 eclipse

6. 當開啟eclipse之後, 在"主要控制列選項,選取 Help, 然後在install new software點兩下

7.選擇接受按下finish
From pypyso拍拍手Python教學
8.在主要控制列上, 選取Windows 然後下拉選單選擇preferences,
點一下小視窗內的Pydev, 接著選擇Python 2.5, 2.6, 2.7為你將使用的
編譯器(圖中為python 2.5), 最後按下apply 跟 ok 就大功告成囉!
9. eclipse的基本設定已經都完成了, 講了一大堆, 也該切入正題囉!

10. Let's start playing Python



有任何問題歡迎提問喔!

安裝 Python 2.7 or 2.6



關於:Python 是一個跨平台的語言, 當然可以在不同的作業系統上執行.

系統需求: Linux, Unix, Mac, and Windows

版本號:Python有不同的版本, 每種版本可能會有些許的不同, 但是在
此教學部落格上, 將會以python 2.7為主, 可能會有python 3.1的討論,
但是前提是要有空...(W可是很忙的, 但是對Python又很熱血)

安裝:在Linux跟Mac, 基本上Python是不用安裝的, 隨機附贈, 怎樣?夠讚吧!?
在Windows上, 也可以很簡單的找到python package安裝,
以下是連結:

依樣畫葫蘆:

驗證:
通常裝完就可以馬上使用了, 但是怎麼知道安裝成功呢?
請使用terminal, command prompt,
然後在提示字元後面打上簡單的六個字母
python

然後妳就可以看到以下的輸出:(W兄用的是Python 2.6.4)

Python 2.6.4 (r264:75821M, Oct 27 2009, 19:48:32)
[GCC 4.0.1 (Apple Inc. build 5493)] on darwin
Type "help", "copyright", "credits" or "license" for more information.



沒錯!就是這樣你已經安裝完成囉~
有問題請發問, 謝謝!


why python?

大概寫python也寫了三年多了,
原本以為是玩票性質的參與,
但是漸漸地發現Python的好,
也很想把Python用中文的方式,
介紹給用中文學習的朋友.

Python 的特殊之處:(或是好用之處)

1. object oriented programing language - 物件導向, 這應該不用在多加說明了吧?

2. the idea is quite similar to other program / script language - 結合了很多種語言的好處,
除了可以簡單的寫出script, 也可以類似 C++ / java的方式寫出程式.

3. tons of libraries to be used on Python - 早期Python並不能像Perl有CPAN的加持, 在很多情況之下需要花很大的工夫去寫需要的函式庫(library), 但是現在可是夯到不行! 隨便google一下,
都可以找到好多好用libraries.

4. easy to learn - 基本上, 只要是個程式設計師, 短短的幾個小時內, 應該就可以學會Python!
不過, 要寫到爐火純青, 嘿嘿~當然還是要一些時間囉!

5. easy to develop on different application - 這個應該shell script 或 Perl不可以比擬的吧?
Python 不管是要寫game, 寫iphone app, 寫GUI,寫雲端, 寫system, 寫Web, 都有相當豐富的資源,
試想一下, 有哪些語言可以快速的搞定各種不同需求?
Java可以嗎?
C可以嗎?


實在有太多理由可以說明Python有多好用, 多有前途! (老王也是要賣瓜的)
有鑒於此, W兄一定要好好的把Python用淺顯易懂的方式, 交給各位!

希望在未來, 會有更多更多的Python愛好者加入




W希望2011可以在這個blog貢獻超過100篇的Python教學文,
也希望各位可以不吝指教, 互相切戳求進步!


Go python!