?
Python學(xué)習(xí)筆記(一)

?????
#
?_*_?coding:gb2312?_*_?:這樣制定程序的編碼;
建議如果使用中文,最好用utf
-
8
?(用utf
-
8的時(shí)候,),或者gb2312。
?????復(fù)數(shù)?
可以直接表示復(fù)數(shù)a?
=
?
1.5
?
+
?
0.5j
;?
a.real?:取得實(shí)部
a.imag?:取得虛部
abs(a):取得模
?????數(shù)據(jù)類型轉(zhuǎn)換
?????float(),int(),long()
?????我們用a
**
b?表示?a的b次方
?????開方依然是函數(shù)?sqrt(a)
?????最近一次表達(dá)式輸出,保存在?_??變量中
?????字符串可以通過幾種方式分行。可以在行加反斜杠做為繼續(xù)符,這表示下一行是當(dāng)前行的邏輯沿續(xù)。
eg:
hello?
=
?
"
This?is?a?rather?long?string?containing\n\
several?lines?of?text?just?as?you?would?do?
in
?C.\n\
????Note?that?whitespace?at?the?beginning?of?the?line?
is
\
?significant.
"
print
?hello
然而,如果我們創(chuàng)建一個(gè)“行”(
"
raw
"
)字符串,\?n序列就不會(huì)轉(zhuǎn)為換行,源碼中的反斜杠和換行符n都會(huì)做為字符串中的數(shù)據(jù)處理。如下所示:?
hello?
=
?r
"
This?is?a?rather?long?string?containing\n\
several?lines?of?text?much?as?you?would?do?
in
?C.
"
print
?hello
would?
print
:?
會(huì)打印為:?
This?
is
?a?rather?long?string?containing\n\
several?lines?of?text?much?as?you?would?do?
in
?C.
另外,字符串可以用一對三重引號(hào)”””或
'''
來標(biāo)識(shí)。三重引號(hào)中的字符串在行尾不需要換行標(biāo)記,所有的格式都會(huì)包括在字符串中。?
print?"""
Usage:?thingy?[OPTIONS]
?????-h????????????????????????Display?this?usage?message
?????-H?hostname???????????????Hostname?to?connect?to
"""
produces?the?following?output:?
生成以下輸出:?Usage:?thingy?[OPTIONS]
?????-h????????????????????????Display?this?usage?message
?????-H?hostname???????????????Hostname?to?connect?to
聯(lián)想到HTML?中的pre標(biāo)簽。
?????Python?已經(jīng)有了幾個(gè)復(fù)合數(shù)據(jù)類型,用于組織其它的值。最通用的是鏈表,它寫為中括之間用逗號(hào)分隔的一列值(子項(xiàng)),鏈表的子項(xiàng)不一定是同一類型的值。?
>>>?a?=?['spam',?'eggs',?100,?1234]
?????內(nèi)置函數(shù)len()也同樣可以用于鏈表:?
>>>?len(a)
?????if?語句
if?x?==?1:
?…
elif?x?==?0:
…
else:
??…

可能會(huì)有零到多個(gè)?elif?部分,else?是可選的。關(guān)鍵字“elif”?是“?else?if?”的縮寫,這個(gè)可以有效避免過深的縮進(jìn)。if?
?elif?
?elif?
?序列用于替代其它語言中的?switch?或?case?語句。
注意是elif?不是elseif。容易混淆吧。還有其中的冒號(hào)別忘了。
?????for語句
for?x?in?a:

?????print?x,?len(x)
類似java或者js中遍歷對象的形式。記得加上冒號(hào)。
當(dāng)然這和傳統(tǒng)意義上的for語句差別還是很大。
?????range()?函數(shù)
如果你需要一個(gè)數(shù)值序列,內(nèi)置函數(shù)range()可能會(huì)很有用,它生成一個(gè)等差級(jí)數(shù)鏈表。?
>>>?range(10)
[0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
range(10)?生成了一個(gè)包含10個(gè)值的鏈表,它準(zhǔn)確的用鏈表的索引值填充了這個(gè)長度為10的列表,所生成的鏈表中不包括范圍中的結(jié)束值。也可以讓range操作從另一個(gè)數(shù)值開始,或者可以指定一個(gè)不同的步進(jìn)值(甚至是負(fù)數(shù),有時(shí)這也被稱為“步長”):?
>>>?range(5,?10)
[5,?6,?7,?8,?9]
>>>?range(0,?10,?3)
[0,?3,?6,?9]
>>>?range(-10,?-100,?-30)
[-10,?-40,?-70]
需要迭代鏈表索引的話,如下所示結(jié)合使?用range()?和?len()?:?
>>>?a?=?['Mary',?'had',?'a',?'little',?'lamb']
>>>?for?i?in?range(len(a)):

?????print?i,?a[i]


0?Mary
1?had
2?a
3?little
4?lamb
在序列中循環(huán)時(shí),索引位置和對應(yīng)值可以使用enumerate()函數(shù)同時(shí)得到。?
for?i,?v?in?enumerate(['tic',?'tac',?'toe']):

?????print?i,?v

同時(shí)循環(huán)兩個(gè)或更多的序列,可以使用?zip()?整體解讀。?
>>>?questions?=?['name',?'quest',?'favorite?color']
>>>?answers?=?['lancelot',?'the?holy?grail',?'blue']
>>>?for?q,?a?in?zip(questions,?answers):

?????print?'What?is?your?%s???It?is?%s.'?%?(q,?a)


What?is?your?name???It?is?lancelot.
What?is?your?quest???It?is?the?holy?grail.
What?is?your?favorite?color???It?is?blue.

?????pass?語句
pass?語句什么也不做。它用于那些語法上必須要有什么語句,但程序什么也不做的場合,例如:?
>>>?while?True:

???????pass?
?????def?
def?fib(n):????#?write?Fibonacci?series?up?to?n

?????"""Print?a?Fibonacci?series?up?to?n."""

?????a,?b?=?0,?1

?????while?b?<?n:

?????????print?b,

?????????a,?b?=?b,?a+b


>>>?#?Now?call?the?function?we?just?defined:

?fib(2000)
1?1?2?3?5?8?13?21?34?55?89?144?233?377?610?987?1597
關(guān)鍵字?def?引入了一個(gè)函數(shù)定義。在其后必須跟有函數(shù)名和包括形式參數(shù)的圓括號(hào)。函數(shù)體語句從下一行開始,必須是縮進(jìn)的。函數(shù)體的第一行可以是一個(gè)字符串值,這個(gè)字符串是該函數(shù)的?(文檔字符串(documentation?string)),也可稱作?docstring?。
?????深入鏈表
append(?x)?
把一個(gè)元素添加到鏈表的結(jié)尾,相當(dāng)于?a[len(a):]?=?[x]?
extend(?L)?
通過添加指定鏈表的所有元素來擴(kuò)充鏈表,相當(dāng)于?a[len(a):]?=?L。?
insert(?i,?x)?
在指定位置插入一個(gè)元素。第一個(gè)參數(shù)是準(zhǔn)備插入到其前面的那個(gè)元素的索引,例如a.insert(0,?x)?會(huì)插入到整個(gè)鏈表之前,而a.insert(len(a),?x)?相當(dāng)于?a.append(x)。?
remove(?x)?
刪除鏈表中值為x的第一個(gè)元素。如果沒有這樣的元素,就會(huì)返回一個(gè)錯(cuò)誤。?
pop(?[i])?
從鏈表的指定位置刪除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個(gè)元素。元素隨即從鏈表中被刪除。(方法中i兩邊的方括號(hào)表示這個(gè)參數(shù)是可選的,而不是要求你輸入一對方括號(hào),你會(huì)經(jīng)常在Python?庫參考手冊中遇到這樣的標(biāo)記。)?
index(?x)?
返回鏈表中第一個(gè)值為x的元素的索引。如果沒有匹配的元素就會(huì)返回一個(gè)錯(cuò)誤。?
count(?x)?
返回x在鏈表中出現(xiàn)的次數(shù)。?
sort(?)?
對鏈表中的元素進(jìn)行適當(dāng)?shù)呐判颉?
reverse(?)?
倒排鏈表中的元素。?
?????函數(shù)化編程工具
對于鏈表來講,有三個(gè)內(nèi)置函數(shù)非常有用:filter(),?map(),?和?reduce()。?
"filter(function,?sequence)"返回一個(gè)序列(sequence),包括了給定序列中所有調(diào)用function(item)后返回值為true的元素。(如果可能的話,會(huì)返回相同的類型)。例如,以下程序可以計(jì)算部分素?cái)?shù):?
>>>?def?f(x):?return?x?%?2?!=?0?and?x?%?3?!=?0


>>>?filter(f,?range(2,?25))
[5,?7,?11,?13,?17,?19,?23]
"map(function,?sequence)"?為每一個(gè)元素依次調(diào)用function(item)并將返回值組成一個(gè)鏈表返回。例如,以下程序計(jì)算立方:?
>>>?def?cube(x):?return?x*x*x


>>>?map(cube,?range(1,?11))
[1,?8,?27,?64,?125,?216,?343,?512,?729,?1000]

兩者區(qū)別:?map返回的是?函數(shù)結(jié)果序列。filter返回的是函數(shù)返回結(jié)果為true的參數(shù)。(相當(dāng)于過濾)
可以傳入多個(gè)序列,函數(shù)也必須要有對應(yīng)數(shù)量的參數(shù),執(zhí)行時(shí)會(huì)依次用各序列上對應(yīng)的元素來調(diào)用函數(shù)(如果某些序列比其它的短,就用None來代替)。如果把None做為一個(gè)函數(shù)傳入,則直接返回參數(shù)做為替代。例如:?
>>>?seq?=?range(8)
>>>?def?add(x,?y):?return?x+y


>>>?map(add,?seq,?seq)
[0,?2,?4,?6,?8,?10,?12,?14]
"reduce(func,?sequence)"?返回一個(gè)單值,它是這樣構(gòu)造的:首先以序列的前兩個(gè)元素調(diào)用函數(shù),再以返回值和第三個(gè)參數(shù)調(diào)用,依次執(zhí)行下去。例如,以下程序計(jì)算1到10的整數(shù)之和:?
>>>?def?add(x,y):?return?x+y


>>>?reduce(add,?range(1,?11))
55

實(shí)際上這里就是從1加到10。
可以傳入第三個(gè)參數(shù)做為初始值。如果序列是空的,就返回初始值,否則函數(shù)會(huì)先接收初始值和序列的第一個(gè)元素,然后是返回值和下一個(gè)元素,依此類推。例如:?
>>>?def?sum(seq):

?????def?add(x,y):?return?x+y

?????return?reduce(add,?seq,?0)


>>>?sum(range(1,?11))
55
>>>?sum([])
0
注意:?sum([])中的[]是不可以省略的。表示的是一個(gè)鏈表。
?????鏈表推導(dǎo)式?以后再看
?????del?
有一個(gè)方法可從鏈表中刪除指定索引的元素:del?語句。這個(gè)方法也可以從鏈表中刪除切片(之前我們是把一個(gè)空鏈表賦給切片)。例如:?
>>>?a?=?[-1,?1,?66.6,?333,?333,?1234.5]
>>>?del?a[0]
>>>?a
[1,?66.6,?333,?333,?1234.5]
>>>?del?a[2:4]
>>>?a
[1,?66.6,?1234.5]
del?can?also?be?used?to?delete?entire?variables:?
del?也可以用于刪除整個(gè)變量:?
>>>?del?a
?????Dictionaries?字典
一看這名字嚇了跳,結(jié)果和C++中的pair?或者java中的hashmap一個(gè)德性的事物。當(dāng)然javascript用數(shù)組就行了。下面來看看python中字典的特點(diǎn)與具體應(yīng)用。
字典的主要操作是依據(jù)關(guān)鍵字來存儲(chǔ)和析取值。也可以用?del來刪除關(guān)鍵字:值對。如果你用一個(gè)已經(jīng)存在的關(guān)鍵字存儲(chǔ)值,以前為該關(guān)鍵字分配的值就會(huì)被遺忘。試圖析取從一個(gè)不存在的關(guān)鍵字中讀取值會(huì)導(dǎo)致錯(cuò)誤。

字典的?keys()方法返回由所有關(guān)鍵字組成的鏈表,該鏈表的順序不定(如果你需要它有序,只能調(diào)用關(guān)鍵字鏈表的sort()?方法)。使用字典的?has_key()方法可以檢查字典中是否存在某一關(guān)鍵字。
eg:
tel?=?{'jack':?4098,?'sape':?4139}
tel['guido']?=?4127
print?tel
print?tel['jack']
del?tel['sape']
tel['irv']?=?4127
print?tel
print?tel.keys()
print?tel.has_key('guido')

在字典中循環(huán)時(shí),關(guān)鍵字和對應(yīng)的值可以使用?iteritems()方法同時(shí)解讀出來。?
knights?=?{'gallahad':?'the?pure',?'robin':?'the?brave'}
for?k,?v?in?knights.iteritems():
print?k,?v
?????模塊
不用多說,C++中有?include?,java中?import?
?????dir()
內(nèi)置函數(shù)?dir()?用于按模塊名搜索模塊定義,它返回一個(gè)字符串類型的存儲(chǔ)列表
import?sys

print?dir(sys)
?['__displayhook__',?'__doc__',?'__excepthook__',?'__name__',?'__stderr__',?'__stdin__',?'__stdout__',?'_current_frames',?'_getframe',?'api_version',?'argv',?'builtin_module_names',?'byteorder',?'call_tracing',?'callstats',?'copyright',?'displayhook',?'dllhandle',?'exc_clear',?'exc_info',?'exc_type',?'excepthook',?'exec_prefix',?'executable',?'exit',?'exitfunc',?'getcheckinterval',?'getdefaultencoding',?'getfilesystemencoding',?'getrecursionlimit',?'getrefcount',?'getwindowsversion',?'hexversion',?'maxint',?'maxunicode',?'meta_path',?'modules',?'path',?'path_hooks',?'path_importer_cache',?'platform',?'prefix',?'setcheckinterval',?'setprofile',?'setrecursionlimit',?'settrace',?'stderr',?'stdin',?'stdout',?'subversion',?'version',?'version_info',?'warnoptions',?'winver']
dir()?不會(huì)列出內(nèi)置函數(shù)和變量名。如果你想列出這些內(nèi)容,它們在標(biāo)準(zhǔn)模塊?__builtin__中定義:?
>>>?import?__builtin__
>>>?dir(__builtin__)

?????Packages

包通常是使用用“圓點(diǎn)模塊名”的結(jié)構(gòu)化模塊命名空間。例如,名為?A.B?的模塊表示了名為?"B"?的包中名為?"A"?的子模塊。正如同用模塊來保存不同的模塊架構(gòu)可以避免全局變量之間的相互沖突,使用圓點(diǎn)模塊名保存像?NumPy?或?Python?Imaging?Library?之類的不同類庫架構(gòu)可以避免模塊之間的命名沖突。
需要注意的是使用?from?package?import?item?方式導(dǎo)入包時(shí),這個(gè)子項(xiàng)(item)既可以是包中的一個(gè)子模塊(或一個(gè)子包),也可以是包中定義的其它命名,像函數(shù)、類或變量。import?語句首先核對是否包中有這個(gè)子項(xiàng),如果沒有,它假定這是一個(gè)模塊,并嘗試加載它。如果沒有找到它,會(huì)引發(fā)一個(gè)?ImportError?異常。?
相反,使用類似import?item.subitem.subsubitem?這樣的語法時(shí),這些子項(xiàng)必須是包,最后的子項(xiàng)可以是包或模塊,但不能是前面子項(xiàng)中定義的類、函數(shù)或變量。
posted on 2008-04-10 09:34
-274°C 閱讀(1033)
評(píng)論(0) 編輯 收藏 所屬分類:
python