python學習筆記(一)
系統
1633 0
?
Python學習筆記(一)
?????
#
?_*_?coding:gb2312?_*_?:這樣制定程序的編碼;
建議如果使用中文,最好用utf
-
8
?(用utf
-
8的時候,),或者gb2312。
?????復數?
可以直接表示復數a?
=
?
1.5
?
+
?
0.5j
;?
a.real?:取得實部
a.imag?:取得虛部
abs(a):取得模
?????數據類型轉換
?????float(),int(),long()
?????我們用a
**
b?表示?a的b次方
?????開方依然是函數?sqrt(a)
?????最近一次表達式輸出,保存在?_??變量中
?????字符串可以通過幾種方式分行。可以在行加反斜杠做為繼續符,這表示下一行是當前行的邏輯沿續。
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
然而,如果我們創建一個“行”(
"
raw
"
)字符串,\?n序列就不會轉為換行,源碼中的反斜杠和換行符n都會做為字符串中的數據處理。如下所示:?
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
:?
會打印為:?
This?
is
?a?rather?long?string?containing\n\
several?lines?of?text?much?as?you?would?do?
in
?C.
另外,字符串可以用一對三重引號”””或
'''
來標識。三重引號中的字符串在行尾不需要換行標記,所有的格式都會包括在字符串中。?
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
聯想到HTML?中的pre標簽。
?????Python?已經有了幾個復合數據類型,用于組織其它的值。最通用的是鏈表,它寫為中括之間用逗號分隔的一列值(子項),鏈表的子項不一定是同一類型的值。?
>>>?a?=?['spam',?'eggs',?100,?1234]
?????內置函數len()也同樣可以用于鏈表:?
>>>?len(a)
?????if?語句
if?x?==?1:
?…
elif?x?==?0:
…
else:
??…
可能會有零到多個?elif?部分,else?是可選的。關鍵字“elif”?是“?else?if?”的縮寫,這個可以有效避免過深的縮進。if?
?elif?
?elif?
?序列用于替代其它語言中的?switch?或?case?語句。
注意是elif?不是elseif。容易混淆吧。還有其中的冒號別忘了。
?????for語句
for?x?in?a:
?????print?x,?len(x)
類似java或者js中遍歷對象的形式。記得加上冒號。
當然這和傳統意義上的for語句差別還是很大。
?????range()?函數
如果你需要一個數值序列,內置函數range()可能會很有用,它生成一個等差級數鏈表。?
>>>?range(10)
[0,?1,?2,?3,?4,?5,?6,?7,?8,?9]
range(10)?生成了一個包含10個值的鏈表,它準確的用鏈表的索引值填充了這個長度為10的列表,所生成的鏈表中不包括范圍中的結束值。也可以讓range操作從另一個數值開始,或者可以指定一個不同的步進值(甚至是負數,有時這也被稱為“步長”):?
>>>?range(5,?10)
[5,?6,?7,?8,?9]
>>>?range(0,?10,?3)
[0,?3,?6,?9]
>>>?range(-10,?-100,?-30)
[-10,?-40,?-70]
需要迭代鏈表索引的話,如下所示結合使?用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
在序列中循環時,索引位置和對應值可以使用enumerate()函數同時得到。?
for?i,?v?in?enumerate(['tic',?'tac',?'toe']):
?????print?i,?v
同時循環兩個或更多的序列,可以使用?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
關鍵字?def?引入了一個函數定義。在其后必須跟有函數名和包括形式參數的圓括號。函數體語句從下一行開始,必須是縮進的。函數體的第一行可以是一個字符串值,這個字符串是該函數的?(文檔字符串(documentation?string)),也可稱作?docstring?。
?????深入鏈表
append(?x)?
把一個元素添加到鏈表的結尾,相當于?a[len(a):]?=?[x]?
extend(?L)?
通過添加指定鏈表的所有元素來擴充鏈表,相當于?a[len(a):]?=?L。?
insert(?i,?x)?
在指定位置插入一個元素。第一個參數是準備插入到其前面的那個元素的索引,例如a.insert(0,?x)?會插入到整個鏈表之前,而a.insert(len(a),?x)?相當于?a.append(x)。?
remove(?x)?
刪除鏈表中值為x的第一個元素。如果沒有這樣的元素,就會返回一個錯誤。?
pop(?[i])?
從鏈表的指定位置刪除元素,并將其返回。如果沒有指定索引,a.pop()返回最后一個元素。元素隨即從鏈表中被刪除。(方法中i兩邊的方括號表示這個參數是可選的,而不是要求你輸入一對方括號,你會經常在Python?庫參考手冊中遇到這樣的標記。)?
index(?x)?
返回鏈表中第一個值為x的元素的索引。如果沒有匹配的元素就會返回一個錯誤。?
count(?x)?
返回x在鏈表中出現的次數。?
sort(?)?
對鏈表中的元素進行適當的排序。?
reverse(?)?
倒排鏈表中的元素。?
?????函數化編程工具
對于鏈表來講,有三個內置函數非常有用:filter(),?map(),?和?reduce()。?
"filter(function,?sequence)"返回一個序列(sequence),包括了給定序列中所有調用function(item)后返回值為true的元素。(如果可能的話,會返回相同的類型)。例如,以下程序可以計算部分素數:?
>>>?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)"?為每一個元素依次調用function(item)并將返回值組成一個鏈表返回。例如,以下程序計算立方:?
>>>?def?cube(x):?return?x*x*x
>>>?map(cube,?range(1,?11))
[1,?8,?27,?64,?125,?216,?343,?512,?729,?1000]
兩者區別:?map返回的是?函數結果序列。filter返回的是函數返回結果為true的參數。(相當于過濾)
可以傳入多個序列,函數也必須要有對應數量的參數,執行時會依次用各序列上對應的元素來調用函數(如果某些序列比其它的短,就用None來代替)。如果把None做為一個函數傳入,則直接返回參數做為替代。例如:?
>>>?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)"?返回一個單值,它是這樣構造的:首先以序列的前兩個元素調用函數,再以返回值和第三個參數調用,依次執行下去。例如,以下程序計算1到10的整數之和:?
>>>?def?add(x,y):?return?x+y
>>>?reduce(add,?range(1,?11))
55
實際上這里就是從1加到10。
可以傳入第三個參數做為初始值。如果序列是空的,就返回初始值,否則函數會先接收初始值和序列的第一個元素,然后是返回值和下一個元素,依此類推。例如:?
>>>?def?sum(seq):
?????def?add(x,y):?return?x+y
?????return?reduce(add,?seq,?0)
>>>?sum(range(1,?11))
55
>>>?sum([])
0
注意:?sum([])中的[]是不可以省略的。表示的是一個鏈表。
?????鏈表推導式?以后再看
?????del?
有一個方法可從鏈表中刪除指定索引的元素:del?語句。這個方法也可以從鏈表中刪除切片(之前我們是把一個空鏈表賦給切片)。例如:?
>>>?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?也可以用于刪除整個變量:?
>>>?del?a
?????Dictionaries?字典
一看這名字嚇了跳,結果和C++中的pair?或者java中的hashmap一個德性的事物。當然javascript用數組就行了。下面來看看python中字典的特點與具體應用。
字典的主要操作是依據關鍵字來存儲和析取值。也可以用?del來刪除關鍵字:值對。如果你用一個已經存在的關鍵字存儲值,以前為該關鍵字分配的值就會被遺忘。試圖析取從一個不存在的關鍵字中讀取值會導致錯誤。
字典的?keys()方法返回由所有關鍵字組成的鏈表,該鏈表的順序不定(如果你需要它有序,只能調用關鍵字鏈表的sort()?方法)。使用字典的?has_key()方法可以檢查字典中是否存在某一關鍵字。
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')
在字典中循環時,關鍵字和對應的值可以使用?iteritems()方法同時解讀出來。?
knights?=?{'gallahad':?'the?pure',?'robin':?'the?brave'}
for?k,?v?in?knights.iteritems():
print?k,?v
?????模塊
不用多說,C++中有?include?,java中?import?
?????dir()
內置函數?dir()?用于按模塊名搜索模塊定義,它返回一個字符串類型的存儲列表
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()?不會列出內置函數和變量名。如果你想列出這些內容,它們在標準模塊?__builtin__中定義:?
>>>?import?__builtin__
>>>?dir(__builtin__)
?????Packages
包通常是使用用“圓點模塊名”的結構化模塊命名空間。例如,名為?A.B?的模塊表示了名為?"B"?的包中名為?"A"?的子模塊。正如同用模塊來保存不同的模塊架構可以避免全局變量之間的相互沖突,使用圓點模塊名保存像?NumPy?或?Python?Imaging?Library?之類的不同類庫架構可以避免模塊之間的命名沖突。
需要注意的是使用?from?package?import?item?方式導入包時,這個子項(item)既可以是包中的一個子模塊(或一個子包),也可以是包中定義的其它命名,像函數、類或變量。import?語句首先核對是否包中有這個子項,如果沒有,它假定這是一個模塊,并嘗試加載它。如果沒有找到它,會引發一個?ImportError?異常。?
相反,使用類似import?item.subitem.subsubitem?這樣的語法時,這些子項必須是包,最后的子項可以是包或模塊,但不能是前面子項中定義的類、函數或變量。
python學習筆記(一)
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元