《簡(jiǎn)明Python教程》這本書是初級(jí)的Python入門教材,初級(jí)內(nèi)容基本覆蓋,對(duì)高級(jí)內(nèi)容沒(méi)有做深入糾結(jié)。適合剛接觸Python的新手,行文比較簡(jiǎn)潔輕松,讀起來(lái)也比較順暢。
下面是我根據(jù)各個(gè)章節(jié)的內(nèi)容進(jìn)行的簡(jiǎn)要?dú)w納,相關(guān)代碼都已按照章節(jié)順序進(jìn)行命名。
基本介紹
- Python特點(diǎn):
簡(jiǎn)單、易學(xué)、免費(fèi)、開(kāi)源、可移植性好、面向?qū)ο?、可擴(kuò)展、豐富的庫(kù)等等。
如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開(kāi),你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們。C,C++為編譯型語(yǔ)言,變異后看不到源代碼。
- 編輯器的選擇:
強(qiáng)烈建議你學(xué)習(xí)使用VIM或Emacs,從長(zhǎng)遠(yuǎn)看來(lái)它們對(duì)你是極其有幫助的。 - 如何退出Python提示符:
如果你使用的是Linux/BSD shell,那么按Ctrl-d退出提示符。
如果是在Windows命令行中,則按Ctrl-z再按Enter。
基本概念
'#'符號(hào)右面的內(nèi)容都是注釋
特殊形式的注釋:
源文件的頭兩個(gè)字符是#!,后面跟著一個(gè)程序,告訴你的Linux/Unix系統(tǒng)執(zhí)行你的程序的時(shí)候,它應(yīng)該運(yùn)行哪個(gè)解釋器。-
可執(zhí)行的Python程序:
在linux下,chmod命令用來(lái)改變文件的模式 ,給系統(tǒng)中所有用戶這個(gè)源文件的執(zhí)行許可。然后直接通過(guò)指定源文件的位置來(lái)執(zhí)行程序。我們使用./來(lái)指示程序位于當(dāng)前目錄。$ chmod a+x helloworld.py $ ./helloworld.py Hello World
設(shè)置環(huán)境變量的作用:
能讓程序在各個(gè)位置運(yùn)行。運(yùn)行時(shí),系統(tǒng)會(huì)查找列在PATH環(huán)境變量中的各個(gè)目錄,然后運(yùn)行那個(gè)程序。-
顯示PATH變量
$ echo $PATH
獲取幫助
運(yùn)行help(str)——這會(huì)顯示str類的幫助。str類用于保存你的程序使用的各種文本(字符串),按q退出幫助。三引號(hào)
使用三引號(hào)('''或""")利用三引號(hào),你可以指示一個(gè)多行的字符串。你可以在三引號(hào)中自由的使用單引號(hào)和雙引號(hào)。-
特殊字符
\'來(lái)指示單引號(hào) \\來(lái)指示反斜杠 行末的單獨(dú) \ 表示字符串在下一行繼續(xù) 不需轉(zhuǎn)義: 字符串加上前綴r或R來(lái)指定
字符串是不可變對(duì)象
這意味著一旦你創(chuàng)造了一個(gè)字符串,你就不能再改變它了。-
標(biāo)識(shí)符的命名
標(biāo)識(shí)符的第一個(gè)字符必須是字母表中的字母(大寫或小寫)或者一個(gè)下劃線(‘_’)。 標(biāo)識(shí)符名稱的其他部分可以由字母(大寫或小寫)、下劃線(‘ _ ’)或數(shù)字組成。 標(biāo)識(shí)符名稱是對(duì)大小寫敏感的。例如,myname和myName不是一個(gè)標(biāo)識(shí)符。 有效 標(biāo)識(shí)符名稱的例子有i、__my_name、name_23和a1b2_c3。 無(wú)效 標(biāo)識(shí)符名稱的例子有2things、this is spaced out和my-name。
邏輯行與物理行
建議你堅(jiān)持在每個(gè)物理行只寫一句邏輯行。僅僅當(dāng)邏輯行太長(zhǎng)的時(shí)候,在多于一個(gè)物理行寫一個(gè)邏輯行。這些都是為了盡可能避免使用分號(hào),從而讓代碼更加易讀。如何縮進(jìn)
不要混合使用制表符和空格來(lái)縮進(jìn),因?yàn)檫@在跨越不同的平臺(tái)的時(shí)候,無(wú)法正常工作。我強(qiáng)烈建議你在每個(gè)縮進(jìn)層次使用單個(gè)制表符或兩個(gè)或四個(gè)空格。
運(yùn)算符和表達(dá)式
嚴(yán)格來(lái)說(shuō),邏輯操作符的操作數(shù)應(yīng)該為布爾表達(dá)式,但Python對(duì)此處理的比較靈活,即使操作數(shù)是數(shù)字,解釋器也把他們當(dāng)成“表達(dá)式”。
非0的數(shù)字的布爾值為1,0的布爾值是0??兆址疄榧?,非空字符串為真。非零的數(shù)為真。
and操作符:
只要左邊的表達(dá)式為真,整個(gè)表達(dá)式返回的值是右邊表達(dá)式的值。否則,返回左邊表達(dá)式的值。or操作符:
只要兩邊的表達(dá)式都為真,整個(gè)表達(dá)式的結(jié)果是左邊表達(dá)式的值;如果是一真一假,返回真值表達(dá)式的值。特別注意的是空值和0的情況,這時(shí)候返回的是右邊的0或空值.
Python中代表False的值有:
- 布爾型,F(xiàn)alse表示False,其他為True (false則不同)
- 整數(shù)和浮點(diǎn)數(shù),0表示False,其他為True
- 字符串和類字符串類型(包括bytes和unicode),空字符串表示False,其他為True(注:'0'字符串零并不是False)
- 序列類型(包括tuple,list,dict,set等),空表示False,非空表示True
- None永遠(yuǎn)表示False
>>> print '' or 5 or 0
5
>>> print 5 and 4
4
位運(yùn)算:
左移: 3<<1
0001(十進(jìn)制1)
<< 3(左移3位)
= 1000(十進(jìn)制8)
右移: 10>>2
1010(十進(jìn)制10)
>> 2(右移2位)
= 0010(十進(jìn)制2)
位與: 5&3
0101(十進(jìn)制5)
AND 0011(十進(jìn)制3)
= 0001(十進(jìn)制1)
位或: 5|3
0101(十進(jìn)制5)
OR 0011(十進(jìn)制3)
= 0111(十進(jìn)制7)
位異或: 2^10
0010(十進(jìn)制2)
XOR 1010 (十進(jìn)制10)
= 1000 (十進(jìn)制8)
運(yùn)算符優(yōu)先級(jí):
運(yùn)算符 描述
** 指數(shù) (最高優(yōu)先級(jí))
~ + - 按位翻轉(zhuǎn), 一元加號(hào)和減號(hào) (最后兩個(gè)的方法名為 +@ 和 -@)
* / % // 乘,除,取模和取整除
+ - 加法減法
>> << 右移,左移運(yùn)算符
& 位 'AND'
^ | 位運(yùn)算符
<= < > >= 比較運(yùn)算符
<> == != 等于運(yùn)算符
= %= /= //= -= += *= **= 賦值運(yùn)算符
is is not 身份運(yùn)算符
in not in 成員運(yùn)算符
not or and 邏輯運(yùn)算符
控制流
- 在Python中有三種控制流語(yǔ)句——if、for和while。
- break VS continue
break語(yǔ)句是用來(lái)終止循環(huán)語(yǔ)句的,即哪怕循環(huán)條件沒(méi)有稱為False或序列還沒(méi)有被完全遞歸,也停止執(zhí)行循環(huán)語(yǔ)句。
continue語(yǔ)句被用來(lái)告訴Python跳過(guò)當(dāng)前循環(huán)塊中的剩余語(yǔ)句,然后繼續(xù)進(jìn)行下一輪循環(huán)。
注:如果你從for或while循環(huán)中終止,任何對(duì)應(yīng)的循環(huán)else塊將不執(zhí)行。
函數(shù)
- 形參與實(shí)參
參數(shù)在函數(shù)定義的圓括號(hào)對(duì)內(nèi)指定,用逗號(hào)分割。當(dāng)我們調(diào)用函數(shù)的時(shí)候,我們以同樣的方式提供值。函數(shù)中的參數(shù)名稱為形參,提供給函數(shù)調(diào)用的值稱為實(shí)參。 - 局部變量
當(dāng)你在函數(shù)定義內(nèi)聲明變量的時(shí)候,它們與函數(shù)外具有相同名稱的其他變量沒(méi)有任何關(guān)系,即變量名稱對(duì)于函數(shù)來(lái)說(shuō)是局部的。所有變量的作用域是它們被定義的塊,從它們的名稱被定義的那點(diǎn)開(kāi)始。 - global語(yǔ)句
如果你想要為一個(gè)定義在函數(shù)外的變量賦值,那么你就得告訴Python這個(gè)變量名不是局部的,而是全局的,使用global語(yǔ)句完成這一功能。沒(méi)有g(shù)lobal語(yǔ)句,是不可能為定義在函數(shù)外的變量賦值的。 - 使用默認(rèn)參數(shù)值
只有在形參表末尾的那些參數(shù)可以有默認(rèn)參數(shù)值,即你不能在聲明函數(shù)形參的時(shí)候,先聲明有默認(rèn)值的形參而后聲明沒(méi)有默認(rèn)值的形參。
賦給形參的值是根據(jù)位置而賦值的。例如,def func(a, b=5)是有效的,但是def func(a=5, b)是無(wú)效的。 - 關(guān)鍵參數(shù)
如果你的某個(gè)函數(shù)有許多參數(shù),而你只想指定其中的一部分,那么你可以通過(guò)命名來(lái)為這些參數(shù)賦值——這被稱作關(guān)鍵參數(shù)——我們使用名字(關(guān)鍵字)而不是位置(我們前面所一直使用的方法)來(lái)給函數(shù)指定實(shí)參。如: func(c=50, a=100) - return語(yǔ)句
return語(yǔ)句用來(lái)從一個(gè)函數(shù)返回即跳出函數(shù),從函數(shù)返回一個(gè)值 。 - DocStrings
Python有一個(gè)很奇妙的特性,稱為文檔字符串,它通常被簡(jiǎn)稱為docstrings。它幫助你的程序文檔更加簡(jiǎn)單易懂,你應(yīng)該盡量使用它。
文檔字符串的慣例是一個(gè)多行字符串,它的首行以大寫字母開(kāi)始,句號(hào)結(jié)尾。第二行是空行,從第三行開(kāi)始是詳細(xì)的描述。
如果你已經(jīng)在Python中使用過(guò)help(),那么你已經(jīng)看到過(guò)DocStings的使用了!它所做的只是抓取函數(shù)的doc屬性,然后整潔地展示給你。
模塊
os.name字符串指示你正在使用的平臺(tái)。比如對(duì)于Windows,它是'nt',而對(duì)于Linux/Unix用戶,它是'posix'。
os.getcwd()函數(shù)得到當(dāng)前工作目錄,即當(dāng)前Python腳本工作的目錄路徑。
os.getenv()和os.putenv()函數(shù)分別用來(lái)讀取和設(shè)置環(huán)境變量。
os.listdir()返回指定目錄下的所有文件和目錄名。
os.remove()函數(shù)用來(lái)刪除一個(gè)文件。
os.system()函數(shù)用來(lái)運(yùn)行shell命令。
os.linesep字符串給出當(dāng)前平臺(tái)使用的行終止符。例如,Windows使用'\r\n',Linux使用'\n'而Mac使用'\r'。
-
os.path.split()函數(shù)返回一個(gè)路徑的目錄名和文件名。
>>> os.path.split('/home/swaroop/byte/code/poem.txt') ('/home/swaroop/byte/code', 'poem.txt')
os.path.isfile()
檢驗(yàn)給出的路徑是否是文件os.path.isdir()
檢驗(yàn)給出的路徑是否是目錄。os.path.exists()
檢驗(yàn)給出的路徑是否真地存在。from..import語(yǔ)句
如果你想要輸入所有sys模塊使用的名字,那么你可以使用from sys import *語(yǔ)句。(避免使用)模塊的name
每個(gè)模塊都有一個(gè)名稱,在模塊中可以通過(guò)語(yǔ)句來(lái)找出模塊的名稱。這在一個(gè)場(chǎng)合特別有用——就如前面所提到的,當(dāng)一個(gè)模塊被第一次輸入的時(shí)候,這個(gè)模塊的主塊將被運(yùn)行。dir()函數(shù)
你可以使用內(nèi)建的dir函數(shù)來(lái)列出模塊定義的標(biāo)識(shí)符。標(biāo)識(shí)符有函數(shù)、類和變量。當(dāng)你為dir()提供一個(gè)模塊名的時(shí)候,它返回模塊定義的名稱列表。如果不提供參數(shù),它返回當(dāng)前模塊中定義的名稱列表。del
這個(gè)語(yǔ)句在運(yùn)行后被用來(lái)刪除一個(gè)變量/名稱。在例子del a中,你將無(wú)法再使用變量a——它就好像從來(lái)沒(méi)有存在過(guò)一樣。
數(shù)據(jù)結(jié)構(gòu)
-
字符串
split函數(shù)的另外一個(gè)參數(shù)是規(guī)定作為分隔符的字符串。分隔符不顯示在列表中。>>> string.split(song, 'ai') ['The r', 'n in Sp', 'n...']
函數(shù)jion的功能和split正好相反,它是將列表連接成字符串。默認(rèn)的分
隔符是空格。>>> list = ['The', 'rain', 'in', 'Spain...'] >>> string.join(list) 'The rain in Spain...'
列表:
len(list)、list.append、list.sort、del list[0]元組:
元組和字符串一樣是不可變的,即你不能修改元組。元組通過(guò)圓括號(hào)中用逗號(hào)分割的項(xiàng)目定義。字典:
它們的鍵/值對(duì)用冒號(hào)分割,而各個(gè)對(duì)用逗號(hào)分割,所有這些都包括在花括號(hào)中。
賦值:d[key]= value
刪除:del d[key]
迭代出每一項(xiàng):for name,address in ab.items()序列:列表、元組、字符串都屬于序列。
序列的兩個(gè)特點(diǎn):索引操作符和切片操作符。引用:
當(dāng)你創(chuàng)建一個(gè)對(duì)象并給它賦一個(gè)變量的時(shí)候,這個(gè)變量?jī)H僅 引用 那個(gè)對(duì)象,而不是表示這個(gè)對(duì)象本身!字符串方法:
in操作符用來(lái)檢驗(yàn)一個(gè)給定字符串是否為另一個(gè)字符串的一部分。find方法:
用來(lái)找出給定字符串在另一個(gè)字符串中的位置,或者返回-1以表示找不到子字符串。append:
在列表的尾部追加元素,參數(shù)是插入元素的值。方法extend合并兩個(gè)列表為一個(gè)。
面向?qū)ο缶幊?/h1>
self:類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱,但是在調(diào)用這個(gè)方法的時(shí)候你不為這個(gè)參數(shù)賦值,Python會(huì)提供這個(gè)值。這個(gè)特別的變量指對(duì)象本身,按照慣例它的名稱是self。
init方法: init方法在類的一個(gè)對(duì)象被建立時(shí),馬上運(yùn)行。這個(gè)方法可以用來(lái)對(duì)你的對(duì)象做一些你希望的初始化 。
類與對(duì)象的方法:類的變量 由一個(gè)類的所有對(duì)象(實(shí)例)共享使用。對(duì)象的變量 由類的每個(gè)對(duì)象/實(shí)例擁有。
繼承:基本類的init方法專門使用self變量調(diào)用。
類與對(duì)象
類使用class關(guān)鍵字創(chuàng)建。類的域和方法被列在一個(gè)縮進(jìn)塊中。self
類的方法與普通的函數(shù)只有一個(gè)特別的區(qū)別——它們必須有一個(gè)額外的第一個(gè)參數(shù)名稱,但是在調(diào)用這個(gè)方法的時(shí)候你不為這個(gè)參數(shù)賦值,
Python會(huì)提供這個(gè)值。這個(gè)特別的變量指對(duì)象本身,按照慣例它的名稱是self。類的使用
我們使用class語(yǔ)句后跟類名,創(chuàng)建了一個(gè)新的類。這后面跟著一個(gè)縮進(jìn)的語(yǔ)句塊形成類體。
在這個(gè)例子中,我們使用了一個(gè)空白塊,它由pass語(yǔ)句表示。接下來(lái),我們使用類名后跟一對(duì)圓括號(hào)來(lái)創(chuàng)建一個(gè)對(duì)象/實(shí)例(實(shí)例化)。__init__
方法
__init__
方法在類的一個(gè)對(duì)象被建立時(shí),馬上運(yùn)行。這個(gè)方法可以用來(lái)對(duì)你的對(duì)象做一些你希望的初始化 。
注意,這個(gè)名稱的開(kāi)始和結(jié)尾都是雙下劃線。__del__
方法
__del__
它在對(duì)象消逝的時(shí)候被調(diào)用。對(duì)象消逝即對(duì)象不再被使用,它所占用的內(nèi)存將返回給系統(tǒng)作它用。
輸入輸出
模式可以為讀模式'r'、寫模式'w'或追加模式'a'。
使用file類的write方法來(lái)寫文件,最后我們用close關(guān)閉這個(gè)文件。
使用readline方法讀文件的每一行。
異常
處理異常
我們可以使用try..except語(yǔ)句來(lái)處理異常。我們把通常的語(yǔ)句放在try-塊中,而把我們的錯(cuò)誤處理語(yǔ)句放在except-塊中。引發(fā)異常
你可以使用raise語(yǔ)句 引發(fā) 異常。你還得指明錯(cuò)誤/異常的名稱和伴隨異常 觸發(fā)的 異常對(duì)象。
你可以引發(fā)的錯(cuò)誤或異常應(yīng)該分別是一個(gè)Error或Exception類的直接或間接導(dǎo)出類。try...finally
異常發(fā)生后有語(yǔ)句仍然執(zhí)行。
python標(biāo)準(zhǔn)庫(kù)
- sys模塊
sys模塊包含了與Python解釋器和它的環(huán)境有關(guān)的函數(shù)。
sys.argv變量是一個(gè)字符串的列表。特別地,sys.argv包含了命令行參數(shù) 的列表,即使用命令行傳遞給你的程序的參數(shù)。 如:sys.argv[0]、sys.argv[1]
.pyc文件: 字節(jié)編譯的文件 ,這些文件以.pyc作為擴(kuò)展名。
from..import語(yǔ)句: from sys import argv語(yǔ)句。
模塊的name:獲取模塊的名稱。main為當(dāng)前程序。
制造你自己的模塊:記住這個(gè)模塊應(yīng)該被放置在我們輸入它的程序的同一個(gè)目錄中,或者在sys.path所列目錄之一。
dir():內(nèi)建的dir函數(shù)來(lái)列出模塊定義的標(biāo)識(shí)符。標(biāo)識(shí)符有函數(shù)、類和變量。
更多python內(nèi)容
表生成式、單語(yǔ)句塊、lambda語(yǔ)句
exec語(yǔ)句用來(lái)執(zhí)行儲(chǔ)存在字符串或文件中的Python語(yǔ)句
>>> exec 'print "Hello World"
eval語(yǔ)句用來(lái)計(jì)算存儲(chǔ)在字符串中的有效Python表達(dá)式。
>>> eval('2*3')
assert語(yǔ)句用來(lái)聲明某個(gè)條件是真的。當(dāng)assert語(yǔ)句失敗的時(shí)候,會(huì)引發(fā)一個(gè)AssertionError。
- assert語(yǔ)句
assert語(yǔ)句用來(lái)聲明某個(gè)條件是真的。
例如,如果你非常確信某個(gè)你使用的列表中至少有一個(gè)元素,而你想要檢驗(yàn)這一點(diǎn),并且在它非真的時(shí)候引發(fā)一個(gè)錯(cuò)誤,那么assert語(yǔ)句是應(yīng)用在這種情形下的理想語(yǔ)句。當(dāng)assert語(yǔ)句失敗的時(shí)候,會(huì)引發(fā)一個(gè)AssertionError。
書中的代碼都整理在github上了.詳見(jiàn):https://github.com/Everfighting/A-Byte-of-Python.git