全文分為兩大部分繁莹,分別是Python基礎(chǔ)語(yǔ)法和面向?qū)ο蟆?/p>
第一部分 Python基礎(chǔ)語(yǔ)法
第一部分 Python基礎(chǔ)語(yǔ)法
1. 認(rèn)識(shí)Python
1.1 Python 簡(jiǎn)介
Python 的創(chuàng)始人為吉多·范羅蘇姆(Guido van Rossum)。
Python 的設(shè)計(jì)目標(biāo):
- 一門(mén)簡(jiǎn)單直觀的語(yǔ)言并與主要競(jìng)爭(zhēng)者一樣強(qiáng)大
- 開(kāi)源淳衙,以便任何人都可以為它做貢獻(xiàn)
- 代碼像純英語(yǔ)那樣容易理解
- 適用于短期開(kāi)發(fā)的日常任務(wù)
Python 的設(shè)計(jì)哲學(xué):
- 優(yōu)雅、明確饺著、簡(jiǎn)單
Python 開(kāi)發(fā)者的哲學(xué)是:用一種方法箫攀,最好是只有一種方法來(lái)做一件事
Python 是完全面向?qū)ο蟮恼Z(yǔ)言,在 Python 中一切皆對(duì)象幼衰。
可擴(kuò)展性:如果需要一段關(guān)鍵代碼運(yùn)行得更快或者希望某些算法不公開(kāi)靴跛,可以把這部分程序用 C 或 C++ 編寫(xiě),然后在 Python 程序中使用它們渡嚣。
1.2. 第一個(gè)Python程序
執(zhí)行 Python 程序的三種方式:
解釋器梢睛、交互式運(yùn)行、IDE運(yùn)行
Python 是一個(gè)格式非常嚴(yán)格的程序設(shè)計(jì)語(yǔ)言识椰。
python 2.x 默認(rèn)不支持中文绝葡。
- ASCII 字符只包含 256 個(gè)字符,不支持中文
- Python 2.x 的解釋器名稱是 python
- Python 3.x 的解釋器名稱是 python3
為了照顧現(xiàn)有的程序腹鹉,官方提供了一個(gè)過(guò)渡版本 —— Python 2.6藏畅。
提示:如果開(kāi)發(fā)時(shí),無(wú)法立即使用 Python 3.0(還有極少的第三方庫(kù)不支持 3.0 的語(yǔ)法)种蘸,建議
- 先使用 Python 3.0 版本進(jìn)行開(kāi)發(fā)
- 然后使用 Python 2.6墓赴、Python 2.7 來(lái)執(zhí)行竞膳,并且做一些兼容性的處理
IPython 是一個(gè) python 的 交互式 shell,比默認(rèn)的 python shell 好用得多诫硕,它支持 bash shell 命令坦辟,適合于學(xué)習(xí)/驗(yàn)證 Python 語(yǔ)法或者局部代碼。
集成開(kāi)發(fā)環(huán)境(IDE章办,Integrated Development Environment)—— 集成了開(kāi)發(fā)軟件需要的所有工具锉走,一般包括以下工具:
- 圖形用戶界面
- 代碼編輯器(支持 代碼補(bǔ)全/自動(dòng)縮進(jìn))
- 編譯器/解釋器
- 調(diào)試器(斷點(diǎn)/單步執(zhí)行)
- ……
PyCharm 是 Python 的一款非常優(yōu)秀的集成開(kāi)發(fā)環(huán)境
PyCharm運(yùn)行工具欄
1.3. PyCharm 的設(shè)置
PyCharm 的 配置信息 是保存在 用戶家目錄下 的 .PyCharmxxxx.x 目錄下的挪蹭,xxxx.x 表示當(dāng)前使用的 PyCharm 的版本號(hào)
1.3.1 恢復(fù) PyCharm 的初始設(shè)置:
- 關(guān)閉正在運(yùn)行的 PyCharm
- 在終端中執(zhí)行以下終端命令,刪除 PyCharm 的配置信息目錄:
$ rm -r ~/.PyCharm2016.3
- 重新啟動(dòng) PyCharm
1.3.2 PyCharm 安裝和啟動(dòng)步驟:
- 執(zhí)行以下終端命令休偶,解壓縮下載后的安裝包
$ tar -zxvf pycharm-professional-2017.1.3.tar.gz
- 將解壓縮后的目錄移動(dòng)到 /opt 目錄下梁厉,可以方便其他用戶使用
> /opt 目錄用戶存放給主機(jī)額外安裝的軟件
/opt 目錄用戶存放給主機(jī)額外安裝的軟件
$ sudo mv pycharm-2017.1.3/ /opt/
- 切換工作目錄
$ cd /opt/pycharm-2017.1.3/bin
- 啟動(dòng) PyCharm
$ ./pycharm.sh
1.3.3 設(shè)置啟動(dòng)圖標(biāo)
- 在專業(yè)版中,選擇菜單 Tools / Create Desktop Entry... 可以設(shè)置任務(wù)欄啟動(dòng)圖標(biāo)
- 注意:設(shè)置圖標(biāo)時(shí)踏兜,需要勾選 Create the entry for all users
- 快捷方式文件
- /usr/share/applications/jetbrains-pycharm.desktop
> 在 ubuntu 中词顾,應(yīng)用程序啟動(dòng)的快捷方式通常都保存在 /usr/share/applications 目錄下
1.3.4 卸載之前版本的 PyCharm
要卸載 PyCharm 只需要做以下兩步工作:
- 刪除解壓縮目錄
$ sudo rm -r /opt/pycharm-2016.3.1/
- 刪除家目錄下用于保存配置信息的隱藏目錄
$ rm -r ~/.PyCharm2016.3/
如果不再使用 PyCharm 還需要將 /usr/share/applications/ 下的 jetbrains-pycharm.desktop 刪掉
1.4. 多文件項(xiàng)目的演練
- 開(kāi)發(fā) 項(xiàng)目 就是開(kāi)發(fā)一個(gè) 專門(mén)解決一個(gè)復(fù)雜業(yè)務(wù)功能的軟件
- 通常每 一個(gè)項(xiàng)目 就具有一個(gè) 獨(dú)立專屬的目錄,用于保存 所有和項(xiàng)目相關(guān)的文件
- 在 PyCharm 中碱妆,要想讓哪一個(gè) Python 程序能夠執(zhí)行肉盹,必須首先通過(guò) 鼠標(biāo)右鍵的方式執(zhí)行 一下
- 對(duì)于初學(xué)者而言,在一個(gè)項(xiàng)目中設(shè)置多個(gè)程序可以執(zhí)行疹尾,是非常方便的上忍,可以方便對(duì)不同知識(shí)點(diǎn)的練習(xí)和測(cè)試
- 對(duì)于商業(yè)項(xiàng)目而言,通常在一個(gè)項(xiàng)目中纳本,只有一個(gè) 可以直接執(zhí)行的 Python 源程序
讓選中的程序可以執(zhí)行
2. 注釋
- 注釋的作用
- 使用用自己熟悉的語(yǔ)言,在程序中對(duì)某些代碼進(jìn)行標(biāo)注說(shuō)明繁成,增強(qiáng)程序的可讀性
2.1 單行注釋(行注釋)
- 以 # 開(kāi)頭它抱,# 右邊的所有東西都被當(dāng)做說(shuō)明文字,而不是真正要執(zhí)行的程序朴艰,只起到輔助說(shuō)明作用
print("hello python") # 輸出 `hello python`
為了保證代碼的可讀性,# 后面建議先添加一個(gè)空格混移,然后再編寫(xiě)相應(yīng)的說(shuō)明文字祠墅;為了保證代碼的可讀性,注釋和代碼之間 至少要有 兩個(gè)空格歌径。
> 為了保證代碼的可讀性毁嗦,# 后面建議先添加一個(gè)空格,然后再編寫(xiě)相應(yīng)的說(shuō)明文字回铛;為了保證代碼的可讀性狗准,注釋和代碼之間 至少要有 兩個(gè)空格克锣。
2.2 多行注釋(塊注釋)
- 要在 Python 程序中使用多行注釋,可以用 一對(duì) 連續(xù)的 三個(gè) 引號(hào)(單引號(hào)和雙引號(hào)都可以)
"""
這是一個(gè)多行注釋
在多行注釋之間腔长,可以寫(xiě)很多很多的內(nèi)容……
"""
print("hello python")
提示:
- 注釋不是越多越好袭祟,對(duì)于一目了然的代碼,不需要添加注釋
- 對(duì)于 復(fù)雜的操作捞附,應(yīng)該在操作開(kāi)始前寫(xiě)上若干行注釋
- 對(duì)于 不是一目了然的代碼巾乳,應(yīng)在其行尾添加注釋(為了提高可讀性,注釋?xiě)?yīng)該至少離開(kāi)代碼 2 個(gè)空格)
- 絕不要描述代碼鸟召,假設(shè)閱讀代碼的人比你更懂 Python胆绊,他只是不知道你的代碼要做什么
2.3 代碼規(guī)范:
- Python 官方提供有一系列 PEP(Python Enhancement Proposals) 文檔,其中第 8 篇文檔專門(mén)針對(duì) Python 的代碼格式 給出了建議欧募,也就是俗稱的 PEP 8:
- 文檔地址:https://www.python.org/dev/peps/pep-0008/
- 谷歌有對(duì)應(yīng)的中文文檔:http://zh-google-styleguide.readthedocs.io/en/latest/google-python-styleguide/python_style_rules/
3. 運(yùn)算符
3.1 算數(shù)運(yùn)算符
是完成基本的算術(shù)運(yùn)算使用的符號(hào)压状,用來(lái)處理四則運(yùn)算,而“+”和“*”還可以用來(lái)處理字符串跟继。
運(yùn)算符 描述 實(shí)例 + 加 10 + 20 = 30 - 減 10 - 20 = -10 * 乘 10 * 20 = 200 / 除 10 / 20 = 0.5 // 取整除 返回除法的整數(shù)部分(商) 9 // 2 輸出結(jié)果 4 % 取余數(shù) 返回除法的余數(shù) 9 % 2 = 1 ** 冪 又稱次方种冬、乘方,2 ** 3 = 8 3.2 比較(關(guān)系)運(yùn)算符
- 運(yùn)算符 描述 == 檢查兩個(gè)操作數(shù)的值是否 相等还栓,如果是碌廓,則條件成立,返回 True != 檢查兩個(gè)操作數(shù)的值是否 不相等剩盒,如果是谷婆,則條件成立,返回 True > 檢查左操作數(shù)的值是否 大于 右操作數(shù)的值辽聊,如果是纪挎,則條件成立,返回 True < 檢查左操作數(shù)的值是否 小于 右操作數(shù)的值跟匆,如果是异袄,則條件成立,返回 True >= 檢查左操作數(shù)的值是否 大于或等于 右操作數(shù)的值玛臂,如果是烤蜕,則條件成立,返回 True <= 檢查左操作數(shù)的值是否 小于或等于 右操作數(shù)的值迹冤,如果是讽营,則條件成立,返回 True Python 2.x 中判斷 不等于 還可以使用 <> 運(yùn)算符
- != 在 Python 2.x 中同樣可以用來(lái)判斷 不等于
3.3 賦值運(yùn)算符
- 在 Python 中泡徙,使用 = 可以給變量賦值橱鹏。在算術(shù)運(yùn)算時(shí),為了簡(jiǎn)化代碼的編寫(xiě),Python 還提供了一系列的 與 算術(shù)運(yùn)算符 對(duì)應(yīng)的 賦值運(yùn)算符莉兰,注意:賦值運(yùn)算符中間不能使用空格挑围。
運(yùn)算符 描述 實(shí)例 = 簡(jiǎn)單的賦值運(yùn)算符 c = a + b 將 a + b 的運(yùn)算結(jié)果賦值為 c += 加法賦值運(yùn)算符 c += a 等效于 c = c + a -= 減法賦值運(yùn)算符 c -= a 等效于 c = c - a *= 乘法賦值運(yùn)算符 c *= a 等效于 c = c * a /= 除法賦值運(yùn)算符 c /= a 等效于 c = c / a //= 取整除賦值運(yùn)算符 c //= a 等效于 c = c // a %= 取 模 (余數(shù))賦值運(yùn)算符 c %= a 等效于 c = c % a **= 冪賦值運(yùn)算符 c **= a 等效于 c = c ** a 3.4 身份運(yùn)算符
身份運(yùn)算符比較兩個(gè)對(duì)象的內(nèi)存位置。常用的有兩個(gè)身份運(yùn)算符糖荒,如下所述:
運(yùn)算符 描述 示例 is 判斷兩個(gè)標(biāo)識(shí)符是不是引用同一個(gè)對(duì)象 x is y杉辙,類似 id(x) == id(y) is not 判斷兩個(gè)標(biāo)識(shí)符是不是引用不同對(duì)象 x is not y,類似 id(a) != id(b) 辨析
- is 用于判斷 兩個(gè)變量引用的對(duì)象是否為同一個(gè)
- == 用于判斷 引用變量的值 是否相等
3.5 成員運(yùn)算符
Python成員運(yùn)算符測(cè)試給定值是否為序列中的成員寂嘉。 有兩個(gè)成員運(yùn)算符奏瞬,如下所述:
運(yùn)算符 描述 in 如果在指定的序列中找到一個(gè)變量的值,則返回true泉孩,否則返回false硼端。 not in 如果在指定序列中找不到變量的值,則返回true寓搬,否則返回false珍昨。 3.6 邏輯運(yùn)算符
運(yùn)算符 邏輯表達(dá)式 描述 and x and y 只有 x 和 y 的值都為 True,才會(huì)返回 True<br />否則只要 x 或者 y 有一個(gè)值為 False句喷,就返回 False or x or y 只要 x 或者 y 有一個(gè)值為 True镣典,就返回 True<br />只有 x 和 y 的值都為 False,才會(huì)返回 False not not x 如果 x 為 True唾琼,返回 False<br />如果 x 為 False兄春,返回 True 3.7 運(yùn)算符優(yōu)先級(jí)
- 以下表格的算數(shù)優(yōu)先級(jí)由高到最低順序排列:
運(yùn)算符 描述 ** 冪 (最高優(yōu)先級(jí)) * / % // 乘、除锡溯、取余數(shù)赶舆、取整除 + - 加法、減法 <= < > >= 比較運(yùn)算符 == != 等于運(yùn)算符 = %= /= //= -= += *= **= 賦值運(yùn)算符 is is not 身份運(yùn)算符 in not in 成員運(yùn)算符 not or and 邏輯運(yùn)算符 <補(bǔ)>程序執(zhí)行原理
Python程序執(zhí)行示意圖
- 操作系統(tǒng)會(huì)首先讓 CPU 把 Python 解釋器 的程序復(fù)制到 內(nèi)存 中
- Python 解釋器 根據(jù)語(yǔ)法規(guī)則芜茵,從上向下 讓 CPU 翻譯 Python 程序中的代碼
- CPU 負(fù)責(zé)執(zhí)行翻譯完成的代碼
Python 的解釋器有多大?
- 執(zhí)行以下終端命令可以查看 Python 解釋器的大小
# 1. 確認(rèn)解釋器所在位置
$ which python
# 2. 查看 python 文件大小(只是一個(gè)軟鏈接)
$ ls -lh /usr/bin/python
# 3. 查看具體文件大小
$ ls -lh /usr/bin/python2.7
4. 變量
4.1 變量定義
- 在 Python 中倡蝙,每個(gè)變量 在使用前都必須賦值九串,變量 賦值以后 該變量 才會(huì)被創(chuàng)建
- 可以用 其他變量的計(jì)算結(jié)果 來(lái)定義變量
- 變量名 只有在 第一次出現(xiàn) 才是 定義變量
變量名 = 值
使用交互式方式,如果要查看變量?jī)?nèi)容寺鸥,直接輸入變量名即可猪钮,不需要使用 print 函數(shù)
使用解釋器執(zhí)行,如果要輸出變量的內(nèi)容胆建,必須要要使用 print 函數(shù)
4.2 變量的類型
- 在 Python 中定義變量是 不需要指定類型(在其他很多高級(jí)語(yǔ)言中都需要)躬贡,Python 可以根據(jù) = 等號(hào)右側(cè)的值,自動(dòng)推導(dǎo)出變量中存儲(chǔ)數(shù)據(jù)的類型
- 數(shù)據(jù)類型可以分為 數(shù)字型 和 非數(shù)字型數(shù)字型
- 整型 (int):Python3中的所有整數(shù)都表示為長(zhǎng)整數(shù)眼坏。 因此,長(zhǎng)整數(shù)沒(méi)有單獨(dú)的數(shù)字類型。
- 浮點(diǎn)型(float)
- 布爾型(bool) :真 True 非 0 數(shù) —— 非零即真宰译,假 False 0檐蚜。
- 復(fù)數(shù)型 (complex):復(fù)數(shù)是由x + yj表示的有序?qū)Φ膶?shí)數(shù)浮點(diǎn)數(shù)組成,其中x和y是實(shí)數(shù)沿侈,j是虛數(shù)單位闯第。
- 非數(shù)字型:有些運(yùn)算符還支持這些數(shù)據(jù)類型,詳見(jiàn)4.4.5.3 運(yùn)算符缀拭。
- 字符串(str):加號(hào)(+)是字符串連接運(yùn)算符咳短,星號(hào)(*)是重復(fù)運(yùn)算符。
- 列表(list)
- 元組(tuple)
- 字典(dict)
提示:在 Python 2.x 中蛛淋,整數(shù) 根據(jù)保存數(shù)值的長(zhǎng)度還分為:
- int(整數(shù))
- long(長(zhǎng)整數(shù))
- 使用 type 函數(shù)可以查看一個(gè)變量的類型
type(name)
<補(bǔ)>不同類型變量之間的計(jì)算
- 數(shù)字型變量 之間可以直接計(jì)算
- 在 Python 中咙好,兩個(gè)數(shù)字型變量是可以直接進(jìn)行 算數(shù)運(yùn)算的
- 如果變量是 bool 型,在計(jì)算時(shí)
- True 對(duì)應(yīng)的數(shù)字是 1
- False 對(duì)應(yīng)的數(shù)字是 0
- 字符串變量 之間使用 + 拼接字符串
- 字符串變量 可以和 整數(shù) 使用 * 重復(fù)拼接相同的字符串
- 數(shù)字型變量 和 字符串 之間 不能進(jìn)行其他計(jì)算
<補(bǔ)>從鍵盤(pán)獲取輸入信息:input
- 在 Python 中可以使用 input 函數(shù)從鍵盤(pán)等待用戶的輸入
- 用戶輸入的 任何內(nèi)容 Python 都認(rèn)為是一個(gè) 字符串
字符串變量 = input("提示信息:")
<補(bǔ)>類型轉(zhuǎn)換函數(shù)
函數(shù) 說(shuō)明 int(x) 將 x 轉(zhuǎn)換為一個(gè)整數(shù) float(x) 將 x 轉(zhuǎn)換到一個(gè)浮點(diǎn)數(shù) str(x) 將對(duì)象x轉(zhuǎn)換為字符串表示形式 tuple(s) 將s轉(zhuǎn)換為元組 list(s) 將s轉(zhuǎn)換為列表 price = float(input("請(qǐng)輸入價(jià)格:"))
<補(bǔ)>格式化輸出:print
- 如果希望輸出文字信息的同時(shí)褐荷,一起輸出 數(shù)據(jù)勾效,就需要使用到 格式化操作符
- % 被稱為 格式化操作符,專門(mén)用于處理字符串中的格式
- 包含 % 的字符串叛甫,被稱為 格式化字符串
- % 和不同的 字符 連用层宫,不同類型的數(shù)據(jù) 需要使用 不同的格式化字符
- 格式化字符 含義 %s 字符串 %d 有符號(hào)十進(jìn)制整數(shù),%06d 表示輸出的整數(shù)顯示位數(shù)其监,不足的地方使用 0 補(bǔ)全 %f 浮點(diǎn)數(shù)萌腿,%.2f 表示小數(shù)點(diǎn)后只顯示兩位 %% 輸出 % 語(yǔ)法格式如下:
print("格式化字符串" % 變量1)
print("格式化字符串" % (變量1, 變量2...))
4.3 變量的命名
4.3.1 標(biāo)識(shí)符和關(guān)鍵字
標(biāo)示符就是程序員定義的 變量名、函數(shù)名
- 標(biāo)示符可以由 字母抖苦、下劃線 和 數(shù)字 組成
- 不能以數(shù)字開(kāi)頭
- 不能與關(guān)鍵字重名
關(guān)鍵字 就是在 Python 內(nèi)部已經(jīng)使用的標(biāo)識(shí)符
- 關(guān)鍵字 具有特殊的功能和含義
- 開(kāi)發(fā)者 不允許定義和關(guān)鍵字相同的名字的標(biāo)識(shí)符
- 通過(guò)以下命令可以查看 Python 中的關(guān)鍵字
In [1]: import keyword
In [2]: print(keyword.kwlist)
4.3.2 變量的命名規(guī)則
命名規(guī)則 可以被視為一種 慣例毁菱,并無(wú)絕對(duì)與強(qiáng)制
目的是為了 增加代碼的識(shí)別和可讀性
注意 Python 中的 標(biāo)識(shí)符 是 區(qū)分大小寫(xiě)的
- 在定義變量時(shí),為了保證代碼格式睛约,= 的左右應(yīng)該各保留一個(gè)空格
- 在 Python 中鼎俘,如果 變量名 需要由 二個(gè) 或 多個(gè)單詞 組成時(shí),可以按照以下方式命名:每個(gè)單詞都使用小寫(xiě)字母辩涝,單詞與單詞之間使用 _下劃線 連接贸伐,例如:first_name、last_name怔揩、qq_number捉邢、qq_password。
當(dāng)然商膊,還有駝峰命名法:
小駝峰式命名法:第一個(gè)單詞以小寫(xiě)字母開(kāi)始伏伐,后續(xù)單詞的首字母大寫(xiě),例如:firstName晕拆、lastName藐翎。
大駝峰式命名法,每一個(gè)單詞的首字母都采用大寫(xiě)字母,例如:FirstName吝镣、LastName堤器、CamelCase 。
4.4 高級(jí)變量類型
在 Python 中末贾,所有 非數(shù)字型變量 都支持以下特點(diǎn):
1. 都是一個(gè) 序列 sequence闸溃,也可以理解為 容器
取值 []
遍歷 for in
計(jì)算長(zhǎng)度len、最大/最小值max/min拱撵、比較辉川、刪除del
鏈接 + 和 重復(fù) *
切片
4.4.1 列表(list)
- List(列表) 是 Python 中使用 最頻繁 的數(shù)據(jù)類型,在其他語(yǔ)言中通常叫做 數(shù)組拴测,專門(mén)用于存儲(chǔ) 一串 信息乓旗,列表用 [] 定義,數(shù)據(jù) 之間使用 , 分隔昼扛,列表的 索引 從 0 開(kāi)始寸齐。
索引 就是數(shù)據(jù)在 列表 中的位置編號(hào),索引 又可以被稱為 下標(biāo)
注意:從列表中取值時(shí)抄谐,如果 超出索引范圍渺鹦,程序會(huì)報(bào)錯(cuò)
name_list = ["zhangsan", "lisi", "wangwu"]
列表示意圖
<補(bǔ)>del 關(guān)鍵字
- 使用 del 關(guān)鍵字(delete) 同樣可以刪除列表中元素
- del 關(guān)鍵字本質(zhì)上是用來(lái) 將一個(gè)變量從內(nèi)存中刪除的
- 如果使用 del 關(guān)鍵字將變量從內(nèi)存中刪除蛹含,后續(xù)的代碼就不能再使用這個(gè)變量了
In [1]: l = [1,2,3,4]
In [2]: del l[1]
In [3]: l[1]
Out[3]: 3
在日常開(kāi)發(fā)中毅厚,要從列表刪除數(shù)據(jù),建議 使用列表提供的方法
<補(bǔ)>函數(shù)與方法
- 函數(shù) 封裝了獨(dú)立功能浦箱,可以直接調(diào)用
函數(shù)名(參數(shù))
函數(shù)需要死記硬背
- 方法 和函數(shù)類似吸耿,同樣是封裝了獨(dú)立的功能
- 方法 需要通過(guò) 對(duì)象 來(lái)調(diào)用,表示針對(duì)這個(gè) 對(duì)象 要做的操作
對(duì)象.方法名(參數(shù))
在變量后面輸入 .酷窥,然后選擇針對(duì)這個(gè)變量要執(zhí)行的操作咽安,記憶起來(lái)比函數(shù)要簡(jiǎn)單很多
<補(bǔ)>循環(huán)遍歷
- 遍歷 就是 從頭到尾 依次 從 列表 中獲取數(shù)據(jù),在 循環(huán)體內(nèi)部 針對(duì) 每一個(gè)元素蓬推,執(zhí)行相同的操作妆棒。
- 在 Python 中為了提高列表的遍歷效率,使用 for 就能夠?qū)崿F(xiàn)迭代遍歷沸伏。
# for 循環(huán)內(nèi)部使用的變量 in 列表
for name in name_list:
循環(huán)內(nèi)部針對(duì)列表元素進(jìn)行操作
print(name)
for-in循環(huán)流程圖
- 盡管 Python 的 列表 中可以 存儲(chǔ)不同類型的數(shù)據(jù)
- 但是在開(kāi)發(fā)中,更多的應(yīng)用場(chǎng)景是
- 列表 存儲(chǔ)相同類型的數(shù)據(jù)
- 通過(guò) 迭代遍歷毅糟,在循環(huán)體內(nèi)部红选,針對(duì)列表中的每一項(xiàng)元素,執(zhí)行相同的操作
4.4.2 元組(tuple)
- Tuple(元組)與列表類似姆另,不同之處在于元組的 元素不能修改元組 表示多個(gè)元素組成的序列
- 元組 在 Python 開(kāi)發(fā)中喇肋,有特定的應(yīng)用場(chǎng)景
- 用于存儲(chǔ) 一串 信息坟乾,數(shù)據(jù) 之間使用 , 分隔
- 元組用 () 定義,元組的 索引 從 0 開(kāi)始苟蹈,索引 就是數(shù)據(jù)在 元組 中的位置編號(hào)糊渊。
info_tuple = ("zhangsan", 18, 1.75)
創(chuàng)建空元組:
info_tuple = ()
元組中 只包含一個(gè)元素 時(shí),需要 在元素后面添加逗號(hào):
info_tuple = (50, )
元組示意圖
- 在 Python 中,可以使用 for 循環(huán)遍歷所有非數(shù)字型類型的變量:列表贺喝、元組菱鸥、字典以及 字符串
- 提示:在實(shí)際開(kāi)發(fā)中,除非 能夠確認(rèn)元組中的數(shù)據(jù)類型躏鱼,否則針對(duì)元組的循環(huán)遍歷需求并不是很多
- 在開(kāi)發(fā)中氮采,更多的應(yīng)用場(chǎng)景是:
- 函數(shù)的 參數(shù) 和 返回值,一個(gè)函數(shù)可以接收 任意多個(gè)參數(shù)染苛,或者 一次返回多個(gè)數(shù)據(jù)
- 格式字符串鹊漠,格式化字符串后面的 () 本質(zhì)上就是一個(gè)元組
- 讓列表不可以被修改,以保護(hù)數(shù)據(jù)安全
<補(bǔ)>元組和列表之間的轉(zhuǎn)換
- 使用 list 函數(shù)可以把元組轉(zhuǎn)換成列表
list(元組)
- 使用 tuple 函數(shù)可以把列表轉(zhuǎn)換成元組
tuple(列表)
4.4.3 字典(dict)
dict(字典) 是 除列表以外 Python 之中 最靈活 的數(shù)據(jù)類型茶行。
字典同樣可以用來(lái) 存儲(chǔ)多個(gè)數(shù)據(jù)躯概,通常用于存儲(chǔ) 描述一個(gè) 物體 的相關(guān)信息
- 和列表的區(qū)別:
- 列表 是 有序 的對(duì)象集合
- 字典 是 無(wú)序 的對(duì)象集合
- 字典用 {} 定義。
- 字典使用 鍵值對(duì) 存儲(chǔ)數(shù)據(jù)畔师,鍵值對(duì)之間使用逗號(hào) , 分隔:
- 鍵 key 是索引
- 值 value 是數(shù)據(jù)
- 鍵 和 值 之間使用冒號(hào) : 分隔
- 鍵必須是唯一的
- 值 可以取任何數(shù)據(jù)類型娶靡,但 鍵 只能使用 字符串、數(shù)字或 元組
xiaoming = {"name": "小明",
"age": 18,
"gender": True,
"height": 1.75}
字典示意圖
- 字典的遍歷 就是 依次 從 字典 中獲取所有鍵值對(duì):
# for 循環(huán)內(nèi)部使用的 `key 的變量` in 字典
for k in xiaoming:
print("%s: %s" % (k, xiaoming[k]))
提示:在實(shí)際開(kāi)發(fā)中姿锭,由于字典中每一個(gè)鍵值對(duì)保存數(shù)據(jù)的類型是不同的,所以針對(duì)字典的循環(huán)遍歷需求并不是很多
- 盡管可以使用 for in 遍歷 字典
- 但是在開(kāi)發(fā)中伯铣,更多的應(yīng)用場(chǎng)景是:
- 使用 多個(gè)鍵值對(duì)呻此,存儲(chǔ) 描述一個(gè) 物體 的相關(guān)信息 —— 描述更復(fù)雜的數(shù)據(jù)信息
- 將 多個(gè)字典 放在 一個(gè)列表 中,再進(jìn)行遍歷腔寡,在循環(huán)體內(nèi)部針對(duì)每一個(gè)字典進(jìn)行 相同的處理
card_list = [{"name": "張三",
"qq": "12345",
"phone": "110"},
{"name": "李四",
"qq": "54321",
"phone": "10086"}
]
4.4.4 字符串(str)
- 字符串 就是 一串字符焚鲜,是編程語(yǔ)言中表示文本的數(shù)據(jù)類型
- 在 Python 中可以使用 一對(duì)雙引號(hào) " 或者 一對(duì)單引號(hào) ' 定義一個(gè)字符串
- 雖然可以使用 " 或者 ' 做字符串的轉(zhuǎn)義,但是在實(shí)際開(kāi)發(fā)中:
- 如果字符串內(nèi)部需要使用 "蹬蚁,可以使用 ' 定義字符串
- 如果字符串內(nèi)部需要使用 '恃泪,可以使用 " 定義字符串
- 可以使用 索引 獲取一個(gè)字符串中 指定位置的字符,索引計(jì)數(shù)從 0 開(kāi)始
- 也可以使用 for 循環(huán)遍歷 字符串中每一個(gè)字符
大多數(shù)編程語(yǔ)言都是用 " 來(lái)定義字符串
string = "Hello Python"
for c in string:
print(c)
字符串示意圖
提示:在 python 中對(duì)字符串操作贝乎,內(nèi)置提供的方法足夠多,使得在開(kāi)發(fā)時(shí)叽粹,能夠針對(duì)字符串進(jìn)行更加靈活的操作览效!應(yīng)對(duì)更多的開(kāi)發(fā)需求却舀!
- 判斷類型 - 9
方法 說(shuō)明 string.isspace() 如果 string 中只包含空格,則返回 True string.isalnum() 如果 string 至少有一個(gè)字符并且所有字符都是字母或數(shù)字則返回 True string.isalpha() 如果 string 至少有一個(gè)字符并且所有字符都是字母則返回 True string.isdecimal() 如果 string 只包含數(shù)字則返回 True锤灿,全角數(shù)字 string.isdigit() 如果 string 只包含數(shù)字則返回 True挽拔,全角數(shù)字、⑴但校、\u00b2 string.isnumeric() 如果 string 只包含數(shù)字則返回 True螃诅,全角數(shù)字,漢字?jǐn)?shù)字 string.istitle() 如果 string 是標(biāo)題化的(每個(gè)單詞的首字母大寫(xiě))則返回 True string.islower() 如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符状囱,并且所有這些(區(qū)分大小寫(xiě)的)字符都是小寫(xiě)术裸,則返回 True string.isupper() 如果 string 中包含至少一個(gè)區(qū)分大小寫(xiě)的字符,并且所有這些(區(qū)分大小寫(xiě)的)字符都是大寫(xiě)亭枷,則返回 True 2) 查找和替換 - 7
方法 說(shuō)明 string.startswith(str) 檢查字符串是否是以 str 開(kāi)頭袭艺,是則返回 True string.endswith(str) 檢查字符串是否是以 str 結(jié)束,是則返回 True string.find(str, start=0, end=len(string)) 檢測(cè) str 是否包含在 string 中叨粘,如果 start 和 end 指定范圍猾编,則檢查是否包含在指定范圍內(nèi),如果是返回開(kāi)始的索引值升敲,否則返回 -1 string.rfind(str, start=0, end=len(string)) 類似于 find()答倡,不過(guò)是從右邊開(kāi)始查找 string.index(str, start=0, end=len(string)) 跟 find() 方法類似,不過(guò)如果 str 不在 string 會(huì)報(bào)錯(cuò) string.rindex(str, start=0, end=len(string)) 類似于 index()冻晤,不過(guò)是從右邊開(kāi)始 string.replace(old_str, new_str, num=string.count(old)) 把 string 中的 old_str 替換成 new_str苇羡,如果 num 指定,則替換不超過(guò) num 次 3) 大小寫(xiě)轉(zhuǎn)換 - 5
方法 說(shuō)明 string.capitalize() 把字符串的第一個(gè)字符大寫(xiě) string.title() 把字符串的每個(gè)單詞首字母大寫(xiě) string.lower() 轉(zhuǎn)換 string 中所有大寫(xiě)字符為小寫(xiě) string.upper() 轉(zhuǎn)換 string 中的小寫(xiě)字母為大寫(xiě) string.swapcase() 翻轉(zhuǎn) string 中的大小寫(xiě) 4) 文本對(duì)齊 - 3
方法 說(shuō)明 string.ljust(width) 返回一個(gè)原字符串左對(duì)齊鼻弧,并使用空格填充至長(zhǎng)度 width 的新字符串 string.rjust(width) 返回一個(gè)原字符串右對(duì)齊设江,并使用空格填充至長(zhǎng)度 width 的新字符串 string.center(width) 返回一個(gè)原字符串居中,并使用空格填充至長(zhǎng)度 width 的新字符串 5) 去除空白字符 - 3
方法 說(shuō)明 string.lstrip() 截掉 string 左邊(開(kāi)始)的空白字符 string.rstrip() 截掉 string 右邊(末尾)的空白字符 string.strip() 截掉 string 左右兩邊的空白字符 6) 拆分和連接 - 5
方法 說(shuō)明 string.partition(str) 把字符串 string 分成一個(gè) 3 元素的元組 (str前面, str, str后面) string.rpartition(str) 類似于 partition() 方法攘轩,不過(guò)是從右邊開(kāi)始查找 string.split(str="", num) 以 str 為分隔符拆分 string叉存,如果 num 有指定值,則僅分隔 num + 1 個(gè)子字符串度帮,str 默認(rèn)包含 '\r', '\t', '\n' 和空格 string.splitlines() 按照行('\r', '\n', '\r\n')分隔歼捏,返回一個(gè)包含各行作為元素的列表 string.join(seq) 以 string 作為分隔符,將 seq 中所有的元素(的字符串表示)合并為一個(gè)新的字符串 <補(bǔ)>字符串的切片
- 切片 方法適用于 字符串笨篷、列表瞳秽、元組切片 使用 索引值 來(lái)限定范圍,從一個(gè)大的 字符串 中 切出 小的 字符串
- 列表 和 元組 都是 有序 的集合率翅,都能夠 通過(guò)索引值 獲取到對(duì)應(yīng)的數(shù)據(jù)
- 字典 是一個(gè) 無(wú)序 的集合练俐,是使用 鍵值對(duì) 保存數(shù)據(jù)
字符串索引示意圖
字符串[開(kāi)始索引:結(jié)束索引:步長(zhǎng)]
注意:
- 指定的區(qū)間屬于 左閉右開(kāi) 型 [開(kāi)始索引, 結(jié)束索引) => 開(kāi)始索引 <= 范圍 < 結(jié)束索引從 起始 位開(kāi)始冕臭,到 結(jié)束位的前一位 結(jié)束(不包含結(jié)束位本身)
- 從頭開(kāi)始腺晾,開(kāi)始索引 數(shù)字可以省略燕锥,冒號(hào)不能省略
- 到末尾結(jié)束,結(jié)束索引 數(shù)字可以省略悯蝉,冒號(hào)不能省略
- 步長(zhǎng)默認(rèn)為 1归形,如果連續(xù)切片,數(shù)字和冒號(hào)都可以省略
<補(bǔ)>索引的順序和倒序
- 在 Python 中不僅支持 順序索引鼻由,同時(shí)還支持 倒序索引
- 所謂倒序索引就是 從右向左 計(jì)算索引:最右邊的索引值是 -1暇榴,依次遞減。
num_str = "0123456789"
# 1. 截取從 2 ~ 5 位置 的字符串
print(num_str[2:6])
# 2. 截取從 2 ~ `末尾` 的字符串
print(num_str[2:])
# 3. 截取從 `開(kāi)始` ~ 5 位置 的字符串
print(num_str[:6])
# 4. 截取完整的字符串
print(num_str[:])
# 5. 從開(kāi)始位置蕉世,每隔一個(gè)字符截取字符串
print(num_str[::2])
# 6. 從索引 1 開(kāi)始跺撼,每隔一個(gè)取一個(gè)
print(num_str[1::2])
# 倒序切片
# -1 表示倒數(shù)第一個(gè)字符
print(num_str[-1])
# 7. 截取從 2 ~ `末尾 - 1` 的字符串
print(num_str[2:-1])
# 8. 截取字符串末尾兩個(gè)字符
print(num_str[-2:])
# 9. 字符串的逆序(面試題)
print(num_str[::-1])
4.4.5 公共方法和變量的高級(jí)應(yīng)用
4.4.5.1 內(nèi)置函數(shù)
Python 包含了以下內(nèi)置函數(shù):
函數(shù) 描述 備注 len(item) 計(jì)算容器中元素個(gè)數(shù)
del(item) 刪除變量 del 有兩種方式 max(item) 返回容器中元素最大值 如果是字典,只針對(duì) key 比較 min(item) 返回容器中元素最小值 如果是字典讨彼,只針對(duì) key 比較 cmp(item1, item2) 比較兩個(gè)值,-1 小于 / 0 相等 / 1 大于 Python 3.x 取消了 cmp 函數(shù) 注意:字符串比較符合以下規(guī)則: "0" < "A" < "a"柿祈。
4.4.5.2 切片
- 描述 Python 表達(dá)式 結(jié)果 支持的數(shù)據(jù)類型 切片 "0123456789"[::-2] "97531" 字符串羞酗、列表券盅、元組 切片 使用 索引值 來(lái)限定范圍,從一個(gè)大的 字符串 中 切出 小的 字符串
- 列表 和 元組 都是 有序 的集合,都能夠 通過(guò)索引值 獲取到對(duì)應(yīng)的數(shù)據(jù)
- 字典 是一個(gè) 無(wú)序 的集合孙蒙,是使用 鍵值對(duì) 保存數(shù)據(jù)
4.4.5.3 運(yùn)算符
運(yùn)算符 Python 表達(dá)式 結(jié)果 描述 支持的數(shù)據(jù)類型 + [1, 2] + [3, 4] [1, 2, 3, 4] 合并 字符串、列表房揭、元組 * ["Hi!"] * 4 ['Hi!', 'Hi!', 'Hi!', 'Hi!'] 重復(fù) 字符串栋豫、列表、元組 in 3 in (1, 2, 3) True 元素是否存在 字符串虚茶、列表戈鲁、元組、字典 not in 4 not in (1, 2, 3) True 元素是否不存在 字符串嘹叫、列表婆殿、元組、字典 > >= == < <= (1, 2, 3) < (2, 2, 3) True 元素比較 字符串罩扇、列表婆芦、元組 注意
- in 在對(duì) 字典 操作時(shí),判斷的是 字典的鍵
- in 和 not in 被稱為 成員運(yùn)算符
4.4.5.4 內(nèi)置函數(shù)完整的 for 循環(huán)語(yǔ)法
- 在 Python 中完整的 for 循環(huán) 的語(yǔ)法如下:
for 變量 in 集合:
循環(huán)體代碼
else:
沒(méi)有通過(guò) break 退出循環(huán)喂饥,循環(huán)結(jié)束后消约,會(huì)執(zhí)行的代碼
應(yīng)用場(chǎng)景:
- 在 迭代遍歷 嵌套的數(shù)據(jù)類型時(shí),例如 一個(gè)列表包含了多個(gè)字典
- 需求:要判斷 某一個(gè)字典中 是否存在 指定的 值
- 如果 存在员帮,提示并且退出循環(huán)
- 如果 不存在或粮,在 循環(huán)整體結(jié)束 后,希望 得到一個(gè)統(tǒng)一的提示
4.4.5.5 變量的引用
- 變量 和 數(shù)據(jù) 都是保存在 內(nèi)存 中的
- 在 Python 中 函數(shù) 的 參數(shù)傳遞 以及 返回值 都是靠 引用 傳遞的
在 Python 中:變量 和 數(shù)據(jù) 是分開(kāi)存儲(chǔ)的集侯,數(shù)據(jù) 保存在內(nèi)存中的一個(gè)位置被啼,變量 中保存著數(shù)據(jù)在內(nèi)存中的地址帜消,就叫做 引用,使用 id() 函數(shù)可以查看變量中保存數(shù)據(jù)所在的 內(nèi)存地址浓体。
注意:如果變量已經(jīng)被定義泡挺,當(dāng)給一個(gè)變量賦值的時(shí)候,本質(zhì)上是 修改了數(shù)據(jù)的引用
- 變量 不再 對(duì)之前的數(shù)據(jù)引用
- 變量 改為 對(duì)新賦值的數(shù)據(jù)引用
在 Python 中命浴,變量的名字類似于 便簽紙 貼在 數(shù)據(jù) 上:
- 定義一個(gè)整數(shù)變量 a娄猫,并且賦值為 1
代碼 圖示 a = 1
- 將變量 a 賦值為 2
代碼 圖示 a = 2
- 定義一個(gè)整數(shù)變量 b,并且將變量 a 的值賦值給 b
代碼 圖示 b = a
在 Python 中悬蔽,函數(shù)的 實(shí)參/返回值 都是是靠 引用 來(lái)傳遞來(lái)的
def test(num):
print("-" * 50)
print("%d 在函數(shù)內(nèi)的內(nèi)存地址是 %x" % (num, id(num)))
result = 100
print("返回值 %d 在內(nèi)存中的地址是 %x" % (result, id(result)))
print("-" * 50)
return result
a = 10
print("調(diào)用函數(shù)前 內(nèi)存地址是 %x" % id(a))
r = test(a)
print("調(diào)用函數(shù)后 實(shí)參內(nèi)存地址是 %x" % id(a))
print("調(diào)用函數(shù)后 返回值內(nèi)存地址是 %x" % id(r))
結(jié)果
4.4.5.6 可變和不可變類型
- 不可變類型捉兴,內(nèi)存中的數(shù)據(jù)不允許被修改:
- 數(shù)字類型 int, bool, float, complex, long(2.x)
- 字符串 str
- 元組 tuple
- 可變類型蝎困,內(nèi)存中的數(shù)據(jù)可以被修改:
- 列表 list
- 字典 dict
注意:字典的 key 只能使用不可變類型的數(shù)據(jù)
注意
- 可變類型的數(shù)據(jù)變化,是通過(guò) 方法 來(lái)實(shí)現(xiàn)的
- 如果給一個(gè)可變類型的變量倍啥,賦值了一個(gè)新的數(shù)據(jù)禾乘,引用會(huì)修改變量 不再 對(duì)之前的數(shù)據(jù)引用
- 變量 改為 對(duì)新賦值的數(shù)據(jù)引用
<補(bǔ)>哈希 (hash)
- Python 中內(nèi)置有一個(gè)名字叫做 hash(o) 的函數(shù):接收一個(gè) 不可變類型 的數(shù)據(jù)作為 參數(shù),返回 結(jié)果是一個(gè) 整數(shù)虽缕。
- 哈希 是一種 算法始藕,其作用就是提取數(shù)據(jù)的 特征碼(指紋),相同的內(nèi)容 得到 相同的結(jié)果氮趋,不同的內(nèi)容 得到 不同的結(jié)果伍派。
- 在 Python 中,設(shè)置字典的 鍵值對(duì) 時(shí)凭峡,會(huì)首先對(duì) key 進(jìn)行 hash 已決定如何在內(nèi)存中保存字典的數(shù)據(jù)拙已,以方便 后續(xù) 對(duì)字典的操作:增、刪摧冀、改倍踪、查:鍵值對(duì)的 key 必須是不可變類型數(shù)據(jù),鍵值對(duì)的 value 可以是任意類型的數(shù)據(jù)索昂。
4.4.5.7 局部變量和全局變量
- 局部變量 是在 函數(shù)內(nèi)部 定義的變量建车,只能在函數(shù)內(nèi)部使用;函數(shù)執(zhí)行結(jié)束后椒惨,函數(shù)內(nèi)部的局部變量缤至,會(huì)被系統(tǒng)回收;不同的函數(shù)康谆,可以定義相同的名字的局部變量领斥,但是 彼此之間 不會(huì)產(chǎn)生影響嫉到;局部變量一般臨時(shí) 保存 函數(shù)內(nèi)部需要使用的數(shù)據(jù)。
- 全局變量 是在 函數(shù)外部定義 的變量(沒(méi)有定義在某一個(gè)函數(shù)內(nèi))月洛,所有函數(shù) 內(nèi)部 都可以使用這個(gè)變量何恶。
提示:在其他的開(kāi)發(fā)語(yǔ)言中,大多 不推薦使用全局變量 —— 可變范圍太大嚼黔,導(dǎo)致程序不好維護(hù)细层!
注意:函數(shù)執(zhí)行時(shí),需要處理變量時(shí) 會(huì):
- 首先 查找 函數(shù)內(nèi)部 是否存在 指定名稱 的局部變量唬涧,如果有疫赎,直接使用
- 如果沒(méi)有,查找 函數(shù)外部 是否存在 指定名稱 的全局變量碎节,如果有捧搞,直接使用
- 如果還沒(méi)有,程序報(bào)錯(cuò)狮荔!
注意:函數(shù)不能直接修改全局變量的引用实牡,如果要修改,必須要用global聲明該變量是全局變量轴合。
num = 10
def demo1():
print("demo1" + "-" * 50)
# global 關(guān)鍵字,告訴 Python 解釋器 num 是一個(gè)全局變量
global num
# 只是定義了一個(gè)局部變量碗短,不會(huì)修改到全局變量受葛,只是變量名相同而已
num = 100
print(num)
def demo2():
print("demo2" + "-" * 50)
print(num)
demo1()
demo2()
print("over")
注意:為了避免局部變量和全局變量出現(xiàn)混淆,在定義全局變量時(shí)偎谁,有些公司會(huì)有一些開(kāi)發(fā)要求总滩,例如:全局變量名前應(yīng)該增加 g_ 或者 gl_ 的前綴。