《簡(jiǎn)明Python教程》這本書是初級(jí)的Python入門教材船侧,初級(jí)內(nèi)容基本覆蓋,對(duì)高級(jí)內(nèi)容沒有做深入糾結(jié)厅各。適合剛接觸Python的新手镜撩,行文比較簡(jiǎn)潔輕松,讀起來也比較順暢队塘。
下面是我根據(jù)各個(gè)章節(jié)的內(nèi)容進(jìn)行的簡(jiǎn)要?dú)w納袁梗,相關(guān)代碼都已按照章節(jié)順序進(jìn)行命名。
基本介紹
- Python特點(diǎn):
簡(jiǎn)單憔古、易學(xué)雾袱、免費(fèi)蛙粘、開源、可移植性好、面向?qū)ο蠛乐薄⒖蓴U(kuò)展佛析、豐富的庫等等痹仙。
如果你需要你的一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開闷游,你可以把你的部分程序用C或C++編寫,然后在你的Python程序中使用它們烙样。C,C++為編譯型語言冯遂,變異后看不到源代碼。
- 編輯器的選擇:
強(qiáng)烈建議你學(xué)習(xí)使用VIM或Emacs,從長(zhǎng)遠(yuǎn)看來它們對(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命令用來改變文件的模式 ,給系統(tǒng)中所有用戶這個(gè)源文件的執(zhí)行許可炒俱。然后直接通過指定源文件的位置來執(zhí)行程序盐肃。我們使用./來指示程序位于當(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)驹闰。-
特殊字符
\'來指示單引號(hào) \\來指示反斜杠 行末的單獨(dú) \ 表示字符串在下一行繼續(xù) 不需轉(zhuǎn)義: 字符串加上前綴r或R來指定
字符串是不可變對(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珠洗。 無效 標(biāo)識(shí)符名稱的例子有2things、this is spaced out和my-name若专。
邏輯行與物理行
建議你堅(jiān)持在每個(gè)物理行只寫一句邏輯行许蓖。僅僅當(dāng)邏輯行太長(zhǎng)的時(shí)候,在多于一個(gè)物理行寫一個(gè)邏輯行调衰。這些都是為了盡可能避免使用分號(hào)膊爪,從而讓代碼更加易讀。如何縮進(jìn)
不要混合使用制表符和空格來縮進(jìn)嚎莉,因?yàn)檫@在跨越不同的平臺(tái)的時(shí)候米酬,無法正常工作。我強(qiáng)烈建議你在每個(gè)縮進(jìn)層次使用單個(gè)制表符或兩個(gè)或四個(gè)空格趋箩。
運(yùn)算符和表達(dá)式
嚴(yán)格來說赃额,邏輯操作符的操作數(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中有三種控制流語句——if拌屏、for和while。
- break VS continue
break語句是用來終止循環(huán)語句的术荤,即哪怕循環(huán)條件沒有稱為False或序列還沒有被完全遞歸倚喂,也停止執(zhí)行循環(huán)語句。
continue語句被用來告訴Python跳過當(dāng)前循環(huán)塊中的剩余語句喜每,然后繼續(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ù)外具有相同名稱的其他變量沒有任何關(guān)系喧兄,即變量名稱對(duì)于函數(shù)來說是局部的。所有變量的作用域是它們被定義的塊啊楚,從它們的名稱被定義的那點(diǎn)開始吠冤。 - global語句
如果你想要為一個(gè)定義在函數(shù)外的變量賦值,那么你就得告訴Python這個(gè)變量名不是局部的恭理,而是全局的,使用global語句完成這一功能拯辙。沒有g(shù)lobal語句,是不可能為定義在函數(shù)外的變量賦值的颜价。 - 使用默認(rèn)參數(shù)值
只有在形參表末尾的那些參數(shù)可以有默認(rèn)參數(shù)值涯保,即你不能在聲明函數(shù)形參的時(shí)候,先聲明有默認(rèn)值的形參而后聲明沒有默認(rèn)值的形參周伦。
賦給形參的值是根據(jù)位置而賦值的夕春。例如,def func(a, b=5)是有效的专挪,但是def func(a=5, b)是無效的及志。 - 關(guān)鍵參數(shù)
如果你的某個(gè)函數(shù)有許多參數(shù),而你只想指定其中的一部分寨腔,那么你可以通過命名來為這些參數(shù)賦值——這被稱作關(guān)鍵參數(shù)——我們使用名字(關(guān)鍵字)而不是位置(我們前面所一直使用的方法)來給函數(shù)指定實(shí)參速侈。如: func(c=50, a=100) - return語句
return語句用來從一個(gè)函數(shù)返回即跳出函數(shù),從函數(shù)返回一個(gè)值 。 - DocStrings
Python有一個(gè)很奇妙的特性迫卢,稱為文檔字符串,它通常被簡(jiǎn)稱為docstrings锌畸。它幫助你的程序文檔更加簡(jiǎn)單易懂,你應(yīng)該盡量使用它靖避。
文檔字符串的慣例是一個(gè)多行字符串,它的首行以大寫字母開始,句號(hào)結(jié)尾比默。第二行是空行幻捏,從第三行開始是詳細(xì)的描述。
如果你已經(jīng)在Python中使用過help()命咐,那么你已經(jīng)看到過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ù)分別用來讀取和設(shè)置環(huán)境變量帅涂。
os.listdir()返回指定目錄下的所有文件和目錄名。
os.remove()函數(shù)用來刪除一個(gè)文件尤蛮。
os.system()函數(shù)用來運(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語句
如果你想要輸入所有sys模塊使用的名字尿扯,那么你可以使用from sys import *語句求晶。(避免使用)模塊的name
每個(gè)模塊都有一個(gè)名稱,在模塊中可以通過語句來找出模塊的名稱衷笋。這在一個(gè)場(chǎng)合特別有用——就如前面所提到的芳杏,當(dāng)一個(gè)模塊被第一次輸入的時(shí)候,這個(gè)模塊的主塊將被運(yùn)行辟宗。dir()函數(shù)
你可以使用內(nèi)建的dir函數(shù)來列出模塊定義的標(biāo)識(shí)符爵赵。標(biāo)識(shí)符有函數(shù)、類和變量泊脐。當(dāng)你為dir()提供一個(gè)模塊名的時(shí)候空幻,它返回模塊定義的名稱列表。如果不提供參數(shù)容客,它返回當(dāng)前模塊中定義的名稱列表秕铛。del
這個(gè)語句在運(yùn)行后被用來刪除一個(gè)變量/名稱。在例子del a中缩挑,你將無法再使用變量a——它就好像從來沒有存在過一樣但两。
數(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]元組:
元組和字符串一樣是不可變的擅耽,即你不能修改元組活孩。元組通過圓括號(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操作符用來檢驗(yàn)一個(gè)給定字符串是否為另一個(gè)字符串的一部分缭保。find方法:
用來找出給定字符串在另一個(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è)方法可以用來對(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語句后跟類名啤月,創(chuàng)建了一個(gè)新的類。這后面跟著一個(gè)縮進(jìn)的語句塊形成類體劳跃。
在這個(gè)例子中谎仲,我們使用了一個(gè)空白塊,它由pass語句表示刨仑。接下來郑诺,我們使用類名后跟一對(duì)圓括號(hào)來創(chuàng)建一個(gè)對(duì)象/實(shí)例(實(shí)例化)。__init__
方法
__init__
方法在類的一個(gè)對(duì)象被建立時(shí)杉武,馬上運(yùn)行辙诞。這個(gè)方法可以用來對(duì)你的對(duì)象做一些你希望的初始化 。
注意轻抱,這個(gè)名稱的開始和結(jié)尾都是雙下劃線飞涂。__del__
方法
__del__
它在對(duì)象消逝的時(shí)候被調(diào)用。對(duì)象消逝即對(duì)象不再被使用祈搜,它所占用的內(nèi)存將返回給系統(tǒng)作它用较店。
輸入輸出
模式可以為讀模式'r'、寫模式'w'或追加模式'a'容燕。
使用file類的write方法來寫文件梁呈,最后我們用close關(guān)閉這個(gè)文件。
使用readline方法讀文件的每一行蘸秘。
異常
處理異常
我們可以使用try..except語句來處理異常官卡。我們把通常的語句放在try-塊中,而把我們的錯(cuò)誤處理語句放在except-塊中秘血。引發(fā)異常
你可以使用raise語句 引發(fā) 異常味抖。你還得指明錯(cuò)誤/異常的名稱和伴隨異常 觸發(fā)的 異常對(duì)象。
你可以引發(fā)的錯(cuò)誤或異常應(yīng)該分別是一個(gè)Error或Exception類的直接或間接導(dǎo)出類灰粮。try...finally
異常發(fā)生后有語句仍然執(zhí)行仔涩。
python標(biāo)準(zhǔn)庫
- 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語句: from sys import argv語句适秩。
模塊的name:獲取模塊的名稱。main為當(dāng)前程序。
制造你自己的模塊:記住這個(gè)模塊應(yīng)該被放置在我們輸入它的程序的同一個(gè)目錄中秽荞,或者在sys.path所列目錄之一骤公。
dir():內(nèi)建的dir函數(shù)來列出模塊定義的標(biāo)識(shí)符。標(biāo)識(shí)符有函數(shù)扬跋、類和變量阶捆。
更多python內(nèi)容
表生成式、單語句塊钦听、lambda語句
exec語句用來執(zhí)行儲(chǔ)存在字符串或文件中的Python語句
>>> exec 'print "Hello World"
eval語句用來計(jì)算存儲(chǔ)在字符串中的有效Python表達(dá)式洒试。
>>> eval('2*3')
assert語句用來聲明某個(gè)條件是真的。當(dāng)assert語句失敗的時(shí)候朴上,會(huì)引發(fā)一個(gè)AssertionError垒棋。
- assert語句
assert語句用來聲明某個(gè)條件是真的。
例如余指,如果你非常確信某個(gè)你使用的列表中至少有一個(gè)元素捕犬,而你想要檢驗(yàn)這一點(diǎn),并且在它非真的時(shí)候引發(fā)一個(gè)錯(cuò)誤酵镜,那么assert語句是應(yīng)用在這種情形下的理想語句碉碉。當(dāng)assert語句失敗的時(shí)候,會(huì)引發(fā)一個(gè)AssertionError淮韭。
書中的代碼都整理在github上了.詳見:https://github.com/Everfighting/A-Byte-of-Python.git