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, 先掃過一遍吧!
很快的各位就會用到嚕!