精通Python自動(dòng)化腳本-運(yùn)維人員寶典完整目錄:
第一章 Python腳本概述
第二章 Python腳本調(diào)試和性能測(cè)試
第三章 單元測(cè)試-單元測(cè)試框架的介紹
第四章 自動(dòng)化常規(guī)運(yùn)維活動(dòng)
第五章 文件、目錄和數(shù)據(jù)處理
第六章 文件存檔、加密和解密
第七章 文本處理和正則表達(dá)式
第八章 文檔和報(bào)告
第九章 操作各類文件
第十章 網(wǎng)絡(luò)基礎(chǔ) - Socket編程
第十一章 使用Python腳本處理郵件
第十二章 使用Telnet和SSH遠(yuǎn)程監(jiān)控主機(jī)
第十三章 創(chuàng)建圖形化用戶界面
第十四章 處理Apache和其它的日志文件
第十五章 SOAP和REST API通訊
第十六章 網(wǎng)絡(luò)抓取 - 從網(wǎng)站上提取有用的信息
第十七章 數(shù)據(jù)收集及報(bào)表
第十八章 MySQL和SQLite數(shù)據(jù)庫(kù)管理
技術(shù)要求
在學(xué)習(xí)本書(shū)前肌蜻,你應(yīng)該了解一些 Python 編程的基礎(chǔ)知識(shí)麸折,比如基礎(chǔ)語(yǔ)法、變量類型、元組數(shù)據(jù)類型、列表字典、函數(shù)形庭、字符串和方法。在python.org/downloads/上有3.7.2和2.7.15兩個(gè)版本可供下載厌漂。本書(shū)中我們將使用3.7這一版本來(lái)作為代表示例和包的安裝萨醒。
譯者注:預(yù)計(jì) Python 3.7還會(huì)發(fā)展較長(zhǎng)時(shí)間,而 Python2則長(zhǎng)期止步于 Python2.7了苇倡,但小版本號(hào)都在不斷變化
本章的示例和源代碼可通過(guò) GitHub 倉(cāng)庫(kù)進(jìn)行獲取富纸。
為什么選擇Python囤踩?
Python有非常豐富的開(kāi)源庫(kù)用于數(shù)據(jù)分析工具、網(wǎng)站框架晓褪、測(cè)試等等堵漱。Python是一種可在不同平臺(tái)上使用的編程語(yǔ)言(Windows, Mac, Linux和Linux嵌入式硬件,如樹(shù)莓派Raspberry Pi)涣仿。它也用于開(kāi)發(fā)桌面應(yīng)用和網(wǎng)頁(yè)應(yīng)用勤庐。
開(kāi)發(fā)人員如果使用Python可以編寫更少行數(shù)的代碼。原型制作非澈酶郏快速愉镰,因?yàn)樵诮忉屍飨到y(tǒng)中運(yùn)行。Python可被看成是面向?qū)ο缶凇⒚嫦蜻^(guò)程或函數(shù)式編程丈探。
Python可以完成各種任務(wù),比如創(chuàng)建網(wǎng)頁(yè)應(yīng)用崭孤。它和軟件一起使用來(lái)創(chuàng)建工作流,它連接數(shù)據(jù)庫(kù)系統(tǒng)糊肠、處理文件辨宠、處理大數(shù)據(jù)并執(zhí)行復(fù)雜數(shù)學(xué)運(yùn)算。
Python語(yǔ)法與其它編程語(yǔ)言的對(duì)比
Python編寫的代碼可讀性很強(qiáng)货裹,因?yàn)樗陀⒄Z(yǔ)本身非常相近嗤形。要完成一個(gè)命令,Python使用新的一行來(lái)完成弧圆。
Python有一個(gè)很棒的特性:縮進(jìn)赋兵。使用縮進(jìn)我們可以定義決策語(yǔ)句作用域,for循環(huán)和while循環(huán)搔预、函數(shù)和類霹期。
Python安裝
這一部分中我們將學(xué)習(xí)在不同平臺(tái)上Python的安裝,比如Linux和Windows拯田。
Linux平臺(tái)上的安裝
大部分Linux發(fā)行版本都默認(rèn)安裝了Python 2历造。有些則直接包含了Python 3。
譯者注:目前大部分 CentOS 中默認(rèn)安裝的是 Python 2船庇,而 Ubuntu 中則內(nèi)置了 Python 3
要在Debian系Linux系統(tǒng)中安裝Python 3吭产,在命令行終端中可運(yùn)行如下命令:
sudo apt install python3
要在CentOS 系統(tǒng)中安裝Python 3,在命令行終端中可運(yùn)行如下命令:
sudo yum install python3
如無(wú)法使用以上命令安裝Python鸭轮,請(qǐng)從官方網(wǎng)站上下載Python并按照指示進(jìn)行安裝臣淤。
譯者注:本博客有一篇如何安裝Python3.7也可供參考
Windows平臺(tái)上的安裝
在Microsoft Windows上安裝Python,我們需要從python.org上下載可執(zhí)行安裝包并執(zhí)行安裝窃爷。從官網(wǎng)下載頁(yè)面下載python.exe文件并選擇想要在電腦了安裝的Python版本邑蒋。然后雙擊所下載的 exe 文件來(lái)安裝Python姓蜂。有安裝引導(dǎo)頁(yè)面中,有一個(gè)Add Python to the path的復(fù)選框寺董,勾選并按照提示一步一步的安裝Python 3覆糟。
Pip安裝以及使用pip安裝Python包
在 Linux 中安裝pip命令如下:
sudo apt install python-pip # 安裝 Python 2的 pip
sudo apt install python3-pip # 安裝 Python 3的 pip
譯者注:以上為 Ubuntu 中的命令,原書(shū)作者使用的均為 Ubuntu遮咖,CentOS 中將 apt 修改為 yum 即可
Windows中, 使用如下命令安裝:
python -m pip install pip
Mac上的安裝
要安裝 Python 3滩字,我們要在系統(tǒng)中安裝brew。運(yùn)行如下命令來(lái)在系統(tǒng)中安裝brew:
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
通過(guò)運(yùn)行以上命令御吞,brew就安裝好了÷蠊浚現(xiàn)在使用brew來(lái)安裝 Python 3:
brew install python3
安裝Jupyter notebook
要安裝Jupyter Notebook,先下載Anaconda陶珠。
安裝所下載的Anaconda版本挟裂,按照向?qū)е械闹甘具M(jìn)行安裝即可。
使用pip安裝Jupyter:
pip install jupyter
在 Linux 中揍诽,pip install jupyter安裝的是Python 2 的Jupyter诀蓉。如果想要安裝Python 3 的Jupyter,運(yùn)行如下命令:
pip3 install jupyter
安裝和使用虛擬環(huán)境
下面我們就來(lái)看如何安裝虛擬環(huán)境以及如何進(jìn)行激活暑脆。
在Linux中安裝虛擬環(huán)境渠啤,執(zhí)行步驟如下:
1、首先檢查是否安裝了pip添吗。我們來(lái)安裝Python 3的pip
sudo apt install python3-pip
2沥曹、使用pip3安裝虛擬環(huán)境:
sudo pip3 install virtualenv
3、現(xiàn)在我們來(lái)創(chuàng)建虛擬環(huán)境碟联。你可以選擇任意名稱妓美,這里我們使用pythonenv:
virtualenv pythonenv
4、激活虛擬環(huán)境:
source pythonenv/bin/activate
5鲤孵、在完成操作之后壶栋,還可通過(guò)以下命令來(lái)關(guān)閉virtualenv:
deactivate
在Windows中, 運(yùn)行pip install virtualenv命令來(lái)安裝虛擬環(huán)境普监。virtualenv的安裝步驟與Linux相同委刘。
譯者注:在安裝了virtualenv之后,還可安裝 Virtualenv Wrapper來(lái)更方便管理虛擬環(huán)境鹰椒,關(guān)于環(huán)境搭建還可參見(jiàn)本博客Django環(huán)境搭建及開(kāi)發(fā)
安裝Installing Geany和PyCharm
通過(guò)https://www.geany.org/download/releases下載Geany并下載所需的二進(jìn)行文件锡移。根據(jù)指示來(lái)進(jìn)行安裝。
通過(guò)https://www.jetbrains.com/pycharm/download/下載PyCharm并根據(jù)指示來(lái)進(jìn)行安裝漆际。
Python 解釋器
Python是一種解釋性語(yǔ)言淆珊。有一個(gè)稱為Python解釋器或Python shell的交互式終端。這個(gè)shell可供我們無(wú)需創(chuàng)建腳本來(lái)逐行執(zhí)行程序奸汇。
我們可以在這個(gè)Python交互式終端中訪問(wèn)Python的內(nèi)置函數(shù)和庫(kù)施符、安裝模塊和命令執(zhí)行歷史娶靡。這個(gè)終端為我們提供了研究Python的機(jī)會(huì)璧微。你可以將準(zhǔn)備好的代碼拷貝到腳本中奈应。
Python和Bash腳本的區(qū)別
這一部分中痒留,我們將學(xué)習(xí)Python和Bash腳本的區(qū)別。它們的區(qū)別如下:
- Python是一種腳本語(yǔ)言听哭,而B(niǎo)ash是一種用于進(jìn)入和執(zhí)行命令的shell
- 使用Python更易于處理更大的程序
- Python中大部的事通過(guò)導(dǎo)入模塊來(lái)使用一行代碼調(diào)用函數(shù)
開(kāi)啟交互終端
我們可以在已安裝了Python的電腦上訪問(wèn)Python交互終端慢洋。運(yùn)行如下命令來(lái)開(kāi)啟Python交互終端:
$ python
譯者注:在 Linux 中#號(hào)提示符為 root 用戶,其它用戶為$
以上命令將啟動(dòng)默認(rèn)的Python交互終端陆盘。
Linux中如查在終端中寫入 python普筹,開(kāi)啟的是python2.7的終端。如果你想要啟動(dòng)python3的終端隘马,則在終端中輸入python3并按下 Enter 鍵太防。
在Windows中,我們可以在Command命令行中輸入 python酸员,就會(huì)在終端中啟動(dòng)所下載的Python版本蜒车。
使用Python交互終端編寫腳本
Python交互終端的起始提示符為>>>。在該終端中可輸入Python命令幔嗦,在>>>之后進(jìn)行編寫酿愧。如以下截圖所示:
現(xiàn)在,我們來(lái)看如何為變量賦值崭添,示例如下:
>>> name = 'John'
這時(shí)我們?yōu)閚ame變量賦了一個(gè)字符串值John寓娩。按下Enter進(jìn)入了一個(gè)以>>>提示符開(kāi)頭的新行:
>>> name = 'John'
>>>
現(xiàn)在叛氨,我們來(lái)看一個(gè)為變量賦值的示例并執(zhí)行數(shù)學(xué)運(yùn)算來(lái)獲取值:
>>> num1 = 5000
>>> num2 = 3500
>>> num3 = num1 + num2
>>> print(num3)
8500
>>> num4 = num3 - 2575
>>> print(num4)
5925
>>>
這里我們對(duì)不同的變量進(jìn)行賦值呼渣,對(duì)兩個(gè)變量進(jìn)行相加,并將和存儲(chǔ)在了第三個(gè)變量中寞埠,還在終端(Terminal)中打印出了和屁置。然后,我們對(duì)結(jié)果變量進(jìn)行了求減運(yùn)算仁连,將輸入存到了第四個(gè)變量中蓝角。接著我們將差在終端中進(jìn)行了打印。這告訴我們可以使用 Python 解釋器作為計(jì)算器來(lái)進(jìn)行使用饭冬。
>>> 509 / 22
23.136363636363637
>>>
以上使鹅,我們執(zhí)行了除法運(yùn)算。509除以22并得到了商23.136363636363637昌抠。
多行模式
在Python解釋器中編寫多行代碼時(shí)(比如 if 語(yǔ)句患朱、 for循環(huán)、while 循環(huán)和函數(shù))炊苫,解釋器會(huì)使用三個(gè)點(diǎn)(...) 作為二級(jí)提示符來(lái)延續(xù)代碼行裁厅。要退出這些行冰沙,我們需要連續(xù)按下兩次 Enter 鍵。我們來(lái)看看如下的示例:
>>> val1 = 2500
>>> val2 = 2400
>>> if val1 > val2:
... print("val1大于val2")
... else:
... print("val2大于val1")
...
val1大于val2
>>>
本例中执虹,我們對(duì)兩個(gè)變量val1和val2進(jìn)行了整數(shù)值的賦值拓挥,并檢查val1是否大于val2。上例中val1大于val2袋励,因此 if 代碼塊中的語(yǔ)句執(zhí)行了打印侥啤。注意 if 和 else 代碼塊中的語(yǔ)句需要進(jìn)行縮進(jìn)。如果不使用縮進(jìn)插龄,就會(huì)得到如下報(bào)錯(cuò):
>>> if val1 > val2:
... print("val1大于val2")
File "<stdin>", line 2
print("val1大于val2")
^
IndentationError: expected an indented block
通過(guò)Python解釋器導(dǎo)入模塊
如果你導(dǎo)入任何模塊愿棋,Python解釋器會(huì)檢查該模塊是否存在。我們可通過(guò) import 語(yǔ)句來(lái)進(jìn)行實(shí)現(xiàn)均牢。如果該模塊存在糠雨,在按下 Enter 鍵之后就可以看到>>> 前置提示符。這表示執(zhí)行成功徘跪。如果該模塊不存在甘邀,則會(huì)在Python解釋器中顯示報(bào)錯(cuò)。
>>> import time
>>>
在導(dǎo)入time模塊之后垮庐,我們獲得了>>> 前置提示符松邪,這表示該模塊存在并且這條命令成功執(zhí)行了:
<pre class="lang:default decode:true">>>> import matplotlib</pre>
如果模塊不存在,就會(huì)返回Traceback的報(bào)錯(cuò):
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ImportError: No module named 'matplotlib'
這里matplotlib不可用哨查,因此給出了報(bào)錯(cuò):ImportError: No module named 'matplotlib'逗抑。
要解決這一報(bào)錯(cuò),我們需要安裝matplotlib(譯者注:pip3 install matplotlib)然后再次導(dǎo)入matplotlib寒亥。在安裝matplotlib之后邮府,就能夠?qū)脒@一模塊了,如下:
>>> import matplotlib
>>>
退出Python終端
在Python終端有兩種方式可以退出:
- 快捷鍵: Ctrl + D
- 使用quit()或exit()函數(shù)
快捷鍵
使用快捷鍵Ctrl + D將會(huì)得到如下代碼:
>>> val1 = 5000
>>> val2 = 2500
>>>
>>> val3 = val1 - val2
>>> print (val3)
2500
>>>
vagrant@ubuntu-xenial:~$
使用quit()或exit() 函數(shù)
使用quit()可退出Python交互終端溉奕,會(huì)回到原來(lái)的命令終端:
>>> Lion = 'Simba'
>>> quit()
vagrant@ubuntu-xenial:~$
縮進(jìn)和制表符Tab
在Python中編寫代碼塊必須使用縮進(jìn)褂傀。縮進(jìn)有助于編寫函數(shù)加勤、決策語(yǔ)句仙辟、循環(huán)語(yǔ)句和類。這讓Python程序的讀取更為容易鳄梅。
我們使用縮進(jìn)來(lái)表示Python程序的代碼塊叠国。對(duì)代碼塊的縮進(jìn),可以使用空格或制表符(tab)戴尸。參見(jiàn)如下示例:
if val1 > val2:
print ("val1大于val2")
print("這部分代碼沒(méi)有進(jìn)行縮進(jìn)")
在上例中粟焊,我們對(duì)print語(yǔ)句進(jìn)行了縮進(jìn),因?yàn)樗挥?if 代碼塊中。第二個(gè)print語(yǔ)句不在 if 代碼塊中吆玖,所以沒(méi)有對(duì)其進(jìn)行縮進(jìn)筒溃。
變量
類似一些其它編程語(yǔ)言,Python 中無(wú)需事先聲明變量沾乘。Python 中可以想一個(gè)任意名稱來(lái)作為變量名并進(jìn)行賦值(譯者注:僅能使用字母怜奖、數(shù)字和下劃線且不能以數(shù)學(xué)開(kāi)頭)〕嵴螅可以在我們的程序中使用該變量歪玲。因此,Python 中我們可以在任何需使用的時(shí)候聲明變量掷匠。
Python 中變量的值以及類型都可以在程序的執(zhí)行過(guò)程中進(jìn)行修改滥崩。以下代碼中我們對(duì)變量賦值100:
>>> n = 100 # 這里我們對(duì)變量 n 賦值100,并在下面對(duì)n 的值加1
>>> n = n + 1
>>> print(n)
101
>>>
以下為在執(zhí)行過(guò)程中變量類型可進(jìn)行改變的示例:
>>> a = 50 # 數(shù)據(jù)類型被隱式地設(shè)置為整型
>>> a = 50 + 9.50 # 數(shù)據(jù)類型被修改為浮點(diǎn)型
>>> a = "Seventy" # 現(xiàn)在變成了字符串類型
Python處理不同數(shù)據(jù)類型的展現(xiàn)讹语,也即不同類型的值會(huì)存儲(chǔ)在不同的內(nèi)存空間中钙皮。變量是我們用于賦值的名稱:
>>> msg = 'And now for something completely different'
>>> a = 20
>>> pi = 3.1415926535897932
上例中進(jìn)行了三次賦值。第一次將一個(gè)字符串賦值為名為msg的變量顽决。第二次將一個(gè)整型賦值為名為a的變量短条,最后一次是一個(gè)圓周率pi值的賦值。
變量的類型為它所引用的值的類型才菠,查看以下代碼:
>>> type(msg)
<class 'str'>
>>> type(a)
<class 'int'>
>>> type(pi)
<class 'float'>
創(chuàng)建變量和賦值
在Python中茸时,變量無(wú)需顯式的進(jìn)行聲明來(lái)保留內(nèi)存空間。在對(duì)變量進(jìn)行賦值即會(huì)自動(dòng)完成聲明赋访。Python中單個(gè)等號(hào)=用于為變量賦值可都。
思考如下示例的執(zhí)行:
#!/usr/bin/python3
name = 'John'
age = 25
address = 'USA'
percentage = 85.5
print(name)
print(age)
print(address)
print(percentage)
輸出如下:
John
25
USA
85.5
在上例中,我們將John賦值給變量name蚓耽、25賦值給變量age渠牲、USA賦值給變量address以及將85.5賦值給變量percentage。
我們無(wú)需像在其它編程語(yǔ)言中那樣事先聲明變量田晚。因此嘱兼,查看值的解釋器可獲得變量的類型国葬。在前例中贤徒,name和address是字符串類型,age是整型汇四,percentage是浮點(diǎn)類型接奈。
使用同一值進(jìn)行多個(gè)變量的賦值可以這樣做:
x = y = z = 1
上例中我們創(chuàng)建了三個(gè)變量并使用整數(shù)1為它們賦值,會(huì)為這三個(gè)變量分配同一個(gè)內(nèi)存地址通孽。
在Python中序宦,我們還可以在同一行中對(duì)多個(gè)變量賦多個(gè)值:
x, y, z = 10, 'John', 80
這里我們聲明一個(gè)字符串變量y,將John賦值給它背苦,以及兩個(gè)整型變量x和z互捌,分別用10和80為它們賦值潘明。
數(shù)值
Python解釋器也可發(fā)揮計(jì)算器的作用。只需輸入表達(dá)式秕噪,它就會(huì)返回值钳降。括號(hào)( )用于進(jìn)行分組,如下例如所示:
>>> 5 + 5
10
>>> 100 - 5*5
75
>>> (100 - 5*5) / 15
5.0
>>> 8 / 5
1.6
整型數(shù)值是int類型腌巾,小數(shù)部分是float類型遂填。
??在Python中,除法(/) 運(yùn)算符總是返回浮點(diǎn)值澈蝙。向下取整運(yùn)算符(//)獲取的是整型結(jié)果吓坚。%運(yùn)算符用于計(jì)算余數(shù)。
思考如下示例:
>>> 14/3
4.666666666666667
>>> 14//3
4
>>> 14%3
2
>>> 4*3+2
14
計(jì)算冪值(指數(shù)運(yùn)算)灯荧,Python使用**運(yùn)算符礁击,如下例所示:
>>> 8**3
512
>>> 5**7
78125
等號(hào)(=)用于對(duì)變量賦值:
>>> m = 50
>>> n = 8 * 8
>>> m * n
3200
如果變量不存在,而我們還是使用該變量逗载,那么解釋器會(huì)顯示錯(cuò)誤:
>>> k
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'k' is not defined
>>>
如果運(yùn)算符連接不同類型的操作數(shù)客税,那么得到的值將會(huì)是浮點(diǎn)數(shù):
>>> 5 * 4.75 - 1
22.75
在Python交互終端中,_包含上一次打印過(guò)的表達(dá)式值撕贞,如下例所示:
>>> a = 18.5 / 100
>>> b = 150.50
>>> a * b
27.8425
>>> b + _
178.3425
>>> round(_, 2)
178.34
數(shù)值數(shù)據(jù)類型存儲(chǔ)數(shù)字更耻,這是一種不可變的數(shù)據(jù)類型。如果進(jìn)行改變捏膨,Python會(huì)為修改的數(shù)據(jù)類型分別一個(gè)新的對(duì)象秧均。
我們可以通過(guò)賦值來(lái)創(chuàng)建數(shù)值對(duì)象,示例如下:
>>> num1 = 50
>>> num2 = 25
del語(yǔ)句用于刪除單個(gè)或多個(gè)變量号涯。參考如下示例:
>>> num = num_a = num_b = 1
>>> del num
>>> del num_a, num_b
數(shù)值類型轉(zhuǎn)換
在一些情況下目胡,我們需要顯式地將數(shù)字從一個(gè)類型轉(zhuǎn)換為另一種類型來(lái)滿足一些要求。Python在一個(gè)表達(dá)式中內(nèi)部實(shí)現(xiàn)链快。
- 輸入int(a)來(lái)將a轉(zhuǎn)換為整型
- 輸入float(a)來(lái)將a轉(zhuǎn)換為浮點(diǎn)數(shù)
- 輸入complex(a)來(lái)將a轉(zhuǎn)換復(fù)數(shù)誉己,實(shí)部為a,虛部為0
- 輸入complex(a, b)來(lái)將a和 b轉(zhuǎn)換為實(shí)部為a域蜗,虛部為b 的復(fù)數(shù)巨双。a和 b為數(shù)字表達(dá)式
字符串
和數(shù)值類型,字符串也是Python中一種數(shù)據(jù)結(jié)構(gòu)霉祸。Python可以操作字符串筑累。字符串可通過(guò)如下方式表示:
- 包含在單引號(hào)('...')中
- 包含在雙引號(hào)("...")中
參見(jiàn)如下示例:
>>> 'Hello Python'
'Hello Python'
>>> "Hello Python"
'Hello Python'
字符串是一組字符。我們可以像下面這樣一次訪問(wèn)一個(gè)字符:
>>> city = 'delhi'
>>> letter = city[1]
>>> letter = city[-3]
在第二個(gè)語(yǔ)句中丝蹭,我們從city中選擇數(shù)字為1的字符并將其賦值給letter慢宗。方括號(hào)中的數(shù)字為索引。索引表示要訪問(wèn)的字符,它從0開(kāi)始镜沽。因此在前例中執(zhí)行在賦值后輸入 letter敏晤,將得到如下輸出:
city d e l h i
索引 0 1 2 3 4
-5 -4 -3 -2 -1
輸出:
e
l
字符串拼接(+)和重復(fù)(*)
下一步我們來(lái)進(jìn)行字符串的拼接和重復(fù)。參照如下代碼:
>>> 3 * 'hi' + 'hello'
'hihihihello'
上例中缅茉,我們進(jìn)行字符串拼接和重復(fù)茵典。3 * 'hi'表示打印hi三次,使用+符號(hào)宾舅,我們?cè)趆i之后連接了字符串hello统阿。
我們可以通過(guò)把字符串連續(xù)放在一起自動(dòng)拼接兩個(gè)字符串。這兩個(gè)字符串必須包含在引號(hào)之間筹我,如下所示:
>>> 'he' 'llo'
'hello'
這一特性在字符串很長(zhǎng)又想要分開(kāi)輸入時(shí)非常有用扶平,示例如下:
>>> str = ('Several strings'
... ' joining them together.')
>>> str
'Several strings joining them together.'
字符串切片
字符串支持切片(slice)操作,這表示從字符串獲取指定范圍的字符蔬蕊。我來(lái)看看下面的例子结澄。注意起始的索引值是包含在內(nèi)的,而結(jié)束值則排除在外岸夯。
假設(shè)字符串為str = "Programming":
>>> str[0:2]
'Pr'
>>> str[2:5]
'ogr'
默認(rèn)省略不寫的第一個(gè)索引為0(省略第二個(gè)索引默認(rèn)獲取第一個(gè)索引到最后的所有字符)麻献,如下例所示:
>>> str = "Python"
>>> str[:2] + str[2:]
'Python'
>>> str[:4] + str[4:]
'Python'
>>> str[:2]
'Py'
>>> str[4:]
'on'
>>> str[-2:]
'on'
訪問(wèn)字符串中的值
我們可以通過(guò)方括號(hào)使用切片來(lái)訪問(wèn)字符串中的字符。我們還可以訪問(wèn)字符串中指定范圍內(nèi)的字符猜扮。參照如下示例:
#!/usr/bin/python3
str1 = 'Hello Python!'
str2 = "Object Oriented Programming"
print("str1[0]: ", str1[0])
print("str2[1:5]: ", str2[1:5])
輸出:
str1[0]: H
str2[1:5]: bjec
更新字符串
我們可以對(duì)一個(gè)指定索引重新賦新值來(lái)更新字符串勉吻。參照如下示例:
#!/usr/bin/python3
str1 = 'Hello Python!'
print("Updated String: - ", str1[:6] + 'John')
輸出:
Updated String: - Hello John
轉(zhuǎn)義字符
Python 支持不可打印的轉(zhuǎn)義字符(escape character),可通反斜線標(biāo)記來(lái)進(jìn)行展示旅赢。轉(zhuǎn)義字符在單引號(hào)和雙引號(hào)字符串中均可進(jìn)行解釋:
| 標(biāo)記 | 十六進(jìn)制字符 | 描述 |
| a | 0x07 | 響鈴或警告 |
| b | 0x08 | 退格(Backspace) |
| cx | | Control-x |
| n | 0x0a | 新起一行 |
| C-x | | Control-x |
| e | 0x1b | 轉(zhuǎn)義 |
| f | 0x0c | 換頁(yè) |
| s | 0x20 | 空格 |
| M-C-x | | Meta-control-x |
| x | | 字符x |
| nnn | | 八進(jìn)行標(biāo)記齿桃,n為0到7范圍內(nèi)的值 |
| r | 0x0d | 回車 |
| xnn | | 十六進(jìn)制標(biāo)記,n為0-9, a-f或A-F范圍內(nèi)的值 |
| t | 0x09 | Tab制表符 |
| v | 0x0b | 垂直制表符 |
特殊的字符串運(yùn)算符
下表中顯示了字符串的特殊運(yùn)算符煮盼,假定a為Hello短纵,b為World:
| 運(yùn)算符 | 描述 | 示例 |
| + | 拼接:將運(yùn)算符兩邊的值相加 | a + b將得到HelloWorld |
| [] | 切片:得到給定索引的字符串 | a[7]將得到r |
| [ : ] | 范圍切片:得到指定范圍內(nèi)的字符 | a[1:4]將得到ell |
| * | 重復(fù):創(chuàng)建新的字符串,將相同字符串的多個(gè)拷貝進(jìn)行拼接 | a*2將得到HelloHello |
| not in | 成員:如果字符不在字符串中返回true | Z not in a將得到1 |
| in | 成員:如果字符在字符串中返回true | H in a將得到1 |
| % | 格式化:執(zhí)行字符串格式化 | |
%字符串格式化運(yùn)算符
%是Python中的一個(gè)字符串格式化運(yùn)算符僵控。參照如下示例:
#!/usr/bin/python3
print("Hello this is %s and my age is %d !" % ('John', 25))
輸出:
Hello this is John and my age is 25 !
下表顯示了配合%使用的符號(hào)列表:
| 序號(hào) | Format symbol and conversion |
| 1 | %c – 字符 |
| 2 | %s – 在格式化之前通過(guò)str()轉(zhuǎn)換的字符串 |
| 3 | %i – 有符號(hào)十進(jìn)制整數(shù) |
| 4 | %d – 有符號(hào)十進(jìn)制整數(shù) |
| 5 | %u – 無(wú)符號(hào)十進(jìn)制整數(shù) |
| 6 | %o – 八進(jìn)制整數(shù) |
| 7 | %x – 十六進(jìn)制整數(shù)(小寫字母) |
| 8 | %X –十六進(jìn)制整數(shù)(大寫字母) |
| 9 | %e – 指數(shù)標(biāo)記(使用小寫 e) |
| 10 | %E –指數(shù)標(biāo)記(使用大寫 E) |
| 11 | %f – 浮點(diǎn)實(shí)數(shù) |
Python中的三引號(hào)
Python對(duì)字符串使用三引號(hào)的表示可跨越多行香到,包括新行和制表符。三引號(hào)的語(yǔ)法包含三個(gè)連續(xù)的單引號(hào)或雙引號(hào)报破。參照如下代碼:
#!/usr/bin/python3
para_str = """Python is a scripting language which was created by
Guido van Rossum in 1991, t which is used in various sectors such as Game
Development, GIS Programming, Software Development, web development,
Data Analytics and Machine learning, System Scripting etc.
"""
print (para_str)
輸出內(nèi)容:
Python is a scripting language which was created by
Guido van Rossum in 1991, t which is used in various sectors such as Game
Development, GIS Programming, Software Development, web development,
Data Analytics and Machine learning, System Scripting etc.<
字符串是不可變的
字符串是不可變的悠就,表示我們修改它的值。參照如下示例:
>>> welcome = 'Hello, John!'
>>> welcome[0] = 'Y'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: 'str' object does not support item assignment
因?yàn)樽址遣豢勺兊模╥mmutable)泛烙,我們不能修改現(xiàn)有字符串理卑。但我們可以創(chuàng)建一個(gè)與原來(lái)不同的新字符串:
>>> str1 = 'Hello John'
>>> new_str = 'Welcome' + str1[5:]
>>> print(str1)
Hello John
>>> print(new_str)
Welcome John
>>>
理解列表
Python支持一種稱為列表(list)的數(shù)據(jù)結(jié)構(gòu)翘紊,它是一個(gè)可變和有序的元素序列蔽氨。列表中的每個(gè)元素稱為列表項(xiàng)。列表通過(guò)在方括號(hào)[ ]之間插入值定義。列中的每個(gè)元素都會(huì)給定一個(gè)數(shù)值鹉究,稱們稱之為位置或索引宇立。索引從0開(kāi)始,也即自赔,第一個(gè)索引為0妈嘹,第二個(gè)索引為1,以此類推绍妨。我們可對(duì)列表進(jìn)行如下運(yùn)算:索引润脸、切片、相加他去、相乘以及檢查是否為列表成員毙驯。
Python內(nèi)置的length函數(shù)返回列表的長(zhǎng)度。Python還有查找列表中最大項(xiàng)和最小項(xiàng)的函數(shù)灾测。列表可以是數(shù)值列表爆价、字符串列表或混合列表。
以下是創(chuàng)建列表的代碼:
>>> l = list()
>>> numbers = [10, 20, 30, 40]
>>> animals = ['Dog', 'Tiger', 'Lion']
>>> list1 = ['John', 5.5, 500, [100, 450]]
這里我們創(chuàng)建了三個(gè)列表:第一個(gè)是numbers媳搪,第二是animals铭段,第三個(gè)是list1。列表中有另一個(gè)列表稱為嵌套列表秦爆。list1是一個(gè)嵌套列表序愚。不包含任何元素的列表稱為空列表,可通過(guò)空的中括號(hào)[]來(lái)創(chuàng)建空列表等限。
你可能已經(jīng)猜展运,可將列表賦值給變量:
>>> cities = ['Mumbai', 'Pune', 'Chennai']
>>> numbers_list = [75, 857]
>>> empty_list = []
>>> print(cities, numbers_list, empty_list)
['Mumbai', 'Pune', 'Chennai'] [75, 857] []
訪問(wèn)列表中的值
我們可以使用索引值來(lái)訪問(wèn)列表中的值。我們將索引數(shù)字放在[ 和 ]之間精刷。索引從0開(kāi)始拗胜。參見(jiàn)如下示例:
#!/usr/bin/python3
cities = ['Mumbai', 'Bangalore', 'Chennai', 'Pune']
numbers = [1, 2, 3, 4, 5, 6, 7]
print(cities[0])
print(numbers[1:5])
輸出結(jié)果:
Mumbai
[2, 3, 4, 5]
更新列表
可以更新列表中的元素,如以下代碼所示:
#!/usr/bin/python3
cities = ['Mumbai', 'Bangalore', 'Chennai', 'Pune']
print('Original Value: ', cities[3])
cities[3] = 'Delhi'
print('New value: ', cities[3])
輸出結(jié)果:
Original Value: Pune
New value: Delhi
刪除列表元素
要?jiǎng)h除列表中元素怒允,如果知道要具體刪除的元素可使用del語(yǔ)句埂软。如果不知道具體要?jiǎng)h除的列表項(xiàng)索引可使用remove()。參見(jiàn)如下示例:
#/usr/bin/python3
cities = ['Mumbai', 'Bangalore', 'Chennai', 'Pune']
print("Before deleting: ", cities)
del cities[2]
# cities.remove("Chennai") # 相同效果的補(bǔ)充
print("After deleting: ", cities)
輸出結(jié)果:
Before deleting: ['Mumbai', 'Bangalore', 'Chennai', 'Pune']
After deleting: ['Mumbai', 'Bangalore', 'Pune']
基本列表運(yùn)算
有五種基本列表運(yùn)算:
- 拼接
- 重復(fù)
- 取長(zhǎng)度
- 成員關(guān)系
- 迭代
| 描述 | 表達(dá)式 | 結(jié)果 |
| 拼接 | [30, 50, 60] + ['Hello', 75, 66] | [30, 50, 60, 'Hello', 75, 66] |
| 成員 | 45 in [45, 58, 99, 65] | True |
| 迭代 | for x in [45, 58, 99]:
print(x, end=' ') | 45 58 99 |
| 重復(fù) | ['Python'] * 3 | ['Python', 'Python', 'Python'] |
| 取長(zhǎng)度 | len([45, 58, 99, 65]) | 4 |
列表運(yùn)算
在這一部分中纫事,我們將學(xué)習(xí)基本列表運(yùn)算:拼接和重復(fù)勘畔。
+運(yùn)算符將列表進(jìn)行拼接:
>>> a = [30, 50, 60]
>>> b = ['Hello', 75, 66]
>>> c = a + b
>>> print(c)
[30, 50, 60, 'Hello', 75, 66]
相似地,*運(yùn)算符以給定次數(shù)重復(fù)列表:
>>> [0] * 4
[0, 0, 0, 0]
>>> ['Python'] * 3
['Python', 'Python', 'Python']
索引丽惶、切片和矩陣
列表索引與字符串索引的運(yùn)作方式相同炫七。列表值可通過(guò)索引來(lái)訪問(wèn)。如果嘗試將不存在的元素寫入列表钾唬,會(huì)得到IndexError万哪。如果索引為負(fù)值侠驯,會(huì)從列表的最后開(kāi)始倒數(shù)。
現(xiàn)在我們創(chuàng)建一個(gè)名為cities的列表并查看列表的索引運(yùn)算:
cities = ['Mumbai', 'Bangalore', 'Chennai', 'Pune']
| 描述 | 表達(dá)式 | 結(jié)果 |
| 索引從0開(kāi)始 | cities[2] | 'Chennai' |
| 切片:獲取一個(gè)片段 | cities[1:] | ['Bangalore', 'Chennai', 'Pune'] |
| 負(fù)數(shù):從右開(kāi)始數(shù) | cities[-3] | 'Bangalore' |
元組
Python 的元組(tuple)數(shù)據(jù)結(jié)構(gòu)是不可變的奕巍,這表示不能修改元組中的元素吟策。 基本上,元組是一個(gè)以逗號(hào)分隔的值的序列的止,以括號(hào)( )進(jìn)行包裹檩坚。和列表類似,元組是一個(gè)有序的元素序列:
t1 = 'h', 'e', 'l', 'l', 'o'
元組以括號(hào)( )進(jìn)行包裹:
t1 = ('h', 'e', 'l', 'l', 'o')
我們還可以創(chuàng)建一個(gè)只有一個(gè)元素的元組诅福,僅需在元組的最后加一個(gè)逗號(hào):
>>> t1 = 'h',
>>> type(t1)
<class 'tuple'>
把值放到括號(hào)中并不是元組:
>>> t1 = ('a')
>>> type(t1)
<class 'str'>
我們可以使用tuple()函數(shù)來(lái)創(chuàng)建空的元組:
>>> t1 = tuple()
>>> print(t1)
()
如果該函數(shù)的參數(shù)是一個(gè)序列(字符串匾委、列表或元組),結(jié)果是這個(gè)序列元素組成的元組:
<pre class="lang:default decode:true ">>>> t = tuple('mumbai')
print(t)
('m', 'u', 'm', 'b', 'a', 'i')</pre>
元組的值在括號(hào)( ) 中以逗號(hào)分隔:
>>> t = ('a', 'b', 'c', 'd', 'e')
>>> print(t[0])
a
切片運(yùn)算符選取一個(gè)范圍內(nèi)的元素氓润。
>>> print(t[1:3])
('b', 'c')
訪問(wèn)元組中的值
要訪問(wèn)元組中的值剩檀,使用方括號(hào)切片與單個(gè)或多個(gè)索引結(jié)合來(lái)獲取對(duì)應(yīng)索引的值,如下例所示:
#!/usr/bin/python3
cities = ('Mumbai', 'Bangalore', 'Chennai', 'Pune')
numbers = (1, 2, 3, 4, 5, 6, 7)
print(cities[3])
print(numbers[1:6])
輸出結(jié)果:
Pune
(2, 3, 4, 5, 6)
更新元組
在Python中元組是不可更新的旺芽,因?yàn)樵M是不可變的沪猴。但是我們通過(guò)現(xiàn)在元組來(lái)新建一個(gè)元組,如下例如下:
#!/usr/bin/python3
cities = ('Mumbai', 'Bangalore', 'Chennai', 'Pune')
numbers = (1, 2, 3, 4, 5, 6, 7)
tuple1 = cities + numbers
print(tuple1)
輸出結(jié)果:
('Mumbai', 'Bangalore', 'Chennai', 'Pune', 1, 2, 3, 4, 5, 6, 7)
刪除元組元素
我們不能刪除單個(gè)數(shù)據(jù)元組采章。因此要顯式地刪除整個(gè)元組运嗜,使用del語(yǔ)句。參照如下示例:
#!/usr/bin/python3
cities = ('Mumbai', 'Bangalore', 'Chennai', 'Pune')
print("Before deleting: ", cities)
del cities
print("After deleting: ", cities)
輸出結(jié)果:
Before deleting: ('Mumbai', 'Bangalore', 'Chennai', 'Pune')
Traceback (most recent call last):
File "test.py", line 5, in <module>
print("After deleting: ", cities)
NameError: name 'cities' is not defined
基本元組運(yùn)算
和列表相似悯舟,有五種基本元組運(yùn)算:
- 拼接
- 重復(fù)
- 取長(zhǎng)度
- 成員關(guān)系
- 迭代
| 描述 | 表達(dá)式 | 結(jié)果 |
| 拼接 | (30, 50, 60) + ('Hello', 75, 66) | (30,50,60,'Hello',75,66) |
| 成員 | 45 in (45, 58, 99, 65) | True |
| 迭代 | for x in (45, 58, 99):
print(x, end=' ') | 45 58 99 |
| 重復(fù) | ('Python') * 3 | ('Python', 'Python', 'Python') |
| 取長(zhǎng)度 | len((45, 58, 99, 65)) | 4 |
索引担租、切片和矩陣
元組索引的運(yùn)作方式和列表相同。使用索引可訪問(wèn)元組的值抵怎。如果嘗試讀取或?qū)懭氩淮嬖诘脑胤芫龋瑫?huì)報(bào)出IndexError。如果索引為負(fù)值反惕,則從元組的最后向前數(shù)尝艘。
現(xiàn)在我們創(chuàng)建一個(gè)名為cities的元組并查看列表的索引運(yùn)算:
cities = ('Mumbai', 'Bangalore', 'Chennai', 'Pune')
| 描述 | 表達(dá)式 | 結(jié)果 |
| 索引從0開(kāi)始 | cities[2] | 'Chennai' |
| 切片:獲取一個(gè)片段 | cities[1:] | ('Bangalore', 'Chennai', 'Pune') |
| 負(fù)數(shù):從右開(kāi)始數(shù) | cities[-3] | 'Bangalore' |
max()和min()
使用max()和min()函數(shù),我們可以查找元組中的最大值和最小值姿染。這兩個(gè)函數(shù)讓我們可以找到量化數(shù)據(jù)的相關(guān)信息背亥。我們來(lái)看看下面這個(gè)例子:
>>>> numbers = (50, 80, 98, 110.5, 75, 150.58)
>>> print(max(numbers))
150.58
使用max()可以獲取元組中的最大值。相似地悬赏,我們可以使用min()函數(shù):
>>> numbers = (50, 80, 98, 110.5, 75, 150.58)
>>> print(min(numbers))
50
因此這里我們獲取到了最小值狡汉。
集合
集合(set)是一個(gè)無(wú)序且無(wú)重復(fù)值的元素集。集合的基本用法是檢查成員關(guān)系測(cè)試和刪除重復(fù)項(xiàng)闽颇。這些集合對(duì)象支持?jǐn)?shù)學(xué)運(yùn)算盾戴,如并集、交集兵多、差集以及對(duì)等差分尖啡。我們可以使用大括號(hào){}或函數(shù)set()來(lái)創(chuàng)建集合橄仆。如果想要?jiǎng)?chuàng)建一個(gè)空的集合,使用set()而不是{}可婶。
以下是一個(gè)簡(jiǎn)單的演示:
>>> fruits = {'Mango', 'Apple', 'Mango', 'Watermelon', 'Apple', 'Orange'}
>>> print(fruits)
{'Orange', 'Apple', 'Watermelon', 'Mango'}
>>> 'Orange' in fruits
True
>>> 'Onion' in fruits
False
>>> a = set('abracadabra')
>>> b = set('alacazam')
>>> a
{'c', 'r', 'b', 'a', 'd'}
>>> a - b
{'r', 'b', 'd'}
>>> a | b
{'c', 'l', 'd', 'b', 'z', 'r', 'm', 'a'}
>>> a & b
{'c', 'a'}
>>> a ^ b
{'l', 'd', 'b', 'z', 'r', 'm'}
譯者注:因集合是無(wú)序的沿癞,所以讀者在執(zhí)行相同代碼時(shí)得到的結(jié)果順序可能會(huì)略有不同
Python 中還支持集合推導(dǎo)式(set comprehension)援雇,參見(jiàn)如下代碼:
>>> a = {x for x in 'abracadabra' if x not in 'abc'}
>>> a
{'r', 'd'}
字典
字典(dictionary)是Python中的一種數(shù)據(jù)類型矛渴,它由鍵值對(duì)組成并包裹在大括號(hào){}中。字典是無(wú)序的并通過(guò)鍵進(jìn)行索引惫搏,且每個(gè)鍵必須是唯一的具温。這些鍵必須為不可變類型。元組在級(jí)包含字符串筐赔、數(shù)字或元組時(shí)可作為字典的鍵铣猩。
僅僅使用一對(duì)大括號(hào){}會(huì)創(chuàng)建一個(gè)空的字典。字典的主要運(yùn)算是使用某些鍵來(lái)存儲(chǔ)值并通過(guò)給定的鍵來(lái)提取值茴丰。同樣可以使用 del 來(lái)刪除一個(gè)鍵值對(duì)达皿。如果使用了已有的鍵進(jìn)行存儲(chǔ),就會(huì)抹除該鍵原來(lái)關(guān)聯(lián)的值贿肩。使用不存在的鍵來(lái)提取值會(huì)報(bào)錯(cuò)峦椰。以下是使用字典的一個(gè)小例子:
>>> student = {'Name':'John', 'Age':25}
>>> student['Address'] = 'Mumbai'
>>> student
{'Name': 'John', 'Address': 'Mumbai', 'Age': 25}
>>> student['Age']
25
>>> del student['Address']
>>> student
{'Name': 'John', 'Age': 25}
>>> list(student.keys())
['Name', 'Age']
>>> sorted(student.keys())
['Age', 'Name']
>>> 'Name' in student
True
>>> 'Age' not in student
False
自選的鍵值表達(dá)式配合字典推導(dǎo)式可用于創(chuàng)建字典:
>>> {x: x**2 for x in (4, 6, 8)}
{4: 16, 6: 36, 8: 64}
在鍵是簡(jiǎn)單的字符串時(shí),使用關(guān)鍵字參數(shù)的方式指定鍵值對(duì)很更為容易:
>>> dict(John=25, Nick=27, Jack=28)
{'Nick': 27, 'Jack': 28, 'John': 25}
解析命令行參數(shù)
在這一部分中汰规,我們將學(xué)習(xí)參數(shù)的解析以及用于解析參數(shù)的模塊汤功。
Python 中的命令行參數(shù)
我們可以在命令行中添加額外的參數(shù)來(lái)啟動(dòng)程序。Python的程序可通過(guò)命令行參數(shù)來(lái)啟動(dòng)溜哮。讓我們來(lái)看看下面這個(gè)例子:
$ python program_name.py img.jpg
這里program_name.py和img.jpg都是參數(shù)滔金。我們將使用模塊來(lái)獲取這些參數(shù):
| 模塊 | 用法 | Python版本 |
| optparse | 已淘汰 | < 2.7 |
| sys | 所有sys.argv中的參數(shù) (基本) | 所有版本 |
| argparse | 創(chuàng)建一個(gè)命令行接口 | >= 2.3 |
| fire | 自動(dòng)生成命令行接口(CLI) | All |
| docopt | 創(chuàng)建CLI接口 | >= 2.5 |
Sys.argv
sys模塊用于訪問(wèn)命令行參數(shù)。len(sys.argv) 函數(shù)包含參數(shù)的數(shù)量茂嗓。要打印所有的參數(shù)餐茵,只需執(zhí)行str(sys.argv)。讓們來(lái)看看下面這個(gè)例子:
# 01.py
import sys
print('Number of arguments: ', len(sys.argv))
print('Argument list: ', str(sys.argv))
# 運(yùn)行
python3 01.py img
# 執(zhí)行結(jié)果
Number of arguments: 2
Argument list: ['01.py', 'img']
決策制定
當(dāng)我們想要在條件為true時(shí)執(zhí)行一個(gè)代碼時(shí)述吸,就需要使用到?jīng)Q策制定了钟病。if...elif...else語(yǔ)句在Python中用于決策制定。
Python的if語(yǔ)句語(yǔ)法
以下是if語(yǔ)句的語(yǔ)法:
if test expression:
statement(s)
這里刚梭,程序運(yùn)行了test 表達(dá)式并僅在該表達(dá)式為true時(shí)才執(zhí)行下面的語(yǔ)句肠阱。如果表達(dá)式為false,則不會(huì)執(zhí)行語(yǔ)句朴读。
Python中if語(yǔ)句的主體通過(guò)縮進(jìn)來(lái)表示屹徘。語(yǔ)句主體通過(guò)縮進(jìn)來(lái)表示第一行的開(kāi)始,通過(guò)取消縮進(jìn)表示主體的結(jié)束衅金。我們來(lái)看看下面這個(gè)例子:
a = 10
if a > 0:
print(a, "is a positive number.")
print("This statement is always printed.")
a = -10
if a > 0:
print(a, "is a positive number.")
輸出結(jié)果:
10 is a positive number.
This statement is always printed.
Python的if...else語(yǔ)句語(yǔ)法
在這一部分噪伊,我們將學(xué)習(xí)if..else 語(yǔ)句簿煌。else代碼塊僅在if條件為false時(shí)執(zhí)行。參見(jiàn)如下代碼:
if test expression:
if block
else:
else block
if..else語(yǔ)句運(yùn)行test表達(dá)式鉴吹,僅在test條件為true時(shí)運(yùn)行主體內(nèi)容姨伟。如果條件為false,else中的主體內(nèi)容會(huì)被執(zhí)行豆励《峄模縮進(jìn)用于分割代碼塊。參見(jiàn)如下示例:
a = 10
if a > 0:
print("Positive number")
else:
print("Negative number")
輸出結(jié)果:
Positive number
Python的if...elif...else語(yǔ)句語(yǔ)法
elif語(yǔ)句從多條語(yǔ)句中檢查true值良蒸。只要運(yùn)行的執(zhí)為 true 就執(zhí)行相應(yīng)的代碼塊技扼。參見(jiàn)如下代碼:
if test expression:
if block statements
elif test expression:
elif block statements
else:
else block statements
elif是else if的簡(jiǎn)寫,讓我們可以檢查多個(gè)表達(dá)式嫩痰。如果if語(yǔ)句中的條件為false剿吻,它會(huì)檢查下一個(gè)elif代碼塊的條件,以此類推串纺。如果所有條件均為false丽旅,else中的主體內(nèi)容會(huì)被執(zhí)行。
if...elif...else中僅會(huì)根據(jù)條件執(zhí)行其中一個(gè)代碼塊纺棺。if代碼塊僅能帶有一個(gè)else代碼塊榄笙,但可以有多個(gè)elif代碼塊。我們來(lái)看看以下的示例:
a = 10
if a > 50:
print("a is greater than 50")
elif a == 10:
print("a is equal to 10")
else:
print("a is negative")
輸出結(jié)果:
a is equal to 10
循環(huán)
要處理腳本中的所有循環(huán)需求五辽,Python支持兩類循環(huán):
- for 循環(huán)
- while 循環(huán)
下面我們就來(lái)學(xué)習(xí)for 循環(huán)和while 循環(huán)办斑。
for循環(huán)
for循環(huán)遍歷序列或其它可迭代對(duì)象中的每一項(xiàng),并每次執(zhí)行for代碼塊中的語(yǔ)句杆逗。參照如下代碼:
for i in sequence:
for loop body
此處i 為在每次迭代時(shí)獲取序列中各項(xiàng)值的變量乡翅。在到達(dá)序列最后一項(xiàng)之前循環(huán)會(huì)一直執(zhí)行。下圖中進(jìn)行了描述:
參見(jiàn)如下示例:
numbers = [6, 5, 3, 8, 4, 2, 5, 4, 11]
sum = 0
for i in numbers:
sum = sum + i
print("The sum is", sum)
輸出結(jié)果:
The sum is 6
The sum is 11
The sum is 14
The sum is 22
The sum is 26
The sum is 28
The sum is 33
The sum is 37
The sum is 48
range()函數(shù)
Python的range()函數(shù)會(huì)生成一個(gè)數(shù)字的序列罪郊。例如蠕蚜,range(10)會(huì)生成0到9的數(shù)字(共10個(gè)數(shù)字)。
我們還可以定義起始悔橄、結(jié)束和步長(zhǎng)來(lái)作為參數(shù)靶累,這時(shí)range()函數(shù)如下所示:
range(start, stop, step size).
如未設(shè)置步長(zhǎng)默認(rèn)為1。
使用range()函數(shù)的 for 循環(huán)示例如下:
for i in range(5):
print("The number is", i)
輸出結(jié)果:
The number is 0
The number is 1
The number is 2
The number is 3
The number is 4
while循環(huán)
while是一個(gè)在測(cè)試表達(dá)式為true時(shí)不停遍歷代碼塊的循環(huán)語(yǔ)句癣疟。我們?cè)诓恢酪嗌俅螘r(shí)使用這一循環(huán)挣柬。參見(jiàn)如下代碼:
while test_expression:
while body statements
在while循環(huán)中,我們首先檢查測(cè)試表達(dá)式睛挚。while僅在這個(gè)測(cè)試表達(dá)式為true時(shí)執(zhí)行邪蛔。在一個(gè)迭代后,會(huì)重新對(duì)表達(dá)式進(jìn)行檢查扎狱,并在表達(dá)式運(yùn)行值為false前不停重復(fù)這一過(guò)程侧到。下圖中進(jìn)行了描述:
以下為while循環(huán)的示例:
a = 10
sum = 0
i = 1
while i <= a:
sum = sum + i
i = i + 1
print("The sum is", sum)
運(yùn)行結(jié)果:
The sum is 1
The sum is 3
The sum is 6
The sum is 10
The sum is 15
The sum is 21
The sum is 28
The sum is 36
The sum is 45
The sum is 55
迭代器
Python中的迭代器是可進(jìn)行迭代的對(duì)象勃教。這個(gè)對(duì)象會(huì)返回?cái)?shù)據(jù),每次返回一個(gè)元素匠抗。Python的迭代器對(duì)象實(shí)現(xiàn)了兩個(gè)方法:iter()和next()故源。大多數(shù)情況下迭代器在循環(huán)、生成器和推導(dǎo)式中實(shí)現(xiàn)汞贸。
下例中绳军,我們使用了next()函數(shù),它會(huì)遍歷所有的元素著蛙。在到達(dá)最后且沒(méi)有更多數(shù)據(jù)返回時(shí)删铃,會(huì)拋出StopIteration耳贬,如下例所示:
numbers = [10, 20, 30, 40]
numbers_iter = iter(numbers)
print(next(numbers_iter))
print(next(numbers_iter))
print(numbers_iter.__next__())
print(numbers_iter.__next__())
next(numbers_iter)
輸出結(jié)果:
10
20
30
40
Traceback (most recent call last):
File "test.py", line 10, in <module>
next(numbers_iter)
StopIteration
生成器
我們可以使用Python生成器來(lái)創(chuàng)建迭代器踏堡。Python中生成器是返回一個(gè)可以迭代對(duì)象的函數(shù)。
如何在Python中創(chuàng)建生成器
在Python中創(chuàng)建生成器非常容易咒劲。我們可以定義一個(gè)函數(shù)顷蟆,使用yield語(yǔ)句來(lái)代替return語(yǔ)句即可創(chuàng)建生成器。如果函數(shù)中至少包含一個(gè)yield語(yǔ)句腐魂,它就變成了一個(gè)生成器函數(shù)帐偎。yield和return語(yǔ)句會(huì)從函數(shù)中返回某些值。以下為示例:
def my_gen():
n = 1
print("This is printed first")
yield n
n += 1
print("This is printed second")
yield n
n += 1
print("This is printed at last")
yield n
for item in my_gen():
print(item)
輸出結(jié)果:
This is printed first
1
This is printed second
2
This is printed at last
3
函數(shù)
函數(shù)時(shí)執(zhí)行特定任務(wù)的一組語(yǔ)句蛔屹。使用函數(shù)有助于將我們的程序分成更小的部分削樊。函數(shù)可避免重復(fù)并讓代碼可以復(fù)用,因此讓程序組織得更好兔毒。來(lái)看下面的語(yǔ)法:
def function_name:
statement(s)
參見(jiàn)如下示例:
def welcome(name):
print("Hello " + name + ", Welcome to Python Programming!")
welcome("John")
輸出結(jié)果:
Hello John, Welcome to Python Programming!
return語(yǔ)句
return語(yǔ)句用于退出函數(shù)漫贞。參見(jiàn)如下的語(yǔ)法:
return [expression_list]
這個(gè)語(yǔ)句可能包含返回一個(gè)值的表達(dá)式。如果沒(méi)有表達(dá)式育叁,函數(shù)會(huì)返回None對(duì)象迅脐,如下例所示:
def return_value(a):
if a >= 0:
return a
else:
return -a
print(return_value(2))
print(return_value(-4))
輸出結(jié)果:
2
4
Lambda函數(shù)
Python中匿名函數(shù)是未定義函數(shù)名的函數(shù),稱為lambda函數(shù)豪嗽,使用關(guān)鍵字lambda進(jìn)行定義谴蔑。在需要短暫使用一個(gè)函數(shù)時(shí)我們使用這類函數(shù)。
lambda函數(shù)與內(nèi)置的函數(shù)共同使用龟梦,如filter()和map()隐锭。
filter()函數(shù)返回一個(gè)元素列表,并僅接收一個(gè)迭代值计贰。以下為使用filter()的示例:
numbers = [10, 25, 54, 86, 89, 11, 33, 22]
new_numbers = list(filter(lambda x: (x%2 == 0), numbers))
print(new_numbers)
輸出結(jié)果:
[10, 54, 86, 22]
在本例中钦睡,filter()接收一個(gè)lambda函數(shù)以及一個(gè)列表來(lái)作為參數(shù)。
map()函數(shù)在應(yīng)用指定函數(shù)之后返回一個(gè)結(jié)果列表蹦玫。下面我們來(lái)看看使用map()的示例:
my_list = [1, 5, 4, 6, 8, 11, 3, 12]
new_list = list(map(lambda x: x * 2, my_list))
print(new_list)
輸出結(jié)果:
[2, 10, 8, 12, 16, 22, 6, 24]
這里赎婚,map()函數(shù)接收一個(gè)lambda函數(shù)和一個(gè)列表刘绣。
模塊
模塊只是包含Python語(yǔ)句和定義的文件。一個(gè)包含Python代碼的文件(如sample.py)稱為一個(gè)模塊挣输,并且模塊名應(yīng)為sample纬凤。使用模塊,我們可以大型的程序分解成更小和有組織的程序撩嚼。模塊的一個(gè)重要特性是復(fù)用性停士。我們無(wú)需在不同程序中拷貝經(jīng)常使用到的函數(shù)定義,而是將它們定義在一模塊中完丽,然后需要使用時(shí)進(jìn)行導(dǎo)入恋技。
我們來(lái)創(chuàng)建一個(gè)模塊并導(dǎo)入。我們將創(chuàng)建兩個(gè)腳本:sample.py和add.py逻族。然后在add.py中導(dǎo)入sample模塊◎叩祝現(xiàn)在將如下代碼保存到sample.py文件中。我們來(lái)看看下面這個(gè)示例:
# sample.py
def addition(num1, num2):
result = num1 + num2
return result
這里我們?cè)诿麨閟ample的模塊中定義了一個(gè)函數(shù)addition()聘鳞。該函數(shù)接收兩個(gè)數(shù)值并返回和薄辅。這樣我們就創(chuàng)建了一個(gè)模塊。我們可以在任意Python程序中導(dǎo)入該模塊抠璃。
導(dǎo)入模塊
在創(chuàng)建模塊后站楚,我們來(lái)學(xué)習(xí)如何導(dǎo)入這一模塊。上例中我們創(chuàng)建了一個(gè)sample模塊〔耍現(xiàn)在我們就在add.py腳本中導(dǎo)入sample模塊:
# add.py
import sample
sum = sample.addition(10, 20)
print(sum)
輸出結(jié)果:
30
總結(jié)
在本章中窿春,我們概覽了Python腳本語(yǔ)言。學(xué)習(xí)了如何安裝Python以及各種工具采盒。我們還學(xué)習(xí)了Python解釋器以及如何使用它旧乞。我們學(xué)習(xí)了Python支持的數(shù)據(jù)類型、變量纽甘、數(shù)值和字符串良蛮、決策制定語(yǔ)句和Python中的循環(huán)語(yǔ)句。我們還學(xué)習(xí)了函數(shù)以及如何在腳本中使用函數(shù)悍赢,模塊以及如何創(chuàng)建和導(dǎo)入模塊决瞳。
在下一章Python腳本調(diào)試和性能測(cè)試中,我們將學(xué)習(xí)Python的調(diào)試技巧左权、錯(cuò)誤處理(異常處理)皮胡、調(diào)試器工具、調(diào)試基本的程序崩潰赏迟、程序性能和用時(shí)測(cè)試以及加快程序運(yùn)行屡贺。
??? 第二章 Python腳本調(diào)試和性能測(cè)試
問(wèn)題
- 什么是迭代器和生成器?
- 列表是否可變眉孩?
- Python中的數(shù)據(jù)結(jié)構(gòu)是什么纹笼?
- 如何說(shuō)列表中的值数苫?
- 什么是模塊丐重?
擴(kuò)展閱讀
Python的所有文檔可通過(guò)官方網(wǎng)站獲取。
還可以閱讀如下圖書(shū):Learn Python Hard Way和Byte of Python來(lái)學(xué)習(xí) Python 的基礎(chǔ)知識(shí)丑罪。
本文首發(fā)地址:Alan Hou 的個(gè)人博客