〇、前言
本文共108張圖蛉谜,流量黨請慎重!
歷時(shí)1個(gè)半月筛武,我把自己學(xué)習(xí)Python基礎(chǔ)知識的框架詳細(xì)梳理了一遍春缕。
一方面,我堅(jiān)信實(shí)踐總是記得牢一些官边,總結(jié)每一個(gè)知識點(diǎn)的時(shí)候我要參考非常多的資料沸手,包括但不僅限于視頻資料、大牛博客注簿、問題交流貼契吉、經(jīng)驗(yàn)分享帖等。因此诡渴,首先我借鑒了許多前人捐晶、大牛的寶貴知識,有些我認(rèn)為講解非常到位的地方也直接照搬過來了妄辩,如果我借鑒的地方給原創(chuàng)帶來了不便惑灵,請隨時(shí)聯(lián)系我,我將再做修改眼耀。我的參考資料已展示在本文文末英支。
另一方面,人的記憶是有一定周期的畔塔,許多現(xiàn)在自認(rèn)為學(xué)的不錯(cuò)潭辈、掌握很牢的點(diǎn),或許下個(gè)月就稍顯生疏了澈吨。因此把敢,便于我日后自己查閱,我按照自己的思路整理了一份主要供自己參考的“資料”谅辣。
本文的舉例多以截圖給出修赞,這些例子都是在Jupyter Notebook中編輯而成的,在編輯過程中桑阶,我深感方便柏副,因此也推薦給有需要的人可以進(jìn)行嘗試。
有關(guān)Jupyter Notebook的安裝和使用蚣录,可以移步我的另一篇文章:Jupyter Notebook介紹割择、安裝及使用教程
說到Jupyter Notebook,就不得不提Anaconda萎河,一個(gè)可以便捷獲取Python的包且對包能夠進(jìn)行管理荔泳,同時(shí)對環(huán)境可以統(tǒng)一管理的發(fā)行版本蕉饼。大多數(shù)Python的包都以被安裝,而且可以創(chuàng)建不同的環(huán)境以便在Python 2.x版本和Python 3.x版本之間切換使用睦擂。而且得湘,Jupyter Notebook已經(jīng)包含在Anaconda之中。如想了解更多Anaconda相關(guān)的內(nèi)容顿仇,請移步我的另一篇文章:Anaconda介紹淘正、安裝及使用教程
本文的結(jié)構(gòu)主要分為五個(gè)部分:
- 第一部分:Python代碼規(guī)范、基本數(shù)據(jù)類型和流程控制語句
- 第二部分:函數(shù)
- 第三部分:模塊
- 第四部分:面向?qū)ο蠛皖?/li>
- 第五部分:參考資料
但愿我在自助的同時(shí)臼闻,也能幫助到你鸿吆!
一、Python代碼規(guī)范
0. 前言
Python代碼規(guī)范請以官方文檔為準(zhǔn)乓搬,本部分的代碼規(guī)范是結(jié)合Python官方文檔并延襲學(xué)習(xí)時(shí)朱老師的代碼習(xí)慣總結(jié)而成思犁,僅供參考。
1. 換行
① 行長度
1行代碼量不能超過80個(gè)字符进肯。
② 特殊情況
長的導(dǎo)入模塊語句激蹲。
注釋里的URL。
③ 超過行長度限制的處理方法
⑴ 條件表達(dá)式
Python會(huì)將 圓括號, 中括號和花括號中的行隱式的連接起來江掩。用英文半角小括號“()”括起來学辱,在邏輯運(yùn)算符前面換行乘瓤。
例如:
【原代碼】
if (1 < a < 10 and 2 < b < 10 and 3 < c < 10) or a > 10 or a <= 30
【修改】
if((1 < a < 10
and 2 < b < 10
and 3 < c < 10)
or a > 10
or a <= 30)
⑵ 字符串
Python會(huì)將 圓括號, 中括號和花括號中的行隱式的連接起來。用英文半角小括號“()”括起來換行项郊。不要使用反斜杠連接行馅扣。
例如:
【原句】
string = 'If you wish to succeed, you should use persistence as your good friend, experience as your reference, prudence as your brother and hope as your sentry.'
【修改】
string = ('If you wish to succeed, you should use persistence as your good friend,'
' experience as your reference, prudence as your brother and hope as your sentry.')
⑶ 函數(shù)參數(shù)
在逗號后面折行。
例如:
【原函數(shù)】
def test(name, age, gender, hobby, specialization, city, province, country=China):
pass
【修改】
def test(name, age, gender, hobby, specialization,
city, province, country=China):
pass
⑷ 三目運(yùn)算符
三目運(yùn)算符又稱三元運(yùn)算符着降,可以將簡單的 if
條件語句改寫成1行代碼差油,但是,如果三目運(yùn)算符代碼超過80個(gè)字符任洞,則仍需使用 if
語句蓄喇。
【if語句】
if a > 10:
b = 1
else:
b = 0
【三目運(yùn)算符】
b = 1 if a > 10 else 0
2. 縮進(jìn)
① 縮進(jìn)的優(yōu)點(diǎn)
縮進(jìn)使代碼具有層次感。
Python的語法要求交掏。對于流程控制語句妆偏,語句體必須縮進(jìn),否則將不視為流程控制語句的一部分盅弛;函數(shù)中钱骂,函數(shù)名頂格,函數(shù)體必須縮進(jìn)挪鹏;類中见秽,類名頂格,主體代碼塊必須縮進(jìn)讨盒。如不遵循該原則解取,代碼運(yùn)行時(shí)會(huì)拋出異常。
② 縮進(jìn)要求
官方建議返顺,縮進(jìn)采用4個(gè)空格禀苦,建議不要使用“tab”鍵,因?yàn)椴煌琁DE對“tab”鍵空格個(gè)數(shù)的設(shè)置是不同的遂鹊,但對空格的顯示邏輯是相同的振乏。
3. 空行
① 作用
使代碼具有段落感,便于閱讀稿辙。
② 空行的使用建議
⑴ import
import
上下各加1個(gè)空行昆码。若連續(xù)導(dǎo)入模塊,則在第一條 import
前空1行邻储,最后一條 import
后空1行赋咽。
⑵ 函數(shù)
函數(shù)下面加2個(gè)空行。
⑶ 方法
類的每個(gè)方法下面加1個(gè)空行吨娜。
⑷ 流程控制語句
流程控制語句上下各加1個(gè)空行脓匿。
⑸ 變量定義
變量定義之間建議加1個(gè)空行。若變量之間有關(guān)系宦赠,則其間不加空行陪毡。
4. 空格
① 作用
使代碼更清晰米母,便于閱讀篷就。
② 加空格的規(guī)則
⑴ 二元運(yùn)算符:二元運(yùn)算符兩邊加1個(gè)空格裁替。包括:賦值(=
),比較(==
, <
, >
, !=
, <>
, <=
, >=
, in
, not in
, is
, is not
)和布爾或邏輯運(yùn)算符(and
, or
, not
)新娜。例如:a + 34 >= (b + 34) * 3
⑵ 逗號:逗號后面必須加1個(gè)空格桅滋。
⑶ 括號:前括號“(”和后括號“)”前面不加空格慧耍。
⑷ 函數(shù):函數(shù)參數(shù)賦值的等號兩邊不加空格。
5. 注釋
① 定義
注釋的內(nèi)容在Python執(zhí)行代碼時(shí)是不予執(zhí)行的丐谋。注釋是便于代碼維護(hù)芍碧、寫給代碼使用者看的說明性文字。
② 注釋符號
⑴ 類和函數(shù)的說明文字
類和函數(shù)的說明文字位于類名或函數(shù)名下一行号俐,有4個(gè)空格的縮進(jìn)泌豆,用一對三個(gè)英文半角雙引號 或 一對三個(gè)英文半角單引號 引起,若內(nèi)容簡短吏饿,可位于文字兩邊踪危;若內(nèi)容較長,可位于文字上下行籍茧。
例如:
【類】
class Test(object):
"""
這是Test類的說明文字渴析。
注釋符號是一對三個(gè)英文半角雙引號。
注釋符號位于說明文字上下行吮龄。
"""
pass
【函數(shù)】
def test():
'''這是test函數(shù)的說明文字'''
pass
⑵ 行注釋
行注釋用井號“#”起頭俭茧,井號“#”后的文字,均為注釋內(nèi)容漓帚,Python不會(huì)執(zhí)行該處文字或代碼母债。
通常情況下寫在被注釋代碼所在行的上一行。
只有當(dāng)注釋內(nèi)容為1個(gè)單詞或少數(shù)內(nèi)容時(shí)才在被注釋行后邊進(jìn)行注釋尝抖。注意毡们,在代碼后邊的行注釋與該行代碼有至少2個(gè)空格的間距,且各行注釋不要對齊昧辽,因?yàn)闀?huì)造成維護(hù)負(fù)擔(dān)衙熔。
6. 命名規(guī)范
① 優(yōu)點(diǎn)
提高代碼可讀性。
② 變量命名規(guī)范
⑴ 英文變量名嚴(yán)格區(qū)分大小寫搅荞,通常以英文小寫命名變量红氯,以英文大寫命名常量。
⑵ 變量名不能是純數(shù)字或特殊符號(英文半角下劃線“_”除外咕痛,下同)痢甘,也不能以數(shù)字或特殊符號開頭的組合,特殊符號不能以任何形式作為變量名茉贡。錯(cuò)誤舉例:1a = 6
, a$ = 6
, $a = 6
⑶ 不建議使用中文作為變量产阱。一方面不利于代碼國際化;另一方面可能存在字符編碼問題块仆。如果運(yùn)行平臺不是支持“utf-8”构蹬,則會(huì)出錯(cuò)王暗。
⑷ 不能與Python關(guān)鍵詞同名。例如:False = 6
, True = 6
, and = 6
, or = 6
庄敛。
- 查看Python關(guān)鍵詞:
【輸入】
import keyword
print(keyword.kwlist)
【輸出】
['False', 'None', 'True', 'and', 'as', 'assert', 'break', 'class', 'continue', 'def', 'del', 'elif', 'else', 'except', 'finally', 'for', 'from', 'global', 'if', 'import', 'in', 'is', 'lambda', 'nonlocal', 'not', 'or', 'pass', 'raise', 'return', 'try', 'while', 'with', 'yield']
- 命名建議:變量的命名要考慮變量的用途俗壹,盡量以存放的內(nèi)容來命名變量。例如:存放年齡的變量使用“age”藻烤,存放姓名的變量使用“name”绷雏。
③ 其他命名規(guī)范
⑴ 函數(shù)名通常為英文小寫單詞。
⑵ 類名通常為首字母大寫的英文單詞怖亭。
7. 其他
如果在編程中有同一條代碼重復(fù)出現(xiàn)涎显,或者有高度相似的情況,則需要考慮合并代碼進(jìn)行優(yōu)化兴猩。目的是為了方便日后代碼的維護(hù)和擴(kuò)展期吓。
二、基本數(shù)據(jù)類型
1. 基本數(shù)據(jù)類型
Python 3的標(biāo)準(zhǔn)數(shù)據(jù)類型有6個(gè):
- 數(shù)字:Number
- 字符串:String
- 列表:List
- 元組:Tuple
- 集合:Sets
- 字典:Dictionary
2. 基本數(shù)據(jù)類型——數(shù)字(Number)
① 數(shù)字類型
數(shù)字類型 | 英文表示 | 分類 |
---|---|---|
整型 | int | 正數(shù)倾芝,負(fù)數(shù) |
浮點(diǎn)型 | float | |
布爾型 | bool | |
復(fù)數(shù) | complex |
例如:
② 進(jìn)制轉(zhuǎn)換
⑴ Python的進(jìn)制表示形式
進(jìn)制 | 表示形式舉例 |
---|---|
二進(jìn)制 | 0b000000 |
八進(jìn)制 | 0o345 |
十進(jìn)制 | 145 |
十六進(jìn)制 | 0xa3f |
⑵ 16以下數(shù)字二進(jìn)制
十六進(jìn)制 | 二進(jìn)制 |
---|---|
0 | 0000 |
1 | 0001 |
2 | 0010 |
3 | 0011 |
4 | 0100 |
5 | 0101 |
6 | 0110 |
7 | 0111 |
8 | 1000 |
9 | 1001 |
a | 1010 |
b | 1011 |
c | 1100 |
d | 1101 |
e | 1110 |
f | 1111 |
⑶ 相關(guān)內(nèi)置函數(shù)
函數(shù) | 作用 | 返回值類型 |
---|---|---|
int() | 將任意進(jìn)制轉(zhuǎn)化成十進(jìn)制 | 返回整型 |
bin() | 將任意進(jìn)制轉(zhuǎn)化成二進(jìn)制 | 返回字符串 |
oct() | 將任意進(jìn)制轉(zhuǎn)化成八進(jìn)制 | 返回字符串 |
hex() | 將任意進(jìn)制轉(zhuǎn)化成十六進(jìn)制 | 返回字符串 |
abs() | 求絕對值 | 返回整型 |
pow(底數(shù), 指數(shù)) | 取冪 | 返回整型 |
float() | 轉(zhuǎn)換浮點(diǎn)數(shù) | 返回浮點(diǎn)型 |
round(數(shù)字, 位數(shù)) | 四舍五入 | 返回浮點(diǎn)型 |
sum() | 求和 | 返回整型 |
min() | 最小值 | 返回整型 |
max() | 最大值 | 返回整型 |
例如:
③ 操作符
⑴ 算術(shù)操作符
符號 | 含義 |
---|---|
+ | 加 |
- | 減 |
* | 乘 |
/ | 除 |
% | 取模 |
// | 整除 |
** | 取冪 |
⑵ 比較操作符
符號 | 含義 |
---|---|
> | 大于 |
>= | 大于等于 |
< | 小于 |
<= | 小于等于 |
== | 等于 |
!= | 不等于 |
- 注意:
==
對比的是值讨勤,is
對比的是地址。
⑶ 賦值操作符
賦值操作符:=
⑷ 增強(qiáng)賦值操作符
符號 | 含義 | 舉例 |
---|---|---|
+= | 加后賦值 | a+=b → a=a+b |
-= | 減后賦值 | a-=b → a=a-b |
*= | 乘后賦值 | a*=b → a=a*b |
/= | 除后賦值 | a/=b → a=a/b |
%= | 模后賦值 | a%=b → a=a%b |
**= | 取冪后賦值 | a**=b → a=ab |
//= | 整除后賦值 | a//b → a=a//b |
&= | 按位與后賦值 | |
= | 按位或后賦值 | |
^= | 按位異或后賦值 | |
<<= | 左移后賦值 | |
>>= | 右移后賦值 |
⑸ 邏輯操作符
and
or
not
⑹ 位操作符
符號 | 含義 | 舉例 |
---|---|---|
& | 按位與 | 兩個(gè)位都為1時(shí)晨另,結(jié)果才為1 |
| | 按位或 | 兩個(gè)位都為0時(shí)潭千,結(jié)果才為0 |
^ | 按位異或 | 兩個(gè)位相同為0,相異為1 |
<< | 按位左移位 | 各二進(jìn)位全部左移若干位借尿,高位丟棄刨晴,低位補(bǔ)0 |
>> | 按位右移位 | 各二進(jìn)位全部右移若干位,對無符號數(shù)路翻,高位補(bǔ)0割捅,有符號數(shù),各編譯器處理方法不一樣帚桩,有的補(bǔ)符號位(算術(shù)右移),有的補(bǔ)0(邏輯右移) |
~ | 按位取反 | 0變1嘹黔,1變0 |
- 注意:僅對數(shù)字操作账嚎。
⑺ 成員操作符
in
not in
⑻ 身份操作符
is
is not
注意:
==
對比的是值,is
對比的是地址儡蔓。
⑼ 運(yùn)算符運(yùn)算次序
在程序設(shè)計(jì)語言中郭蕉,各類運(yùn)算符的運(yùn)算次序是:
括號 → 函數(shù) → 算術(shù)運(yùn)算 → 關(guān)系運(yùn)算 → 邏輯運(yùn)算
⑽ “==” 與 “is” 的區(qū)別
對象包含的三個(gè)基本要素
- id:身份標(biāo)識
- type:數(shù)據(jù)類型
- value:值
區(qū)別
==
:Python標(biāo)準(zhǔn)操作符中的比較操作符,用來比較判斷兩個(gè)對象的value(值)是否相等喂江。is
:Python中的身份操作符召锈,也叫同一性運(yùn)算符。用于比較判斷對象間的唯一id(身份標(biāo)識)是否相同获询。
結(jié)論
- 判斷a和b涨岁,只有數(shù)值型和字符串型的情況下拐袜,
a is b
才為True;當(dāng)a和b是元組(tuple)梢薪,列表(list)蹬铺,字典(dict)或 集合(set)型時(shí),a is b
為False秉撇。
舉例
④ 浮點(diǎn)型數(shù)字的注意事項(xiàng)
浮點(diǎn)數(shù)不能與0直接比甜攀,不精確。
如果浮點(diǎn)數(shù)與0比較琐馆,需要界定范圍之后规阀,再進(jìn)行比較。
如果浮點(diǎn)數(shù)與0比較瘦麸,可以將其轉(zhuǎn)成整型谁撼,再進(jìn)行比較。
⑤ Python的數(shù)學(xué)函數(shù)庫
import math
⑥ 數(shù)字儲存
⑴ 數(shù)字存儲原理
- 儲存單位:字節(jié)(Byte)(最小單元)
- 1個(gè)字節(jié)(Byte) = 8個(gè)位(bit)
⑵ 原碼和補(bǔ)碼
-
原碼:原碼就是符號位加上真值的絕對值, 即用第一位表示符號, 其余位表示值瞎暑。
- 例如:
[+1]原 = 0000 0001 [-1]原 = 1000 0001
-
反碼:正數(shù)的反碼是其本身彤敛;負(fù)數(shù)的反碼是在其原碼的基礎(chǔ)上, 符號位不變,其余各個(gè)位取反了赌。
- 例如:
[+1] = [0000 0001]原 = [0000 0001]反 [-1] = [1000 0001]原 = [1111 1110]反
-
補(bǔ)碼:正數(shù)的補(bǔ)碼就是其本身墨榄;負(fù)數(shù)的補(bǔ)碼是在其原碼的基礎(chǔ)上, 符號位不變, 其余各位取反, 最后+1。
- 例如:
[+1] = [0000 0001]原 = [0000 0001]反 = [0000 0001]補(bǔ) [-1] = [1000 0001]原 = [1111 1110]反 = [1111 1111]補(bǔ)
⑶ 整型正負(fù)號在二進(jìn)制中的表示
- 整型中正負(fù)在二進(jìn)制表示使用最高位來描述勿她。其中袄秩,0代表正數(shù),1代表負(fù)數(shù)逢并。
- 正數(shù)的存儲使用原碼(正數(shù)的補(bǔ)碼即是其原碼本身)之剧。
- 負(fù)數(shù)的存儲使用補(bǔ)碼玻蝌。
⑷ 變量所占二進(jìn)制位數(shù)
變量.bit_length()
⑸ 變量所占內(nèi)存
變量.__sizeof__()
3. 序列
① 定義
所謂序列帘腹,就是一系列成員的有序排列球化。Python的基本數(shù)據(jù)類型中算途,字符串倔约、列表和元組屬于序列,其成員(元素)是有序的剿配,序號從0開始簿寂。0表示第1位漠另,-1表示末尾第1位。
② 序列的通用操作
- 索引
- 分片
- 加法
- 乘法
- 成員操作符
- 最大值报咳、最小值和長度
4. 基本數(shù)據(jù)類型——字符串(String)
① 定義
字符串是用英文半角雙引號("")或單引號('')引起來的內(nèi)容婿脸,當(dāng)遇到特殊字符時(shí)在塔,可以使用反斜杠(\)進(jìn)行轉(zhuǎn)義麸塞。
字符串是不可變對象章贞。
② 特點(diǎn)
⑴ 字符串的字符從左到右順序排列赡麦。
⑵ 字符串不可改變们衙。
⑶ 字符串使用英文半角單引號('')梦皮、雙引號("")溃睹、三單引號('''''')商佑、三雙引號("""""")引用來表示。
-
注意:
- 單獨(dú)使用時(shí)新症,單引號和雙引號沒有區(qū)別泡躯。
- 當(dāng)引號中嵌套引號時(shí),必須單引號中嵌套雙引號;或者雙引號中嵌套單引號艾少。
- 三引號當(dāng)中的內(nèi)容可以跨行陪踩,將保留內(nèi)容的原格式荆秦。
-
舉例:
③ 字符串格式化表達(dá)
⑴ 基本使用
類型 | 表達(dá) | 輸入類型 | 輸出類型 |
---|---|---|---|
num | %d | 十進(jìn)制數(shù) | 十進(jìn)制數(shù) |
str | %s | 字符串 | 字符串 |
hex | %x | 十進(jìn)制數(shù) | 十六進(jìn)制數(shù) |
oct | %o | 十進(jìn)制數(shù) | 八進(jìn)制數(shù) |
float | %f | 浮點(diǎn)數(shù) | 浮點(diǎn)數(shù) |
⑵ 對齊方式
按 <num> 個(gè)字符位右對齊募舟,前邊補(bǔ)空格鲸阻,其中,傳入的字符個(gè)數(shù)也占<num>個(gè)數(shù)。用法:
%<num>d
,%<num>s
,%<num>x
,%<num>o
瑟啃,%<num>f
论泛∮加欤“<num>”用數(shù)字代替屁奏。按 <num> 個(gè)字符位右對齊,前邊補(bǔ)0错负,其中坟瓢,傳入的字符個(gè)數(shù)也占<num>個(gè)數(shù)勇边。用法:
%0<num>d
,%0<num>x
折联,%0<num>o
粒褒,%0<num>f
〕狭“<num>”用數(shù)字代替奕坟。按 <num> 個(gè)字符位左對齊,前邊不能補(bǔ)內(nèi)容清笨。用法:
%-<num>d
月杉,%-<num>s
,%-<num>x
抠艾,%-<num>o
苛萎,%-<num>f
〉剩“<num>”用數(shù)字代替。保留 <num> 位小數(shù)绊率。用法:
%.<num>f
谨敛。“<num>”用數(shù)字代替滤否。
⑶ 舉例
④ 前綴字符
⑴ “r”或“R”:字符串引號前有“r”或“R”脸狸,則表示字符串為非轉(zhuǎn)義原始字符串,字符串內(nèi)如有特殊功能的字符藐俺,將不起作用炊甲。
⑵ “b”或“B”:字符串引號前有“b”或“B”,則表示引號內(nèi)為bytes類型欲芹。與普通字符串的區(qū)別是bytes訪問類型是ASCII編碼卿啡,并非是字符。
- 特殊功能字符:
符號 | 含義 |
---|---|
\n | 換行 |
\r | 回車 |
\b | 刪除前一個(gè)字符 |
\t | 制表符(tab鍵) |
\033[ | VT100碼前綴 |
-
舉例:
⑤ 字符串與其他格式之間的轉(zhuǎn)換
⑴ 其他格式轉(zhuǎn)為字符串:str()
⑵ str轉(zhuǎn)bytes類型:string.encode()
菱父。其中颈娜,“string”表示任意“str”類型字符串。
⑶ bytes轉(zhuǎn)str類型:bytes.decode()
浙宜。其中官辽,“bytes”表示任意bytes類型字符串。
⑷ 字符串轉(zhuǎn)ASCII碼值:ord(string)
粟瞬。其中同仆,“string”表示任意一個(gè)“str”類型字符。
⑸ ASCII碼值轉(zhuǎn)字符串:chr(number)
裙品。其中俗批,“number”表示數(shù)字俗或。
- ASCII碼表:
-
舉例:
⑥ 字符串的序列屬性
⑴ 索引
索引即根據(jù)字符串成員的序號獲取相應(yīng)的內(nèi)容。
string[number]
“string”為任意字符串扶镀。
“number”為數(shù)字蕴侣,即要查找的序號,序號從0開始臭觉。0表示第1位昆雀,-1表示倒數(shù)第1位。
⑵ 分片
分片用于取字符串指定序號間的內(nèi)容蝠筑。
string[num1:num2:num3]
“string”為任意字符串狞膘。
“num1”為數(shù)字,即要查找的起始序號什乙。若“num1”為空挽封,則默認(rèn)從第1位開始,“num1”后的冒號不可省略臣镣。
“num2”為數(shù)字辅愿,即要查找的截止序號(不包括此序號)。若“num2”為空忆某,則默認(rèn)到最后1位点待。若“num2”和“num3”同時(shí)為空,則“num2”后的冒號可以省略弃舒;若“num2”為空癞埠,“num3”有值,則“num2”后的冒號不能省略聋呢。
“num3”為數(shù)字苗踪,表示步長,“num3”可有可無削锰,當(dāng)沒有“num3”時(shí)通铲,同時(shí)省略“num3”前冒號,默認(rèn)步長為1器贩。若“num3”為-1测暗,則表示倒序。
序號從0開始磨澡。0表示第1位碗啄,-1表示倒數(shù)第1位。
⑶ 加法
字符串加法不是數(shù)值相加稳摄,而是用加號“+”連接兩個(gè)或多個(gè)字符串踢关。
string1 + string2 + ... + stringN
- “string”為任意字符串英岭。
⑷ 乘法
字符串乘法不是數(shù)值相乘乖仇,而是復(fù)制指定遍數(shù)的操作伐脖。
string * number
- “string”為任意字符串。
- “number”為數(shù)字,表示復(fù)制的遍數(shù)。
⑸ 成員判斷
成員判斷即運(yùn)用成員操作符“in”或“not in”來判斷指定字符是否在字符串當(dāng)中。
string1 in string
string1 not in string
“string1”和“string”可以是任意字符串国夜。
string1 in string
用于判斷string1是否在string當(dāng)中,若在短绸,返回True车吹;若不在,返回False醋闭。string1 not in string
用于判斷string1是否不在string當(dāng)中窄驹,若不在,返回True证逻;若在乐埠,返回False。
⑹ 最大值囚企、最小值和長度
最大值:判斷字符串中ASCII碼值最大的成員丈咐。語法:
max(string)
最小值:判斷字符串中ASCII碼值最小的成員。語法:
min(string)
長度:判斷字符串成員的個(gè)數(shù)龙宏。語法:
len(string)
⑺ 舉例
⑦ 字符串屬性
⑴ 屬性
屬性 | 含義 | 用法 |
---|---|---|
string.capitalize() | 字符串首字母大寫棵逊,其余全小寫 | 不需要參數(shù) |
string.count(s[, n1, n2]) | 在字符串中查找指定字符的個(gè)數(shù) | s為字符串,表示查找內(nèi)容烦衣;n1為數(shù)字歹河,表示查找的起始位置掩浙,可無花吟;n2為數(shù)字,表示查找的截止位置厨姚,可無 |
string.center(n, s) | 把string居中衅澈,前后填充s | n為數(shù)字,表示字符數(shù)谬墙;s為字符串今布,表示string前后填充的內(nèi)容 |
string.ljust(n, s) | 把string左對齊,然后右邊填充s | n為數(shù)字拭抬,表示字符數(shù)部默;s為字符串,表示string前后填充的內(nèi)容 |
string.rjust(n, s) | 把string右對齊造虎,然后左邊填充s | n為數(shù)字傅蹂,表示字符數(shù);s為字符串,表示string前后填充的內(nèi)容 |
string.encode() | 把string轉(zhuǎn)化為bytes類型 | |
string.endswith(s) | 判斷string是否是以s結(jié)尾份蝴,是返回True犁功,不是返回False | s為字符串,用于判斷string是否以s結(jié)尾 |
string.startswith(s) | 判斷string是否是以s開頭婚夫,是返回True浸卦,不是返回False | s為字符串,用于判斷string是否以s開頭 |
string.expandtabs(tabsize=n) | 將string中的制表符縮進(jìn)定義為n個(gè)空格 | n為自定義縮進(jìn)的空格數(shù) |
string.find(s) | 查找s在string中最左邊的位置案糙,返回索引限嫌;若不存在,返回-1 | s為字符串侍筛,表示被查找內(nèi)容 |
string.rfind(s) | 查找s在string中最右邊的位置萤皂,返回索引;若不存在匣椰,返回-1 | s為字符串裆熙,表示被查找內(nèi)容 |
string.index(s) | 查找s在string中最左邊的位置,返回索引禽笑;若不存在入录,拋出異常 | s為字符串,表示被查找內(nèi)容 |
string.rindex(s) | 查找s在string中最右邊的位置佳镜,返回索引僚稿;若不存在,拋出異常 | s為字符串蟀伸,表示被查找內(nèi)容 |
string.format() | 以關(guān)鍵字傳值的方式在string中格式化輸入內(nèi)容 | 若為string中{name}傳入值蚀同,則format(name="自定義內(nèi)容") |
string.format_map() | 以字典的方式在string中格式化輸入內(nèi)容 | 若為string中{name}傳入值,則format_map({"name":"自定義內(nèi)容"}) |
string.isalnum() | 檢測string是否由中文啊掏、字母和數(shù)字組成蠢络。只要滿足其一,返回True迟蜜,否則返回False | |
string.isalpha() | 檢測string是否只由中文刹孔、字母組成。全中文或全英文或中英文結(jié)合娜睛,返回True髓霞,否則返回False。 | |
string.isdecimal() | 檢測string是否是十進(jìn)制數(shù)字畦戒,是就返回True方库,不是返回False | |
string.isdigit() | 檢測string是否是數(shù)字,是就返回True障斋,不是返回False | |
string.isnumeric() | 檢測string是否是數(shù)字(中文纵潦、羅馬、阿拉伯),是就返回True酪穿,不是返回False | |
string.isidentifier() | 判斷string是否是合法的變量名凳干,合法返回True,否則返回False | |
string.islower() | 檢測string是否全是小寫被济,是返回True救赐,不是返回False。不考慮標(biāo)點(diǎn) | |
string.isupper() | 檢測string是否全是大寫只磷,是返回True经磅,不是返回False。不考慮標(biāo)點(diǎn) | |
string.ispace() | 檢測string是否是空格钮追,是返回True预厌,不是返回False | |
string.istitle() | 檢測string中的每一個(gè)英文單詞都是首字母大寫的,是返回True元媚,不是返回False | |
string.join(iterable) | 把iterable的每兩個(gè)元素之間用string結(jié)合起來 | iterable是指可迭代對象 |
string.lower() | 把string變成全小寫 | |
string.upper() | 把string變成全大寫 | |
string.swapcase() | 把string中的大寫轉(zhuǎn)成小寫轧叽,小寫轉(zhuǎn)成大寫 | |
string.lstrip() | 刪除string左邊的換行符('\n'),制表符('\t')和空格刊棕。 | |
string.rstrip() | 刪除string右邊的換行符('\n')炭晒,制表符('\t')和空格。 | |
sting.strip() | 刪除string兩邊的換行符('\n')甥角,制表符('\t')和空格网严。 | |
string.replace(old, new, n) | 把string中的從左到右的n個(gè)old替換成new | old和new均為字符串,意味把old替換成new嗤无;n為數(shù)字震束,即從左往右替換old的個(gè)數(shù),可無 |
string.split(s) | 把string以s分割当犯,分割之后返回列表 | s為字符串垢村,表示分隔符 |
string.splitlines(s) | 把string以換行符(\n)分割,分割之后返回列表 | |
string.title() | 把string當(dāng)中的所有單詞都變?yōu)槭鬃帜复髮?/td> |
⑵ 舉例
5. 基本數(shù)據(jù)類型——列表(List)
① 定義
列表是Python中使用最為頻繁的數(shù)據(jù)類型灶壶,各個(gè)元素以英文半角逗號隔開肝断,并用方括號“[]”括起所有元素杈曲,整個(gè)方括號及其內(nèi)部的元素稱為列表驰凛。
列表是可變對象。
[cell1, cell2, ..., cellN]
其中担扑,“cell”是列表的元素恰响。
② 列表的元素類型
列表的元素類型可以是任意數(shù)據(jù)類型,且元素之間的類型可以不同烙丛。元素的類型可以是:數(shù)字政己,字符串,列表俏橘,元組枢劝,字典和集合井联。
當(dāng)列表的元素仍為列表時(shí),就實(shí)現(xiàn)了列表的嵌套您旁。
例如:
[1, 'raxxie', ['Python', 2018], ('a', 'b', 'c'), {1, 2, 3}, {'name':'Raxxie', 'age':18}]
③ 其他數(shù)據(jù)類型轉(zhuǎn)為列表
list(iterable)
其中烙常,“iterable”為可迭代對象。
例如:
④ 列表的序列屬性
⑴ 索引
列表是“有序”的鹤盒。索引即根據(jù)列表元素的位置序號讀取相應(yīng)元素蚕脏。
list[number]
“l(fā)ist”為任意列表。
“number”為數(shù)字侦锯,即要查找的序號驼鞭,序號從0開始。0表示第1位尺碰,-1表示倒數(shù)第1位挣棕。
若要修改列表指定位置元素的值,可以通過索引的方式修改:
list[number] = new
“l(fā)ist”為任意列表亲桥。
“number”為數(shù)字穴张,即要查找的序號,序號從0開始两曼。0表示第1位皂甘,-1表示倒數(shù)第1位。
“new”為“l(fā)ist[number]”的新值悼凑。
例如:
⑵ 分片
分片用于讀取列表指定位置序號間的元素偿枕。
list[num1:num2:num3]
“l(fā)ist”為任意列表。
“num1”為數(shù)字户辫,即要查找的起始序號渐夸。若“num1”為空,則默認(rèn)從第1位開始渔欢,“num1”后的冒號不可省略墓塌。
“num2”為數(shù)字,即要查找的截止序號(不包括此序號)奥额。若“num2”為空苫幢,則默認(rèn)到最后1位。若“num2”和“num3”同時(shí)為空垫挨,則“num2”后的冒號可以省略韩肝;若“num2”為空,“num3”有值九榔,則“num2”后的冒號不能省略哀峻。
“num3”為數(shù)字涡相,表示步長,“num3”可有可無剩蟀,當(dāng)沒有“num3”時(shí)催蝗,同時(shí)省略“num3”前冒號,默認(rèn)步長為1育特。若“num3”為-1生逸,則表示倒序。
序號從0開始且预。0表示第1位槽袄,-1表示倒數(shù)第1位。
例如:
⑶ 加法
列表加法不是數(shù)值相加锋谐,而是將2個(gè)或多個(gè)列表拼接成1個(gè)列表遍尺。拼接方法是加號“+”后邊的列表元素直接添加到加號“+”前邊列表最后1個(gè)元素的后邊。
list1 + list2 + ... + listN
- “l(fā)ist”為任意列表涮拗。
例如:
⑷ 乘法
語法
列表乘法不是數(shù)值相乘乾戏,而是把列表中的元素復(fù)制指定遍數(shù)的操作。
list * number
- “l(fā)ist”為任意列表三热。
- “number”為數(shù)字鼓择,表示復(fù)制的遍數(shù)。
但是就漾,元素為可變對象的列表乘法和元素為不可變對象列表乘法呐能,其效果是存在差異的。在解釋這種差異之前抑堡,先來了解什么是可變對象和不可變對象摆出。
不可變對象
不可變對象,是指該對象所指向的內(nèi)存中的值不能被改變首妖。當(dāng)改變某個(gè)變量時(shí)候偎漫,由于其所指的值不能被改變,相當(dāng)于把原來的值復(fù)制一份后再改變有缆,這會(huì)開辟一個(gè)新的地址象踊,變量再指向這個(gè)新的地址。
不可變對象包括:數(shù)字(int
和 float
)棚壁、字符串(string)和元組(tuple)杯矩。
可變對象
可變對象,是指該對象所指向的內(nèi)存中的值可以被改變灌曙。變量(準(zhǔn)確的說是引用)改變后菊碟,實(shí)際上是其所指的值直接發(fā)生改變节芥,并沒有發(fā)生復(fù)制行為在刺,也沒有開辟新的地址逆害,通俗點(diǎn)說就是原地改變。
可變對象包括:列表(list)蚣驼、字典(dictionary)和集合(set)魄幕。
列表乘法的差異
當(dāng)元素是不可變對象的列表時(shí),列表乘法之后生成新的列表颖杏。修改新列表的某個(gè)(些)元素的值不會(huì)改變其他元素纯陨。
當(dāng)元素是可變對象的列表時(shí),列表乘法之后生成新的列表留储。修改新列表的某個(gè)(些)元素的值時(shí)翼抠,被復(fù)制的元素也會(huì)隨之發(fā)生變化。
總之获讳,列表進(jìn)行乘法運(yùn)算之后所得新的列表阴颖。在修改新列表的元素值時(shí),修改的是不可變對象丐膝,則其他被復(fù)制的值不會(huì)改變量愧;修改的是可變對象,則其他被復(fù)制的值也會(huì)跟著改變帅矗。
簡言之偎肃,列表的乘法對于不可變對象是復(fù)制的值,對于可變對象是復(fù)制的引用浑此。
舉例
⑸ 成員判斷
成員判斷即運(yùn)用成員操作符“in”或“not in”來判斷指定內(nèi)容是否在列表當(dāng)中累颂。
cell in list
cell not in list
“cell”可以是任何數(shù)據(jù)類型。
“l(fā)ist”指任意列表凛俱。
cell in list
用于判斷cell是否在list當(dāng)中喘落,若在,返回True最冰;若不在瘦棋,返回False。cell not in list
用于判斷cell是否不在list當(dāng)中暖哨,若不在赌朋,返回True;若在篇裁,返回False沛慢。
⑹ 最大值、最小值和長度
最大值 和 最小值
最大值:判斷列表最大的元素达布。語法:max(list)
团甲。
最小值:判斷列表最小的元素雌团。語法:min(list)
仑嗅。
需要注意的是腹纳,只有當(dāng)列表元素的數(shù)據(jù)類型相同的情況下才能夠取出最大值雄坪,否則會(huì)拋出異常。
元素為數(shù)字的列表匹厘,將取出數(shù)值最大的元素作為最大值嘀趟;取出數(shù)值最小的元素作為最小值。
元素為字符串的列表愈诚,將取出ASCII碼值最大的元素作為最大值她按;取出ASCII碼值最小的元素作為最小值。
元素為元組(或列表)的列表炕柔,元組(或列表)的元素?cái)?shù)據(jù)類型要相同酌泰,否則拋出異常,其比較原則同“數(shù)字”或“字符串”匕累。
元素為集合的列表宫莱,最大值和最小值均是排在第1個(gè)的集合,因此無法比較哩罪。
元素為字典的列表授霸,無法比較最大值和最小值。
長度
- 長度:判斷列表的元素個(gè)數(shù)际插。語法:
len(list)
舉例
⑤ 列表的屬性
⑴ 屬性
屬性 | 含義 | 用法 |
---|---|---|
list.append(cell) | 在list中追加(末尾添加)一個(gè)元素 | 參數(shù)可以是任何數(shù)據(jù)類型 |
list.insert(num, cell) | 在list指定位置添加一個(gè)元素 | num為添加元素的位置序號(索引)框弛;cell是被添加的元素內(nèi)容辛辨,可以是任何數(shù)據(jù)類型 |
list.remove(cell) | 在list中刪除cell元素,返回None | cell是將被刪除的元素瑟枫,必須是list當(dāng)中的元素 |
del list[num] | 這不是list屬性斗搞,而是用del刪除list中指定位置的元素 | num是刪除元素的位置序號(索引) |
list.pop() | 刪除list中的最后一個(gè)元素,并且返回該元素的值 | 沒有參數(shù) |
list.index(cell) | 返回cell在list中的索引 | cell是被查找索引的元素值慷妙,可以是任何數(shù)據(jù)類型僻焚,但必須是list當(dāng)中的元素 |
list.count(cell) | 查找cell在list的個(gè)數(shù),返回?cái)?shù)字 | cell是被計(jì)數(shù)的元素值膝擂,可以是任何數(shù)據(jù)類型虑啤,但必須是list當(dāng)中的元素 |
list.clear() | 清空list | 沒有參數(shù) |
list.reverse() | 使list逆序 | 沒有參數(shù) |
list.sort([reverse=True/False]) | 使list降序/升序排序 | 參數(shù)可有可無。若參數(shù)reverse=True架馋,則降序排列狞山;若沒有參數(shù)或參數(shù)reverse=False,則升序排列 |
list.extend(iterable) | 把iterable的元素追加到list末尾 | 參數(shù)iterable必須是可迭代對象 |
list.copy() | 復(fù)制列表 | 列表元素為不可變對象時(shí)叉寂,修改元素值其他被復(fù)制元素不會(huì)改變萍启;列表元素為可變對象時(shí),修改元素值其他被復(fù)制元素值也跟著改變 |
注意: list.copy()
原理請參考本部分“列表的序列屬性”之“乘法”部分屏鳍。
⑵ 舉例
⑥ 列表推導(dǎo)式
列表推導(dǎo)式又稱列表生成式或列表解析式勘纯,是通過固定語法生成列表的方式局服。
[<cell_expression> for <cell> in <iterable> if <cell_condtion>]
其中:
“<cell_expression>”是列表元素所滿足的表達(dá)式,也可以只是元素本身屡律。
“<cell>”是元素的變量名腌逢,要與“<cell_expression>”中的元素變量名保持一致降淮。
“<iterable>”是可迭代對象超埋。此處可以是:列表,元組佳鳖,字符串霍殴,
range()
。“if <cell_condition>”是元素的取值條件系吩,可有可無来庭。
舉例:
6. 基本數(shù)據(jù)類型——元組(Tuple)
① 定義
各個(gè)元素以英文半角逗號隔開,并用小括號“()”括起所有元素穿挨,整個(gè)小括號及其內(nèi)部的元素稱為元組月弛。
(cell1, cell2, ..., cellN)
其中,“cell”是元組的元素科盛。
元組被稱為不可變列表(或只讀列表)帽衙,因?yàn)樵M的元素只能被讀取,不能被修改贞绵。
空元組表示為:()
只有一個(gè)元素的元組表示:(cell,)
厉萝,其中,“cell”表示元素榨崩,可以是任意數(shù)據(jù)類型谴垫。
需要注意的是,單元素元組小括號內(nèi)元素后邊的逗號不能省略母蛛,否則這將不是元組類型翩剪,而是該元素的數(shù)據(jù)類型。
例如:
② 元組的元素類型
元組的元素類型可以是任意數(shù)據(jù)類型彩郊,且元素之間的類型可以不同肢专。元素的類型可以是:數(shù)字,字符串焦辅,列表博杖,元組,字典和集合筷登。
當(dāng)元組的元素仍為元組時(shí)剃根,就實(shí)現(xiàn)了元組的嵌套。
例如:
(1, 'raxxie', ['Python', 2018], ('a', 'b', 'c'), {1, 2, 3}, {'name':'Raxxie', 'age':18})
③ 其他數(shù)據(jù)類型轉(zhuǎn)為元組
tuple(iterable)
其中前方,“iterable”為可迭代對象狈醉。
例如:
④ 元組的序列屬性
⑴ 索引
元組是“有序”的廉油。索引即根據(jù)元組元素的位置序號讀取相應(yīng)元素。
tuple[number]
“tuple”為任意元組苗傅。
“number”為數(shù)字抒线,即要查找的序號,序號從0開始渣慕。0表示第1位嘶炭,-1表示倒數(shù)第1位。
由于元組是只讀的逊桦,因此不能以任何方式修改其元素的值眨猎。
⑵ 分片
分片用于讀取元組指定位置序號間的元素。
tuple[num1:num2:num3]
“tuple”為任意元組强经。
“num1”為數(shù)字睡陪,即要查找的起始序號。若“num1”為空匿情,則默認(rèn)從第1位開始兰迫,“num1”后的冒號不可省略。
“num2”為數(shù)字炬称,即要查找的截止序號(不包括此序號)汁果。若“num2”為空,則默認(rèn)到最后1位转砖。若“num2”和“num3”同時(shí)為空须鼎,則“num2”后的冒號可以省略;若“num2”為空府蔗,“num3”有值晋控,則“num2”后的冒號不能省略。
“num3”為數(shù)字姓赤,表示步長赡译,“num3”可有可無,當(dāng)沒有“num3”時(shí)不铆,同時(shí)省略“num3”前冒號蝌焚,默認(rèn)步長為1。若“num3”為-1誓斥,則表示倒序只洒。
序號從0開始。0表示第1位劳坑,-1表示倒數(shù)第1位毕谴。
⑶ 加法
元組加法不是數(shù)值相加脓鹃,而是將2個(gè)或多個(gè)元組拼接成1個(gè)新的元組赌厅。拼接方法是加號“+”后邊的元組元素拼接到加號“+”前邊元組最后1個(gè)元素的后邊,由此形成1個(gè)新的元組信认。
tuple1 + tuple2 + ... + tupleN
- “tuple”為任意元組吃谣。
⑷ 乘法
元組乘法不是數(shù)值相乘洼裤,而是把元組中的元素復(fù)制指定遍數(shù)蓬坡,然后形成1個(gè)新的元組的操作骏啰。
tuple * number
- “tuple”為任意元組。
- “number”為數(shù)字银舱,表示復(fù)制的遍數(shù)瘪匿。
⑸ 成員判斷
成員判斷即運(yùn)用成員操作符“in”或“not in”來判斷指定內(nèi)容是否在元組當(dāng)中。
cell in tuple
cell not in tuple
“cell”可以是任何數(shù)據(jù)類型纵朋。
“tuple”指任意列表柿顶。
cell in tuple
用于判斷cell是否在tuple當(dāng)中茄袖,若在操软,返回True;若不在宪祥,返回False聂薪。cell not in tuple
用于判斷cell是否不在tuple當(dāng)中,若不在蝗羊,返回True藏澳;若在,返回False耀找。
⑹ 最大值翔悠、最小值和長度
最大值 和 最小值
最大值:判斷元組最大的元素。語法:max(tuple)
野芒。
最小值:判斷元組最小的元素蓄愁。語法:min(tuple)
。
需要注意的是狞悲,只有當(dāng)元組元素的數(shù)據(jù)類型相同的情況下才能夠取出最大值撮抓,否則會(huì)拋出異常。
元素為數(shù)字的元組摇锋,將取出數(shù)值最大的元素作為最大值丹拯;取出數(shù)值最小的元素作為最小值。
元素為字符串的元組荸恕,將取出ASCII碼值最大的元素作為最大值乖酬;取出ASCII碼值最小的元素作為最小值。
元素為列表(或元組)的元組融求,列表(或元組)的元素?cái)?shù)據(jù)類型要相同咬像,否則拋出異常,其比較原則同“數(shù)字”或“字符串”。
元素為集合的元組施掏,最大值和最小值均是排在第1個(gè)的集合钮惠,因此無法比較。
元素為字典的元組七芭,無法比較最大值和最小值素挽。
長度
- 長度:判斷元組的元素個(gè)數(shù)。語法:
len(tuple)
舉例
⑤ 元組的屬性
⑴ 屬性
屬性 | 含義 | 用法 |
---|---|---|
tuple.index(cell) | 返回cell在tuple中的索引 | cell是被查找索引的元素值狸驳,可以是任何數(shù)據(jù)類型预明,但必須是tuple當(dāng)中的元素 |
tuple.count(cell) | 查找cell在tuple的個(gè)數(shù),返回?cái)?shù)字 | cell是被計(jì)數(shù)的元素值耙箍,可以是任何數(shù)據(jù)類型撰糠,但必須是tuple當(dāng)中的元素 |
⑵ 舉例
7. 基本數(shù)據(jù)類型——集合(Sets)
① 定義
一組互不相同的數(shù)據(jù)以英文半角逗號隔開,用花括號“{}”括起來辩昆,花括號和這組數(shù)據(jù)被稱為集合阅酪。
集合是無序的,因此集合不能索引和分片汁针。
{cell1, cell2, ..., cellN}
其中术辐,“cell”是集合的元素。
集合的元素只能是數(shù)字施无、字符串辉词、元組。
空集合不能使用 {}
來定義猾骡,因?yàn)?{}
是空字典瑞躺,即字典類型;要通過 set()
來定義兴想。
例如:
② 集合的特性
確定性:給定一個(gè)集合幢哨,任給一個(gè)元素,該元素或者屬于或者不屬于該集合襟企,二者必居其一嘱么,不允許有模棱兩可的情況出現(xiàn)。
互異性:一個(gè)集合中顽悼,任何兩個(gè)元素都認(rèn)為是不相同的曼振,即每個(gè)元素只能出現(xiàn)一次。
無序性:一個(gè)集合中蔚龙,每個(gè)元素的地位都是相同的冰评,元素之間是無序的。
③ 其他數(shù)據(jù)類型轉(zhuǎn)為集合
- 注意:
其他數(shù)據(jù)類型轉(zhuǎn)為集合時(shí)木羹,重復(fù)的元素將只會(huì)保留1個(gè)甲雅。
字典轉(zhuǎn)為集合時(shí)解孙,只是將字典的“Key”作為集合的元素形成新的集合。
④ 集合的使用場景
“去重需求”:去掉重復(fù)元素的需求抛人。
“關(guān)系判斷”需求:測試兩組數(shù)據(jù)之間的關(guān)系弛姜,包括但不僅限于:交集、差集妖枚、并集廷臼。
⑤ 集合運(yùn)算(關(guān)系測試)
⑴ 交集
交集即取兩集合重合的元素。
set1.intersection(set2)
或
set & set2
⑵ 判斷是否沒有交集
set1.isdisjoint(set2)
如果 set1 & set2 == set()
那么表示set1和set2沒有交集绝页,或稱兩集合交集為空集荠商。
⑶ 并集
并集是合并兩集合的所有元素且只保留1組重復(fù)元素。
set1.union(set2)
或
set1 | set2
⑷ 差集
若兩個(gè)集合分別是set1和set2续誉,則差集就是屬于set1且不屬于set2的元素莱没。
set1.difference(set2)
或
set1 - set2
⑸ 子集
若兩個(gè)集合分別是set1和set2,且set1是set2的一部分(或全部)酷鸦,則稱為set1是set2的子集饰躲。
set1.issubset(set2)
或
set1 < set2
如果set1是set2的子集,則結(jié)果返回True井佑;否則返回False属铁。
⑹ 父集或超集
若兩個(gè)集合分別是set1和set2眠寿,且set1是set2的一部分(或全部)躬翁,則稱為set2是set1的父集(或超集)。
set1.issuperset(set2)
或
set2 > set1
如果set2是set1的父集(或超集)盯拱,則結(jié)果返回True盒发;否則返回False。
⑺ 對稱差集
對稱差集即兩集合中不相同元素的結(jié)合狡逢。
set1.symmetric_difference(set2)
或
set1 ^ set2
兩集合的對稱差集 與 交集 的 并集宁舰,等于兩集合的并集。即:
set1 | set2 == (set1 ^ set2) | (set1 & set2)
兩集合的并集 與 交集 的 差集奢浑,等于兩集合的對稱差集蛮艰。即:
set1 ^ set2 == (set1 | set2) - (set1 & set2)
⑻ 舉例
⑥ 三組運(yùn)算的實(shí)例對比
⑴ difference() 與 difference_update()
⑵ intersection() 與 intersection_update()
⑶ symmetric_difference() 與 symmetric_difference_update()
⑦ 集合的增刪
⑴ 增
增加1個(gè)元素
set.add(cell)
“cell”表示添加的元素,只能是數(shù)字雀彼、字符串或元組壤蚜。
參數(shù)只能有1個(gè)。
增加多個(gè)元素
set.update(iteralbe1, iterable2, ..., iterableN)
“iterable”表示添加的元素徊哑,只能是可迭代對象(iterable)袜刷。
參數(shù)可以是多個(gè)。
當(dāng)參數(shù)為字符串時(shí)莺丑,將把字符串的每個(gè)字符作為1個(gè)元素添加到集合中著蟹。
當(dāng)參數(shù)為列表或元組時(shí)墩蔓,將把元組或列表的每個(gè)元素作為1個(gè)元素添加到集合中蒂萎。
舉例
⑵ 刪
set.remove(cell)
“cell”表示將被刪除的元素湃交。
被刪除的元素必須在集合中存在。否則將會(huì)拋出異常蝎土。
set.discart.(cell)
“cell”表示將被刪除的元素涮雷。
如果被刪除的元素在集合中存在源内,則刪除該元素;否則不做任何處理份殿。
舉例:
set.pop()
沒有參數(shù)膜钓。
隨機(jī)刪除集合中的一個(gè)元素,并返回刪除元素的值卿嘲。
set.clear()
沒有參數(shù)颂斜。
清空集合。
例如:
⑧ 內(nèi)置函數(shù)
⑴ 內(nèi)置函數(shù)
屬性 | 含義 | 用法 |
---|---|---|
all(set) | 集合元素全為真拾枣,返回True沃疮,一個(gè)為假返回False | 參數(shù)為集合。元素為:""梅肤, 0司蔬, (),F(xiàn)alse時(shí)為假姨蝴,當(dāng)集合為空時(shí)(即俊啼,set())返回True |
any(set) | 集合元素全為假,返回False左医,一個(gè)為真返回True | 參數(shù)為集合授帕。元素為:"", 0浮梢, ()跛十,F(xiàn)alse時(shí)為假,當(dāng)集合為空時(shí)(即秕硝,set())返回False |
enumerate(set) | 返回一個(gè)枚舉對象芥映,其中包含了集合中所有元素的索引和值(配對) | 參數(shù)為集合≡恫颍可以通過遍歷獲取索引和值 |
len(set) | 返回集合的元素個(gè)數(shù) | 參數(shù)為集合奈偏。 |
max(set) | 返回集合中元素的最大值 | 參數(shù)為集合。若集合元素為字符串憋飞,則比較ASCII值霎苗;若集合元素為數(shù)字,則比較數(shù)值榛做;若集合元素為元組唁盏,則比較元組的第1個(gè)元素 |
min(set) | 返回集合中元素的最小值 | 參數(shù)為集合。若集合元素為字符串厘擂,則比較ASCII值昆淡;若集合元素為數(shù)字,則比較數(shù)值刽严;若集合元素為元組昂灵,則比較元組的第1個(gè)元素 |
sorted(set[, reverse=True/False]) | 將集合中的元素值排列順序并返回一個(gè)新的列表 | 參數(shù)為集合,返回的結(jié)果為列表。若集合元素為字符串甘晤,則比較ASCII值;若集合元素為數(shù)字,則比較數(shù)值旷档。reverse參數(shù)可有可無替蛉,當(dāng)reverse=True時(shí)怎静,將降序排列;當(dāng)沒有reverse參數(shù)或reverse=False時(shí)阴幌,將升序排列 |
sum(set) | 當(dāng)集合元素全為數(shù)字時(shí)愤估,計(jì)算集合元素之和 | 參數(shù)為集合。集合的元素只能是純數(shù)字皂冰,否則將拋出異常 |
⑵ 舉例
⑨ 不可變集合
根據(jù)前面的介紹,集合是可以增加(add()
或 update
)和刪除(remove()
)元素的船万。不可變集合則不具備增加和刪除元素的屬性。因此怎栽,創(chuàng)建一個(gè)不可變集合铭乾,可以通過以下方法:
frozenset([iterable])
- “iterable”表示可迭代對象爆哑。
- 當(dāng)沒有參數(shù)時(shí),表示創(chuàng)建一個(gè)空不可變集合抑片。
由于set是可變的医咨,因此它不存在哈希值均驶;frozenset是不可變的瞒滴,所以它存在哈希值继蜡。并且引颈,frozenset可以作為字典的key,也可以作為其他集合的元素编整。
⑩ 集合推導(dǎo)式
集合推導(dǎo)式與列表推導(dǎo)式幾乎相同,只是把列表的方括號“[]”替換成集合的花括號“{}”。并且生成的元素如有重復(fù)果复,則集合會(huì)自動(dòng)去重惠窄。
集合推導(dǎo)式又稱集合生成式或集合解析式停蕉,是通過固定語法生成集合的方式。
{<cell_expression> for <cell> in <iterable> if <cell_condtion>}
其中:
“<cell_expression>”是集合元素所滿足的表達(dá)式豌熄,也可以只是元素本身。
“<cell>”是元素的變量名物咳,要與“<cell_expression>”中的元素變量名保持一致锣险。
“<iterable>”是可迭代對象。此處可以是:列表览闰,元組芯肤,字符串,
range()
压鉴。“if <cell_condition>”是元素的取值條件崖咨,可有可無。
舉例:
8. 基本數(shù)據(jù)類型——字典(Dictionary)
① 定義
字典是可變對象油吭,且字典是無序的击蹲。字典可以儲存任何數(shù)據(jù)類型,它是以“鍵值對”(Key-Value)的方式儲存數(shù)據(jù)的婉宰,即每個(gè)“鍵”(Key)對應(yīng)一個(gè)“值”(Value)歌豺,“鍵”和“值”之間以英文冒號隔開。這些鍵值對以英文半角逗號隔開心包,外側(cè)以花括號“{}”括起类咧。
{key1:value1, key2:value2, ..., keyN:valueN}
其中,“key”是字典的“鍵”蟹腾;“value”是字典的值痕惋。
② 字典的“鍵”、“值”特點(diǎn)
- 字典的“鍵”必須是唯一的娃殖,而“值”可以不唯一值戳。如果在創(chuàng)建字典時(shí)存在2個(gè)或多個(gè)相同的“鍵”,則取最后一個(gè)鍵值對珊随。
例如:
字典的“鍵”必須是不可變對象的數(shù)據(jù)類型述寡,包括:字符串,數(shù)字叶洞,元組鲫凶。
字典的“值”可以是任何數(shù)據(jù)類型。
③ 創(chuàng)建字典
字典的創(chuàng)建方法有2種衩辟。
一種是根據(jù)字典的定義來創(chuàng)建字典螟炫,即通過在花括號內(nèi)自定義鍵、值艺晴,并將鍵和值以冒號隔開昼钻,鍵值對之間以逗號隔開掸屡,由此創(chuàng)建字典。
另一種是通過 dict
語法生成:
dict(key1=value1, key2=value2, ..., keyN=valueN)
注意:第1種方法創(chuàng)建字典時(shí)然评,如果鍵的數(shù)據(jù)類型為字符串仅财,則必須為鍵名添上英文半角單引號或雙引號;第2種方法創(chuàng)建字典碗淌,鍵名不需要加引號盏求。
例如:
④ 字典元素的增刪改查
⑴ 查
由于字典是無序的,因此無法通過索引的方式查看字典的元素亿眠,同時(shí)却音,也無法對字典進(jìn)行分片操作酷愧。
查看字典指定值可以借助對應(yīng)的鍵:
dictionary[key]
- “dictionary”為字典。
- “key”是鍵名倔撞。
上述方法如果查找的是不存在的元素藐窄,則會(huì)拋出異常践叠。
dictionary.get(key)
- “dictionary”為字典冯事。
- “key”是鍵名泼疑。
該方法如果查找的是不存在的元素,則返回“None”岔帽。
⑵ 改
修改字典的值只需要在查看該值之后直接賦上新值即可倦始。
dictionary[key] = new_value
- “dictionary”為字典。
- “key”是修改值的鍵名山卦。
- “new_value”為修改后的值。
⑶ 增
dictionary[new_key] = new_value
- “dictionary”為字典诵次。
- “new_key”是增加元素(鍵值對)的鍵名账蓉。
- “new_value”為增加元素(鍵值對)的值。
⑷ 刪
del dictionary[key]
- “dictionary”為字典逾一。
- “key”是鍵名铸本。
上述方法將直接刪除字典指定的元素(鍵值對)。
dictionary.pop(key)
- “dictionary”為字典遵堵。
- “key”是鍵名箱玷。
上述方法將直接刪除字典指定的元素(鍵值對),并返回刪除的值陌宿。
dictionary.popitem()
- 不需要參數(shù)锡足。
上述方法將隨機(jī)刪除字典的一個(gè)元素(鍵值對),并以元組的形式返回刪除的鍵值對壳坪,元組的第1個(gè)元素為刪除的鍵舶得,第2個(gè)元素為刪除的值。
⑸ 舉例
⑤ 字典的屬性
⑴ 屬性
屬性 | 含義 | 用法 |
---|---|---|
dict.values() | 獲取字典中所有的值(可進(jìn)行遍歷) | 不需要參數(shù) |
dict.keys() | 獲取字典中所有的鍵名(可進(jìn)行遍歷) | 不需要參數(shù) |
dict.items() | 獲取字典中所有的鍵值對(可進(jìn)行遍歷) | 不需要參數(shù) |
dict.setdefault(key[, default=None]) | 返回key對應(yīng)的值 | 如果 key 在 字典中爽蝴,返回對應(yīng)的值沐批。如果不在字典中纫骑,則插入 key 及設(shè)置的默認(rèn)值 default,并返回 default 九孩,default 默認(rèn)值為 None先馆。 |
dict.fromkeys(seq[, default=None]) | 創(chuàng)建新字典,seq的元素作為新字典的鍵躺彬,default作為默認(rèn)值 | seq為指定序列煤墙,其元素作為新字典的鍵;default可有可無顾患,表示新字典鍵的默認(rèn)值番捂。若無default則默認(rèn)值為None,default值可自定義江解。 |
dict.update(dict2) | 把字典dict2的鍵/值對更新到dict里 | dict2是字典设预。若dict與dict2有相同的鍵,則更新dict2的值到dict犁河;若dict沒有dict2中的鍵鳖枕,則添加dict2的鍵值對到dict中 |
dict.clear() | 把字典清空 | 不需要參數(shù) |
dict.copy() | 淺復(fù)制字典 | 不需要參數(shù)。原字典修改不可變對象的值桨螺,復(fù)制的字典值不變宾符;原字典修改可變對象的值,復(fù)制的字典其對應(yīng)值也發(fā)生改變 |
⑵ 舉例
⑥ 字典推導(dǎo)式
字典推導(dǎo)式又稱字典生成式或字典解析式灭翔,是通過固定語法生成字典的方式魏烫。
[<key_expression>:<value_expression> for <key>, <value> in <iterable> if <condtion>]
其中:
“<key_expression>”是字典的鍵所滿足的表達(dá)式,也可以只是鍵本身肝箱。
“<value_expression>”是字典的值所滿足的表達(dá)式哄褒,也可以只是值本身。
“<key>”表示字典的鍵煌张,要與“<key_expression>”中的鍵名保持一致呐赡。
“<value>”表示字典的值,要與“<value_expression>”中的值保持一致骏融。
“<iterable>”是可迭代對象链嘀。
“if <condition>”是元素的鍵和值的取值條件,可有可無档玻。
舉例:
三怀泊、流程控制語句
1. 條件控制
① 語法一:if
if 條件:
代碼塊
該情況只有一個(gè) if
語句,表示當(dāng)條件成立時(shí)窃肠,執(zhí)行代碼塊包个,否則就繼續(xù)執(zhí)行主程序。
例如:
② 語法二:if...else...
if 條件:
代碼塊1
else:
代碼塊2
當(dāng) if
語句條件成立時(shí),執(zhí)行 代碼塊1碧囊;否則執(zhí)行 else
語句的代碼塊2树灶。然后再繼續(xù)執(zhí)行主程序。
例如:
③ 語法三:if...elif...else...
if 條件1:
代碼塊1
elif 條件2:
代碼塊2
else:
代碼塊3
當(dāng) if
語句條件1成立時(shí)糯而,執(zhí)行 代碼塊1天通;否則判斷 elif
語句條件2是否成立,若成立熄驼,則執(zhí)行代碼塊2像寒;若不成立,則執(zhí)行 else
語句的代碼塊3瓜贾。然后再繼續(xù)執(zhí)行主程序诺祸。
例如:
④ 語法四:三元運(yùn)算符
三元運(yùn)算符又稱三目運(yùn)算符,主要用于賦值使用祭芦。簡單的 if...else...
語句可以改寫為三元運(yùn)算符筷笨;但當(dāng)三元運(yùn)算符的長度超過每行的最大字符限制時(shí),仍要用 if...else...
語句龟劲。
value1 if 條件 else value2
當(dāng)條件成立時(shí)取“value1”胃夏,當(dāng)條件不成立時(shí)取“value2”。
例如:
⑤ 注意
其中"判斷條件"成立時(shí)(非零)昌跌,則執(zhí)行后面的語句仰禀,而執(zhí)行內(nèi)容可以多行,以縮進(jìn)來區(qū)分表示同一范圍蚕愤。
else
為可選語句答恶,當(dāng)需要在條件不成立時(shí)執(zhí)行內(nèi)容則可以執(zhí)行相關(guān)語句,if
語句的判斷條件可以用>
萍诱、<
亥宿、==
、>=
砂沛、<=
、!=
或布爾值(也可以是1或0)來表示其關(guān)系曙求。elif
是當(dāng)判斷條件為多個(gè)值時(shí)才使用碍庵。若判斷條件為一個(gè),則使用if...else...
即可悟狱。多個(gè)條件判斷静浴,只能用
elif
來實(shí)現(xiàn)。如果一個(gè)判斷條件中需要多個(gè)條件需同時(shí)進(jìn)行判斷時(shí)挤渐,可以使用or
苹享,表示多個(gè)條件有一個(gè)成立時(shí)則整個(gè)判斷條件成立;使用and
表示多個(gè)條件有一個(gè)不成立時(shí)則整個(gè)判斷條件都不成立。-
條件判斷的優(yōu)先級:
- 當(dāng)if有多個(gè)條件時(shí)可使用括號來區(qū)分判斷的先后順序得问,括號中的判斷優(yōu)先執(zhí)行囤攀。
-
and
和or
的優(yōu)先級低于比較操作符號,即比較操作符在沒有括號的情況下會(huì)比邏輯操作符要優(yōu)先判斷宫纬。
2. 循環(huán)語句
① for循環(huán)
⑴ for循環(huán)流程圖
由圖可知焚挠,表達(dá)式只執(zhí)行1次,然后進(jìn)行條件判斷漓骚;只有滿足條件才會(huì)進(jìn)入循環(huán)蝌衔,執(zhí)行循環(huán)體代碼,并在每次循環(huán)體代碼執(zhí)行結(jié)束后再度判斷條件蝌蹂,直到條件不滿足噩斟,跳出循環(huán),繼續(xù)執(zhí)行主程序孤个,然后結(jié)束剃允。
⑵ 語法
for variable in iterable:
<loop body>
else:
<statements>
“variable”表示變量。
“iterable”表示可迭代對象硼身。
“<loop body>”表示循環(huán)體代碼硅急。
“<statements>”表示跳出
for
循環(huán)后執(zhí)行的代碼,即條件不滿足時(shí)執(zhí)行的代碼佳遂。該部分可有可無愈涩。
語法含義為:如果變量“variable”在“iterable”當(dāng)中,執(zhí)行循環(huán)體代碼塊“<loop body>”离熏;否則執(zhí)行 else
語句代碼“<statements>”杰扫。
⑶ range()函數(shù)
在 for
循環(huán)的語法中,“iterable”部分常用 range()
函數(shù)吩屹,用于獲取數(shù)字跪另。
range([start_num, ]end_num[, step])
- “start_num”表示起始數(shù)字。
- “end_num”表示截止數(shù)字煤搜。
- “step”表示步長免绿。
- 如果
range()
函數(shù)中只有1個(gè)參數(shù),那么該參數(shù)表示截止數(shù)字擦盾,起始數(shù)字將默認(rèn)從0開始嘲驾,步長默認(rèn)為1。 -
range()
函數(shù)的取值是遵循“前閉后開”的原則迹卢,即[start_num, end_num)
或start_num ≤ value < end_num
辽故。
⑷ 舉例
② while循環(huán)
⑴ while循環(huán)流程圖
由圖可知,當(dāng)滿足 while
后的判斷條件時(shí)腐碱,將會(huì)進(jìn)入循環(huán)體誊垢,并執(zhí)行循環(huán)體代碼。每一次循環(huán)體代碼執(zhí)行完畢,都會(huì)再次執(zhí)行判斷條件喂走,直到不滿足判斷條件殃饿,就跳出循環(huán)體,繼續(xù)執(zhí)行主程序代碼缴啡,然后結(jié)束壁晒。
⑵ 語法
while <condition>:
<loop body>
else:
<statements>
“<condition>”表示判斷是否進(jìn)入循環(huán)體的條件。
“<loop body>”表示循環(huán)體代碼业栅。
“<statements>”表示當(dāng)跳出循環(huán)體時(shí)執(zhí)行的代碼秒咐。
else
語句可有可無。
代碼含義是:當(dāng)滿足循環(huán)判斷條件“<condition>”時(shí)碘裕,進(jìn)入循環(huán)體携取,執(zhí)行代碼“<loop body>”;直到不再滿足判斷條件“<condition>”帮孔,便執(zhí)行 else
語句的代碼“<statements>”雷滋。
⑶ 簡單語句組
while (<condition>): <loop body>
類似于三元運(yùn)算符,當(dāng) while
的判斷條件“<condition>”和循環(huán)體“<loop body>”非常簡單時(shí)文兢,可以使用上述語法格式來構(gòu)造 while
循環(huán)晤斩。
例如:
⑷ 無限循環(huán)
當(dāng)條件永遠(yuǎn)為真時(shí),即條件永遠(yuǎn)滿足姆坚,這時(shí)進(jìn)入循環(huán)體將無法自動(dòng)結(jié)束循環(huán)澳泵,想要結(jié)束循環(huán)體只能按 CTRL C
來終止運(yùn)行。這種情況叫做無限循環(huán)兼呵,也稱為死循環(huán)兔辅。
想要構(gòu)造無限循環(huán),可以自定義一個(gè)永遠(yuǎn)滿足的條件击喂,也可以簡單的把判斷條件設(shè)置為 1
或 True
维苔。
無限循環(huán)的使用場景:
- 游戲界面的實(shí)時(shí)刷新。
- 服務(wù)器上客戶端的實(shí)時(shí)請求懂昂。
- ......
例如:
⑸ 舉例
③ continue 和 break
contiue
語句的作用是跳過當(dāng)前循環(huán)介时,執(zhí)行下一輪循環(huán)。如果當(dāng)前循環(huán)后邊仍有代碼未執(zhí)行凌彬,那么也直接跳到下一輪循環(huán)潮尝。可以用于 for
和 while
循環(huán)中饿序。
break
語句的作用是跳出整個(gè)循環(huán)體。如果接下來仍有循環(huán)未進(jìn)行羹蚣,那么不再執(zhí)行余下循環(huán)原探,跳出整個(gè)循環(huán)體。可以用于 for
和 while
循環(huán)中咽弦。
例如:
④ pass
pass
是空語句徒蟆,是為了保持程序結(jié)構(gòu)的完整性。
pass
不做任何事情型型,一般用做占位語句段审。
例如:
class Test(object):
pass
def test():
pass
一、函數(shù)
1. 函數(shù)的定義
函數(shù)是組織好的闹蒜,可重復(fù)使用的寺枉,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段绷落。
能夠被稱為函數(shù)的代碼段姥闪,具有以下特點(diǎn):
- 代碼段被封裝。
- 具有特定的名稱作為函數(shù)名砌烁。
- 可以通過調(diào)用函數(shù)名來執(zhí)行函數(shù)筐喳。
2. 函數(shù)的特點(diǎn)
在工作當(dāng)中,一個(gè)項(xiàng)目都包含多種功能函喉,而項(xiàng)目的正常運(yùn)行也都是各個(gè)功能發(fā)揮著各自的作用避归。然而,某些功能或許在項(xiàng)目進(jìn)行過程中會(huì)被反復(fù)使用管呵,那么被重復(fù)使用的功能代碼段的反復(fù)出現(xiàn)將降低代碼的運(yùn)行效率梳毙。這時(shí),使用函數(shù)將該功能封裝撇寞,并在每一使用該功能時(shí)都調(diào)用特定的函數(shù)名顿天,不僅提高了代碼的運(yùn)行效率,也減少了重復(fù)代碼蔑担。在代碼后期的維護(hù)過程中牌废,只需對函數(shù)代碼進(jìn)行維護(hù),由于函數(shù)的調(diào)用方式是不變的啤握,不需要對其他函數(shù)調(diào)用之處進(jìn)行重復(fù)維護(hù)鸟缕,降低了維護(hù)復(fù)雜度。被封裝為函數(shù)的代碼段在日后的項(xiàng)目當(dāng)中也可以被使用或加入到其他功能當(dāng)中排抬,具有較強(qiáng)的擴(kuò)展性懂从。
簡言之,使用函數(shù)的優(yōu)勢在于:
- 減少重復(fù)代碼蹲蒲。
- 代碼便于維護(hù)番甩。
- 程序可擴(kuò)展性強(qiáng)。
3. 語法
① 定義函數(shù)
def 函數(shù)名([參數(shù)1, 參數(shù)2, ..., 參數(shù)N]):
"""
函數(shù)的解釋說明文字
"""
函數(shù)體
[return 返回值]
-
必需要素:
- 以
def
開頭届搁。 - 確定的函數(shù)名缘薛,可自定義窍育,通常以小寫字母開頭,并與
def
以空格隔開宴胧。 - 在函數(shù)名后必須有英文半角的括號()和冒號漱抓。
- 函數(shù)體中的代碼前均需縮進(jìn)。
- 以
-
非必需要素:
- 參數(shù)為非必需要素恕齐,函數(shù)可以沒有參數(shù)乞娄,也可以有1個(gè)或多個(gè)參數(shù)。多個(gè)參數(shù)之間以英文半角逗號隔開显歧。
- 函數(shù)的解釋說明文字為非必需要素仪或,但建議為函數(shù)匹配相應(yīng)的解釋說明。解釋說明內(nèi)容前后均要有3個(gè)英文半角單引號或雙引號追迟。
-
return 返回值
為非必需要素溶其。
② 調(diào)用函數(shù)
函數(shù)名([參數(shù)1, 參數(shù)2, ..., 參數(shù)N])
-
必需要素:
- 被調(diào)用函數(shù)的函數(shù)名。
- 緊接著函數(shù)名后的英文半角括號()敦间。
非必需要素:參數(shù)瓶逃。須遵循定義函數(shù)時(shí)的參數(shù)個(gè)數(shù),即調(diào)用函數(shù)時(shí)參數(shù)的個(gè)數(shù)需要與定義函數(shù)時(shí)參數(shù)的個(gè)數(shù)相等廓块,否則會(huì)報(bào)錯(cuò)厢绝。
③ 舉例
二、參數(shù)
1. 形式參數(shù)和實(shí)際參數(shù)
形式參數(shù):形式參數(shù)又稱形參带猴,是在定義函數(shù)時(shí)寫在函數(shù)名后的括號中的參數(shù)昔汉。形參變量只有在被調(diào)用時(shí)才分配內(nèi)存單元,在調(diào)用結(jié)束時(shí)拴清,即刻釋放所分配的內(nèi)存單元靶病。因此,形參只在函數(shù)內(nèi)部有效口予。函數(shù)調(diào)用結(jié)束返回主調(diào)用函數(shù)后則不能再使用該形參變量娄周。
實(shí)際參數(shù):實(shí)際參數(shù)又稱實(shí)參,是在調(diào)用函數(shù)時(shí)卸載函數(shù)名后的括號中的參數(shù)沪停,用于把實(shí)際的參數(shù)值傳入函數(shù)中進(jìn)行執(zhí)行和運(yùn)算的參數(shù)煤辨。實(shí)參可以是常量、變量木张、表達(dá)式口渔、函數(shù)等刃滓。無論實(shí)參是何種類型的量搔驼,在進(jìn)行函數(shù)調(diào)用時(shí)尉桩,它們都必須有確定的值,以便把這些值傳送給形參妻献。因此應(yīng)預(yù)先用賦值蛛株,輸入等辦法使參數(shù)獲得確定值虚婿。
-
例如:
2. 位置參數(shù)和關(guān)鍵字參數(shù)
位置參數(shù):在調(diào)用函數(shù)時(shí),實(shí)參的順序應(yīng)與定義函數(shù)時(shí)形參的順序保持一致泳挥,因?yàn)镻ython在傳參時(shí),是按照順序?qū)?shí)參傳遞給形參的至朗。因此屉符,按順序傳參的方法就是位置傳參。
關(guān)鍵字參數(shù):在參數(shù)傳遞時(shí)锹引,若不想按順序傳參矗钟,可以使用
形參=值
的方式作為實(shí)參進(jìn)行參數(shù)傳值。這種傳參方法稱為關(guān)鍵字傳參嫌变。關(guān)鍵字傳參不考慮形參的順序吨艇,因?yàn)樵摲椒ㄖ该髁藢槟硞€(gè)形參傳遞確切的值。注意:位置傳參和關(guān)鍵字傳參可以結(jié)合使用腾啥。但是东涡,關(guān)鍵字傳參之前的參數(shù)傳值可以是位置傳參;一旦出現(xiàn)關(guān)鍵字傳參倘待,則后邊的參數(shù)必須用關(guān)鍵字傳參疮跑。
-
例如:
3. 默認(rèn)參數(shù)
默認(rèn)參數(shù):默認(rèn)參數(shù)指的是在形參中為參數(shù)賦缺省值。在實(shí)參傳參時(shí)凸舵,若未給默認(rèn)參數(shù)傳值祖娘,則使用缺省值;若為默認(rèn)參數(shù)傳值啊奄,則使用實(shí)參的值渐苏。
注意:默認(rèn)參數(shù)必須位于所有非默認(rèn)形參之后。
-
例如:
4. 非固定參數(shù)(不定長參數(shù))
① 定義
非固定參數(shù):又稱不定長參數(shù)菇夸。當(dāng)定義函數(shù)時(shí)無法預(yù)估需要傳入多少個(gè)實(shí)參時(shí)琼富,可以使用非固定參數(shù)來接受參數(shù)的傳遞,由于無法預(yù)知參數(shù)的個(gè)數(shù)峻仇,因此這種參數(shù)也稱為不定長參數(shù)公黑。
② 類型
元組型:形參名前有1個(gè)星號(*) 的形參即為元組類型的不定長參數(shù)。加了星號(*)的變量名會(huì)存放所有未命名的變量參數(shù)摄咆,即在傳參時(shí)凡蚜,若傳入多個(gè)參數(shù),這些參數(shù)將會(huì)是一個(gè)元組吭从;若未傳入?yún)?shù)朝蜘,則這個(gè)參數(shù)為一個(gè)空元組。
字典型:形參名前有2個(gè)星號(**)的形參即為字典類型的不定長參數(shù)涩金,也稱關(guān)鍵字類型不定長參數(shù)谱醇。類似于元組型不定長參數(shù)暇仲,字典型不定長參數(shù)在傳參時(shí),可以傳入任意個(gè)參數(shù)副渴,但傳遞參數(shù)的方式只能是關(guān)鍵字傳參奈附,即
實(shí)參1=值1, 實(shí)參2=值2, ..., 實(shí)參N=值N
。傳遞的參數(shù)將是一個(gè)由“鍵值對”構(gòu)成的字典煮剧,其中斥滤,“鍵”即是實(shí)參名,“值”即是為實(shí)參賦的值勉盅。
③ 注意
元組型不定長參數(shù)和字典型不定長參數(shù)在星號之后的形參名可以自定義為任意名稱佑颇。但我們習(xí)慣把元組型用
*args
,把字典型用**kwargs
表示草娜,分別為“arguments”和“keyword arguments”的縮寫挑胸。元組型不定長參數(shù)和字典型不定長參數(shù)可以和普通參數(shù)結(jié)合使用,其位置順序應(yīng)當(dāng)遵循:普通參數(shù)宰闰,默認(rèn)參數(shù)茬贵,元組型不定長參數(shù),字典型不定長參數(shù)议蟆。在上述位置順序中闷沥,不建議使用默認(rèn)參數(shù)。
元組型不定長參數(shù)和字典型不定長參數(shù)既可以單獨(dú)使用咐容,也可以結(jié)合使用舆逃,但字典型不定長參數(shù)必須放在元組型不定長參數(shù)之后。
④ 舉例
三戳粒、變量
1. 全局變量
① 定義
在函數(shù)外部定義的變量稱為全局變量路狮。
② 作用域
全局變量是在整個(gè) .py
文件中聲明的,作用于整個(gè) .py
程序蔚约,全局范圍內(nèi)都可以訪問奄妨。
2. 局部變量
① 定義
在函數(shù)內(nèi)部定義的變量稱為局部變量。
② 作用域
局部變量是在某個(gè)函數(shù)中聲明的苹祟,只能在該函數(shù)中調(diào)用它砸抛。
3. 全局變量與局部變量舉例
4. global 與 nonlocal
① 使用場景和語法
在 .py
程序中,當(dāng)函數(shù)內(nèi)部定義的局部變量與某個(gè)全局變量重名時(shí)树枫,是無法直接修改全局變量的直焙,Python將會(huì)把函數(shù)內(nèi)的局部變量視為新定義的變量。如果想實(shí)現(xiàn)在函數(shù)內(nèi)部修改全局變量砂轻,需要在函數(shù)內(nèi)部使用 global 變量名
語法來聲明奔誓。
同樣,如果函數(shù)1中嵌套了函數(shù)2搔涝,函數(shù)2中存在于函數(shù)1中重名的變量厨喂。雖然函數(shù)1中的變量相對于函數(shù)2來說類似“全局變量”和措,但嚴(yán)格意義上,它還是局部變量蜕煌,因此不能直接在函數(shù)2中使用 global
語法聲明并對變量進(jìn)行修改派阱。若想要修改變量,需要使用 nonlocal 變量名
語法來聲明斜纪。
② nonlocal的特別說明
nonlocal只存在在Python 3.x的版本當(dāng)中颁褂,在Python 2.x的版本中無法使用。
③ 舉例
5. Python的變量作用域
① 類型
在Python中傀广,變量作用域一共有4種,分別是:
- L(Local):局部作用域彩届。
- E(Enclosing):閉包函數(shù)外的函數(shù)中伪冰。
- G(Global):全局作用域。
- B(Built-in):內(nèi)建作用域樟蠕。
② 變量查找規(guī)則
Python的變量查找規(guī)則為:L → E → G → B贮聂。
即:當(dāng)Python無法在局部中找到變量時(shí),便會(huì)查找局部外的局部中找(如閉包函數(shù)外的函數(shù)中)寨辩,如果還找不到吓懈,則會(huì)查找全局,最后查找內(nèi)建靡狞。
③ 查看內(nèi)建名稱空間的內(nèi)容
import builtins
dir(builtins)
④ 閉包
⑴ 定義
函數(shù)中嵌套了一個(gè)函數(shù)耻警。最外層的函數(shù)我們稱為“外部函數(shù)”,嵌套在內(nèi)的函數(shù)我們稱為“內(nèi)部函數(shù)”甸怕。內(nèi)部函數(shù)中引用了外部函數(shù)的變量甘穿,但不能引用全局變量,且外部函數(shù)的返回值為內(nèi)部函數(shù)的函數(shù)名梢杭。此時(shí)温兼,便構(gòu)成了一個(gè)閉包。
簡言之武契,當(dāng)函數(shù)滿足以下結(jié)構(gòu)時(shí)募判,我們可以將其視為閉包。
def outer_function():
"""
外部函數(shù)
"""
outer_var = value # 定義變量 outer_var咒唆,value可以是任何值
def inner_function():
"""
內(nèi)部函數(shù)
"""
print('引用變量:', outer_var) # 引用外部函數(shù)的變量
return inner_function # 外部函數(shù)的返回值為內(nèi)部函數(shù)名
⑵ 必需條件
必須存在函數(shù)嵌套届垫。
內(nèi)部函數(shù)必須引用外部函數(shù)的變量。
內(nèi)部函數(shù)必須不能引用全局變量钧排。
外部函數(shù)的返回值必須是內(nèi)部函數(shù)的函數(shù)名敦腔。
⑶ 變量內(nèi)存的釋放
通常情況下,當(dāng)一個(gè)函數(shù)運(yùn)行結(jié)束恨溜,函數(shù)內(nèi)部的所有東西都會(huì)釋放掉符衔,還給內(nèi)存找前,函數(shù)的局部變量也會(huì)因此消失。然而判族,閉包是一種特殊情況躺盛,如果外部函數(shù)在結(jié)束時(shí)發(fā)現(xiàn)其變量會(huì)在內(nèi)部函數(shù)中被使用,就會(huì)把這個(gè)變量綁定給內(nèi)部函數(shù)形帮,然后再結(jié)束自己的運(yùn)行槽惫。
⑷ 簡單閉包的舉例
⑸ 閉包的特有屬性
只要是閉包醒叁,都有 __closure__
屬性残家。該屬性返回閉包應(yīng)用外圍作用域(即外部函數(shù)中)的變量內(nèi)存地址蝌诡,結(jié)果是一個(gè)元組饼拍。語法為:外部函數(shù)().__closure__
割去。
如果函數(shù)不是閉包赖条,則 __closure__
返回“None”坟瓢。
可以通過打印 外部函數(shù)().__closure__[數(shù)字].cell_contents
來獲取外部函數(shù)變量的值鳞仙。其中君躺,“數(shù)字”即為元組元素的索引峭判,從0開始。
例如:
四棕叫、return
1. 作用
return 返回值
用于獲取函數(shù)的執(zhí)行結(jié)果林螃。
2. 注意
① 在函數(shù)的執(zhí)行過程中,遇到 return
即停止運(yùn)行函數(shù)并返回 return
的值俺泣。return
后如果還有代碼疗认,則不會(huì)再執(zhí)行。因此伏钠,return
也意味著當(dāng)前函數(shù)的結(jié)束侮邀。
② 當(dāng)函數(shù)沒有定義 return
語句時(shí),Python在執(zhí)行函數(shù)時(shí)默認(rèn)將返回值設(shè)為“None”贝润,等同于 return None
绊茧。
3. 舉例
五、匿名函數(shù)——lambda
六打掘、裝飾器
1. 定義
裝飾器是用于裝飾其他函數(shù)华畏,為其他函數(shù)增加附加功能的函數(shù)。
2. 本質(zhì)
裝飾器的本質(zhì)是函數(shù)尊蚁。
3. 原則
① 不能修改被裝飾函數(shù)的源代碼亡笑。
② 不能修改被裝飾函數(shù)的調(diào)用方式。
4. 裝飾器的構(gòu)成
高階函數(shù) + 嵌套函數(shù) ? 裝飾器
5. 變量和函數(shù)的內(nèi)存存儲方式
如圖所示横朋,內(nèi)存中有著若干“房間”用于存放數(shù)據(jù)仑乌。當(dāng)為一個(gè)變量賦值后,賦的值將被存放在內(nèi)存中,生成固定的內(nèi)存地址晰甚,而變量名便成了存放該值的“房間”的“門牌號”衙传。只有被賦予變量的值,才會(huì)保留在內(nèi)存當(dāng)中厕九;如果內(nèi)存中的值沒有賦予變量蓖捶,或被賦予變量后被刪除了變量,Python的內(nèi)存回收機(jī)制會(huì)自動(dòng)將該值的內(nèi)存地址清理掉扁远。
例如: a = 1
中俊鱼,“a”為變量名,“1”是賦予變量“a”的值畅买。因此并闲,“a”即為“1”的“門牌號”。此時(shí)谷羞,“1”擁有獨(dú)一無二的內(nèi)存地址焙蚓,而變量“a”只是指向該內(nèi)存地址∪鞅Γ“1”也可以被賦給其他變量,方式可以是多種的萌京,如 b = 1
或 b = a
雁歌,這些均表示變量“b”指向“1”的內(nèi)存地址。因此知残,當(dāng)引用“a”或“b”時(shí)靠瞎,其實(shí)是Python查找其指向的內(nèi)存地址,從而找到“1”的求妹。如果想刪除變量乏盐,可以使用 del 變量名
,如 del a
制恍,此時(shí)父能,“a”將會(huì)被刪除,如果再刪除“b”(del b
)净神,那么“1”的內(nèi)存地址將會(huì)被Python回收何吝。
同理,函數(shù)也可被視為“變量”鹃唯。
由于函數(shù)的基本語法結(jié)構(gòu)為:
def 函數(shù)名():
函數(shù)體
這等同于 函數(shù)名 = 函數(shù)體
這樣的“變量”賦值爱榕,不同之處在于,變量可以被直接引用坡慌,而函數(shù)需要通過 函數(shù)名()
的方式被調(diào)用黔酥。
如果函數(shù)為匿名函數(shù),那么整個(gè)匿名函數(shù)將被分配一個(gè)內(nèi)存地址,當(dāng)使用完畢后跪者,其內(nèi)存地址將被Python回收棵帽。若想保留其內(nèi)存地址,可以將匿名函數(shù)整體賦給一個(gè)變量坑夯,此時(shí)岖寞,變量名即為這個(gè)匿名函數(shù)的“門牌號”,匿名函數(shù)的內(nèi)存地址也因此將被保留下來柜蜈。
總而言之仗谆,只有當(dāng)值(函數(shù)體)被賦予變量(具有函數(shù)名)時(shí),其內(nèi)存地址才將會(huì)保留下來淑履,否則將會(huì)被Python的內(nèi)存回收機(jī)制回收隶垮。通俗地講,只有具有“門牌號”的“房間”才會(huì)被保留“地址”秘噪。
6. 高階函數(shù)
① 高階函數(shù)的必需條件
把一個(gè)函數(shù)(函數(shù)1)的函數(shù)名作為實(shí)參傳遞給另一個(gè)函數(shù)(函數(shù)2)狸吞。 可以實(shí)現(xiàn)在不修改被裝飾函數(shù)源代碼的前提下為其增加功能。
函數(shù)2的返回值是函數(shù)1的函數(shù)名指煎。 可以實(shí)現(xiàn)不修改原函數(shù)的調(diào)用方式蹋偏。
② 高階函數(shù)舉例
7. 嵌套函數(shù)
① 定義
顧名思義,嵌套函數(shù)就是在一個(gè)函數(shù)的函數(shù)體內(nèi)定義另一個(gè)函數(shù)至壤。
② 嵌套函數(shù)舉例
③ 注意
嵌套函數(shù)中威始,不能直接調(diào)用被包含的函數(shù),需要在外部的函數(shù)體內(nèi)調(diào)用被包含的函數(shù)像街,然后在整個(gè)函數(shù)外對外部函數(shù)進(jìn)行調(diào)用黎棠。
8. 裝飾器
① 基礎(chǔ)版——原函數(shù)無參數(shù)且無return
# 定義裝飾器
def decorator(function):
def body():
函數(shù)體
function()
return body
# 使用裝飾器
@decorator
def function():
函數(shù)體
上述函數(shù)名均可自定義。
@decorator ? function = decorator(function) = body
-
舉例:
② 進(jìn)階版——原函數(shù)有參數(shù)且有return
# 定義裝飾器
def decorator(function):
def body(*args, **kwargs):
函數(shù)體
ret = function(*args, **kwargs)
return ret
return body
# 使用裝飾器
@decorator
def function(參數(shù)1, 參數(shù)2, ..., 參數(shù)N):
函數(shù)體
return 返回值
上述函數(shù)名均可自定義镰绎。
@decorator ? function = decorator(function) = body
print(function(參數(shù)1, 參數(shù)2, ..., 參數(shù)N))
既執(zhí)行了原函數(shù)function脓斩,又執(zhí)行了為原函數(shù)增加的功能body函數(shù),同時(shí)也打印了原函數(shù)function的返回值畴栖。原函數(shù)名function將作為實(shí)參傳入decorator函數(shù)随静;原函數(shù)的參數(shù)將作為實(shí)參傳入body函數(shù)。
-
舉例:
③ 高階版——裝飾器和原函數(shù)都有參數(shù)
# 定義裝飾器
def decorator(*dec_args, **dec_kwargs):
def function(func):
def body(*func_args, **func_kwargs):
函數(shù)體
return func(*func_args, **func_kwargs)
return body
return function
# 使用裝飾器
@decorator(參數(shù)1, 參數(shù)2, ..., 參數(shù)N)
func(參數(shù)1, 參數(shù)2, ..., 參數(shù)N)
上述函數(shù)名均可自定義吗讶。
裝飾器參數(shù)將作為實(shí)參傳給decorator函數(shù)挪挤;原函數(shù)名func將作為實(shí)參傳給function函數(shù);原函數(shù)的參數(shù)將作為實(shí)參傳入body函數(shù)关翎。
body函數(shù)的返回值為原函數(shù)func及其參數(shù)扛门,因此,可以調(diào)用并打印原函數(shù)的返回值纵寝。
具體應(yīng)用場景:頁面登錄论寨。
-
舉例:
七星立、可迭代對象、迭代器和生成器
0. 容器葬凳、可迭代對象绰垂、迭代器和生成器關(guān)系圖
1. 可迭代對象(Iterable)
① 定義
可以直接用for循環(huán)的對象被稱為可迭代對象(Iteralbe)。
② 類型
可迭代對象主要包括:
容器:字符串(str)纯赎、列表(list)谦疾、字典(dict)、集合(set)犬金。
生成器(generator)以及帶yiled字段的函數(shù)念恍。
③ 判斷方法
from collections import Iterable
isinstance(object, Iterable)
注意:
- “Iterable”首字母須大寫。
- “object”是需要被判斷的對象晚顷。
2. 迭代器(Iterator)
① 定義
可以被 next()
函數(shù)調(diào)用(或具有 __next__()
方法)并不斷返回下一個(gè)值的對象被稱為迭代器(Iterator)峰伙。
注意:所有的迭代器均為可迭代對象;但不是所有的可迭代對象都是迭代器该默。
② 判斷方法
from collections import Iterator
isinstance(object, Iterator)
注意:
- “Iterator”首字母須大寫瞳氓。
- “object”是需要被判斷的對象。
③ 可迭代對象轉(zhuǎn)換為迭代器
iter(object)
- 注意:“object”必須是可迭代對象权均。
④ 讀取迭代器的內(nèi)容
讀取迭代器的方法有2個(gè):
next()
或__next__()
for循環(huán)遍歷
注意:當(dāng)使用 next()
或 __next__()
讀取迭代器內(nèi)容時(shí),每次只能讀取1個(gè)值锅锨,且下一次讀取將從下一個(gè)值讀起,無法讀取前邊的值。當(dāng)所有值都被讀取完畢橄镜,再運(yùn)行 next()
或 __next__()
將會(huì)拋出“StopIteration”異常括饶。
3. 生成器(Generator)
① 定義
生成器是一種特殊的迭代器,用于惰性地生產(chǎn)數(shù)據(jù)恕洲。生成器一定是迭代器和可迭代對象塔橡,反之不一定成立。
生成器均可用 next()
或 __next__()
以及 for循環(huán)來讀取值霜第。
② 類型
生成器表達(dá)式(Generator Expression):類似于列表推導(dǎo)式(也稱列表生成式)葛家,生成器表達(dá)式是將列表推導(dǎo)式的“[]”換成“()”。
生成器函數(shù)(Generator Function):顧名思義泌类,生成器函數(shù)類似于函數(shù)癞谒。凡是函數(shù)體中帶有
yield
字段的函數(shù),均為生成器函數(shù)。需要注意的是弹砚,普通函數(shù)的結(jié)束標(biāo)志是return 返回值
双仍,而生成器函數(shù)的中斷標(biāo)志是yield
,當(dāng)下一次讀取值時(shí)桌吃,將繼續(xù)從上一次的yiled
處開始往下讀取朱沃。
八、Python的內(nèi)置函數(shù)
1. Python內(nèi)置函數(shù)匯總表
2. 內(nèi)置函數(shù)詳解
菜鳥教程:Python內(nèi)置函數(shù)
3. ASCII碼表
九茅诱、遞歸
1. 遞歸的定義
若在函數(shù)內(nèi)部調(diào)用這個(gè)函數(shù)自身逗物,則該函數(shù)被稱為遞歸函數(shù)。
2. 遞歸的特性
① 必須有一個(gè)明確的結(jié)束條件让簿。
② 每次進(jìn)入更深一層遞歸時(shí)敬察,問題規(guī)模相比上次遞歸都應(yīng)有所減少。
③ 相鄰兩次重復(fù)之間有緊密的聯(lián)系尔当,前一次要為后一次做準(zhǔn)備莲祸,通常前一次的輸出就作為后一次的輸入。
④ 遞歸效率不高椭迎,遞歸層次過多會(huì)導(dǎo)致棧溢出锐帜。在計(jì)算機(jī)中,函數(shù)調(diào)用是通過棧(stack)這種數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的畜号,每當(dāng)進(jìn)入一個(gè)函數(shù)調(diào)用缴阎,棧就會(huì)加一層棧幀,每當(dāng)函數(shù)返回简软,棧就會(huì)減一層棧幀蛮拔。由于棧的大小不是無限的,所以痹升,遞歸調(diào)用的次數(shù)過多建炫,會(huì)導(dǎo)致棧溢出。因此疼蛾,遞歸又被稱為“用空間換時(shí)間”肛跌。
3. 遞歸的優(yōu)勢
遞歸函數(shù)的優(yōu)點(diǎn)是定義簡單,邏輯清晰察郁。理論上衍慎,所有的遞歸函數(shù)都可以寫成循環(huán)的方式,但循環(huán)的邏輯不如遞歸清晰皮钠。
4. 遞歸的最大次數(shù)及上限修改
遞歸的最大次數(shù)在1000次左右稳捆,根據(jù)問題的復(fù)雜度不同,遞歸次數(shù)上限也有浮動(dòng)麦轰。當(dāng)超過遞歸次數(shù)上限時(shí)眷柔,Python將會(huì)拋出異常:“RuntimeError: maximum recursion depth exceeded”期虾。
遞歸次數(shù)上限的修改:
import sys
sys.setrecursionlimit(num)
其中,“num”為自定義遞歸次數(shù)的上限值驯嘱。
需要注意的是镶苞,遞歸次數(shù)的上限并不是無限大的,sys.setrecursionlimit(num)
只是修改解釋器在解釋時(shí)允許的最大遞歸次數(shù)鞠评,此外茂蚓,限制最大遞歸次數(shù)的還和操作系統(tǒng)有關(guān)。
非常不建議修改遞歸次數(shù)的上限值剃幌。
5. 舉例
- 猴子吃桃問題:猴子摘下若干桃子聋涨。第1天吃桃子總數(shù)的一半,然后又多吃1個(gè)负乡,第2天吃剩下桃子的一半牍白,然后又多吃1個(gè),并在以后的每一天都吃剩下桃子的一半多1個(gè)抖棘。第10天茂腥,只剩下1個(gè)桃子。求第一天共摘桃子多少個(gè)切省?
一最岗、定義
1. 模塊
本質(zhì):模塊的本質(zhì)是
.py
結(jié)尾的Python文件。用途:從邏輯上組織Python代碼(變量朝捆、函數(shù)般渡、類、邏輯)芙盘,為了實(shí)現(xiàn)一個(gè)功能驯用。
名稱:文件名為
name.py
的文件其模塊名為name
。
2. 包
本質(zhì):包的本質(zhì)是一個(gè)目錄儒老,但必須帶有一個(gè)
__init__.py
文件蝴乔。用途:從邏輯上組織模塊。
二贷盲、導(dǎo)入模塊
1. 導(dǎo)入單個(gè)模塊
import module_name
- 注意:“module_name”不加“.py”后綴
2. 導(dǎo)入多個(gè)模塊
import module_name1, module_name2, module_nameN
- 注意:“module_name”之間以英文半角逗號隔開淘这。
3. 導(dǎo)入模塊的所有內(nèi)容
from module_name import *
- 注意:不建議使用這個(gè)方法剥扣。當(dāng)“module_name”中的方法(函數(shù))名與當(dāng)前文件的方法(函數(shù))名相同時(shí)巩剖,若調(diào)用重名方法(函數(shù))時(shí),需視情況而決定調(diào)用哪個(gè)方法(函數(shù))钠怯。
? 例:名為“module_test”的模塊內(nèi)容
def greeting():
print("Welcome to Module_test File!")
① 調(diào)用當(dāng)前文檔的方法(函數(shù))
- 導(dǎo)入模塊之前調(diào)用重名方法(函數(shù))
def greeting():
print("Welcome to Main File!")
greeting()
from module_test import *
運(yùn)行結(jié)果為:
Welcome to Main File!
- 導(dǎo)入模塊后佳魔,在當(dāng)前文檔的重名方法(函數(shù))之后調(diào)用重名方法(函數(shù))
from module_test import *
def greeting():
print("Welcome to Main File!")
greeting()
運(yùn)行結(jié)果為:
Welcome to Main File!
② 調(diào)用導(dǎo)入模塊的方法(函數(shù))
- 導(dǎo)入模塊之后在當(dāng)前文件的重名方法(函數(shù))之前調(diào)用重名方法(函數(shù))
from module_test import *
greeting()
def greeting():
print("Welcome to Main File!")
運(yùn)行結(jié)果為:
Welcome to Module_test File!
- 在當(dāng)前文件的重名方法(函數(shù))之后導(dǎo)入模塊,并調(diào)用重名方法(函數(shù))
def greeting():
print("Welcome to Main File!")
from module_test import *
greeting()
運(yùn)行結(jié)果為:
Welcome to Module_test File!
4. 導(dǎo)入模塊的特定內(nèi)容
from module_name import function_name
- 注意:
- “module_name”為引入的模塊名晦炊。
- “function_name”為從模塊中引入的方法(函數(shù))名鞠鲜。
- 如果引入的方法(函數(shù))名與當(dāng)前文件的方法(函數(shù))名重復(fù)宁脊,則可以使用as來命名別名。即:
from module_name import function_name as alias
贤姆, 其中“alias”可以被自定義的任意名稱所替換榆苞。
5. 導(dǎo)入包中的模塊
因?yàn)閷?dǎo)入包的本質(zhì)是執(zhí)行包中的 __init__
文件,因此霞捡,如果要導(dǎo)入包中的其他模塊坐漏,需要在包中的 __init__
文件中先導(dǎo)入模塊,再在當(dāng)前文檔中導(dǎo)入包即可碧信。
- 注意:
直接在
__init__
文件中導(dǎo)入包中的模塊會(huì)報(bào)錯(cuò)赊琳,即import module_name
的語法會(huì)報(bào)錯(cuò),需要使用from . import module_name
砰碴。其中躏筏,“.” 指的是__init__
文件所在的當(dāng)前目錄。若當(dāng)前文件與包不在同一級目錄呈枉,則需要先將包所在的目錄路徑添加在環(huán)境變量(路徑列表)中趁尼。具體方法參照“三、import本質(zhì)(路徑搜索和搜索路徑)”中的“3. 導(dǎo)入模塊的搜索路徑”
三碴卧、import本質(zhì)
1. 導(dǎo)入模塊的本質(zhì)
就是把模塊的Python文件解釋一遍弱卡,獲取模塊中的所有代碼。
2. 導(dǎo)入包的本質(zhì)
就是執(zhí)行包中的__init__.py
文件住册。
3. 導(dǎo)入模塊的搜索路徑
- 該部分主要說明Python在導(dǎo)入模塊時(shí)婶博,搜索模塊的路徑有哪些;如何獲取這些路徑荧飞;以及如何添加路徑以便跨目錄導(dǎo)入模塊凡人。
① Python搜索模塊的路徑列表
⑴ 查看路徑列表
導(dǎo)入模塊時(shí),要注意保證模塊與當(dāng)前文件處于同一級目錄叹阔;如果模塊與當(dāng)前文件不在同一級目錄挠轴,則需要把被導(dǎo)入模塊的路徑添加到Python搜索模塊的路徑列表當(dāng)中。Python在導(dǎo)入模塊時(shí)耳幢,是會(huì)根據(jù)一定的路徑集來對每個(gè)路徑逐個(gè)進(jìn)行搜索岸晦。路徑集是 sys
模塊下的 path
屬性,即可以通過打印 sys.path
來查看睛藻。 sys.path
是元素為路徑的列表启上,Python將會(huì)按照該列表的元素(路徑)順序?qū)δK進(jìn)行搜索。
⑵ 追加路徑
添加路徑到路徑列表當(dāng)中可以使用 sys.path.append(路徑)
實(shí)現(xiàn)店印,其中“路徑”指的是被導(dǎo)入模塊的絕對路徑冈在,這個(gè)語法將會(huì)把路徑追加到列表的最后。
⑶ 在指定位置添加路徑
由于Python搜索模塊時(shí)是按照路徑列表的元素順序進(jìn)行搜索的按摘,因此為了避免期間有其他的重名模塊被導(dǎo)入包券,可以使用sys.path.insert(0, 路徑)
對列表的第1個(gè)元素進(jìn)行路徑添加纫谅。其中“0”是列表第1個(gè)元素的索引,“路徑”是被導(dǎo)入模塊的絕對路徑溅固。
② 當(dāng)前文件名(相對路徑)
通過打印
__file__
可以獲取包含當(dāng)前文件相對路徑的文件名付秕,即:print(__file__)
。PyCharm中執(zhí)行此命令則會(huì)獲取包含當(dāng)前文件絕對路徑的文件名侍郭。因此建議使用vim編輯器來測試盹牧。
③ 當(dāng)前文件名(絕對路徑)
通過使用 os
模塊中 path.abspath
屬性可以獲取包含當(dāng)前文件絕對路徑的文件名,語法為 print(os.path.abspath(__file__))
励幼。
④ 當(dāng)前文件所在目錄名(相對路徑)
通過使用
os
模塊中path.dirname
屬性可以獲取包含當(dāng)前文件相對路徑的文件名但绕,語法為print(os.path.dirname(__file__))
杖刷。注意:其輸出結(jié)果取決于執(zhí)行Python文件命令時(shí)所處位置攒发。例如:名為
test.py
的Python文件其內(nèi)容為print(os.path.dirname(__file__)
贷岸,且該P(yáng)ython文件的絕對路徑為~/Desktop/test.py
。那么如果在~/Desktop/
位置中執(zhí)行文件嵌削,則結(jié)果為空毛好;如果在~/
中執(zhí)行文件,則結(jié)果為Desktop
苛秕。以此類推肌访。-
例:
⑤ 當(dāng)前文件所在目錄名(絕對路徑)
通過結(jié)合第③步和第④步可以獲取含有當(dāng)前文件所在目錄絕對路徑的目錄名。即 print(os.path.dirname(os.path.abspath(__file__)))
四艇劫、導(dǎo)入優(yōu)化
import module_name
可導(dǎo)入“module_name”模塊中的所有方法(函數(shù))吼驶。在當(dāng)前文件中對模塊中方法(函數(shù))的調(diào)用,其執(zhí)行順序?yàn)椋?/p>
查找名為“module_name”的Python文件店煞。
在“modul_name”文件中查找被調(diào)用的方法(函數(shù))蟹演。
執(zhí)行被調(diào)用的方法(函數(shù))。
如果在當(dāng)前文件中多次調(diào)用顷蟀,且調(diào)用次數(shù)達(dá)到相當(dāng)數(shù)量時(shí)酒请,每次調(diào)用都會(huì)執(zhí)行1-3步,這種執(zhí)行效率很低鸣个。
那么羞反,為了提高執(zhí)行效率,可以使用 from module_name import function_name
或 from module_name import function_name as alias
囤萤。此時(shí)昼窗,當(dāng)前文件調(diào)用模塊中名為“function_name”的方法(函數(shù))時(shí),其執(zhí)行順序?yàn)椋?/p>
查找名為“module_name”的Python文件阁将。
在“modul_name”文件中查找被調(diào)用的“function_name”方法(函數(shù))膏秫。
執(zhí)行“function_name”方法(函數(shù))右遭。
看似與上面步驟相同做盅,但其實(shí)第1步和第2步僅在導(dǎo)入模塊的方法(函數(shù))時(shí)執(zhí)行缤削,在調(diào)用方法(函數(shù))時(shí),僅執(zhí)行第3步吹榴。因此亭敢,多次調(diào)用方法(函數(shù))其實(shí)是多次執(zhí)行第3步,因?yàn)樵谕瓿傻?图筹、2步之后帅刀,被調(diào)用的方法(函數(shù))已經(jīng)被加載到當(dāng)前文件中。執(zhí)行效率會(huì)明顯提高远剩。
五扣溺、模塊的分類
1. 標(biāo)準(zhǔn)庫
Python標(biāo)準(zhǔn)庫也稱為Python的內(nèi)置模塊,是Python內(nèi)置的瓜晤、供開發(fā)者選擇性使用的锥余、有助于提升Python移植性和擴(kuò)展性的模塊。
內(nèi)置模塊用C語言編寫痢掠,提供了使用系統(tǒng)功能的接口驱犹;另一些用Python編寫的模塊能夠?yàn)槿粘>幊讨杏龅降膯栴}提供標(biāo)準(zhǔn)解決方案。 ——Python標(biāo)準(zhǔn)庫官方文檔
2. 開源模塊
開源模塊也稱第三方模塊足画,是他人為了實(shí)現(xiàn)某種功能而自己編寫的模塊雄驹,并將模塊代碼共享到互聯(lián)網(wǎng)可供任何人下載并使用的模塊。
3. 自定義模塊
自定義模塊是自己在編程過程中編寫的淹辞、方便自己調(diào)用的模塊医舆。
六、time 和 datetime 模塊
1. 時(shí)間的格式
① 格式化字符串
⑴ 格式及含義
格式 | 含義 | 解釋 |
---|---|---|
%y | 年 | 兩位數(shù)年 |
%Y | 年 | 四位數(shù)年 |
%m | 月 | 01到12 |
%d | 日 | 01到31 |
%H | 時(shí) | 00到23(24時(shí)計(jì)時(shí)法) |
%M | 分 | 00到59 |
%S | 秒 | 00到61(60和61為閏秒) |
%z | 時(shí)區(qū) | +為東時(shí)區(qū)象缀,-為西時(shí)區(qū) |
%a | 星期 | 英文縮寫 |
%A | 星期 | 英文全稱 |
%b | 月份 | 英文縮寫 |
%B | 月份 | 英文全稱 |
%c | 當(dāng)?shù)刈詈线m的日期時(shí)間表示方法 | 如:Thu Jan 25 14:17:55 2018 |
%I | 時(shí) | 01到12(12小時(shí)計(jì)時(shí)法) |
%p | 上午或下午 | AM 或 PM |
⑵ 例
- 執(zhí)行代碼:
import time
struct_time = time.localtime()
time_str = time.strftime("%Y-%m-%d %H:%M:%S 時(shí)區(qū):%z, 星期縮寫:%a, 星期全稱:%A, 月份簡稱:%b, 月份全稱:%B, 當(dāng)?shù)貢r(shí)間日期表示法:%c, 12小時(shí)計(jì)時(shí)法:%I, 上午或下午:%p", struct_time)
print(time_str)
- 輸出結(jié)果:
'2018-01-25 14:26:56 時(shí)區(qū):+0800, 星期縮寫:Thu, 星期全稱:Thursday, 月份簡稱:Jan, 月份全稱:January, 當(dāng)?shù)貢r(shí)間日期表示法:Thu Jan 25 14:26:56 2018, 12小時(shí)計(jì)時(shí)法:02, 上午或下午:PM'
② 時(shí)間戳
⑴ 定義
時(shí)間戳是當(dāng)前時(shí)間距離1970年1月1日0點(diǎn)相差的以秒為單位的浮點(diǎn)小數(shù)彬向。
⑵ 語法
import time
timestamp = time.time()
print(timestamp)
③ 時(shí)間元組
⑴ 定義
用一個(gè)9個(gè)元素的元組表示時(shí)間,該元組稱為 struct_time
元組攻冷。
⑵ 語法
import time
local_time = time.localtime()
print(local_time)
- 注意:
time.localtime()
括號中應(yīng)填寫數(shù)字娃胆,該數(shù)字表示秒。執(zhí)行原理為:計(jì)算括號中的數(shù)字(秒)表示的時(shí)間等曼,1970年1月1日0時(shí)0分0秒為0里烦。若獲取當(dāng)前時(shí)間,可以將括號留空禁谦,其等價(jià)于括號內(nèi)填寫time.time()
胁黑,即time.localtime() ? time.localtime(time.time())
⑶ 解釋
索引序號 | 屬性 | 含義 | 解釋 |
---|---|---|---|
0 | tm_year | 4位數(shù)年 | 2008 |
1 | tm_mon | 月 | 1 到 12 |
2 | tm_mday | 日 | 1到31 |
3 | tm_hour | 小時(shí) | 0到23 |
4 | tm_min | 分鐘 | 0到59 |
5 | tm_sec | 秒 | 0到59 |
6 | tm_wday | 一周的第幾日 | 0到6 (0是周一) |
7 | tm_yday | 一年的第幾日 | 1到366 (儒略歷) |
8 | tm_isdst | 夏令時(shí) | -1, 0, 1, -1是決定是否為夏令時(shí)的旗幟 |
⑷ 提取時(shí)間元組信息
在第⑶部分的表格中,“屬性”一欄是提取時(shí)間元組信息的重要信息州泊,語法為 時(shí)間元組.屬性
- 例:
- 執(zhí)行代碼:
import time struct_time = time.localtime() print(struct_time) print("年:", struct_time.tm_year, "\n月:", struct_time.tm_mon, "\n日:", struct_time.tm_mday, "\n時(shí):", struct_time.tm_hour, "\n分:", struct_time.tm_min, "\n秒:", struct_time.tm_sec, "\n一周天數(shù)(從0起):", struct_time.tm_wday, "\n一年的天數(shù)(從1起):", struct_time.tm_yday)
- 輸出結(jié)果:
time.struct_time(tm_year=2018, tm_mon=1, tm_mday=25, tm_hour=14, tm_min=48, tm_sec=26, tm_wday=3, tm_yday=25, tm_isdst=0) 年: 2018 月: 1 日: 25 時(shí): 14 分: 48 秒: 26 一周天數(shù)(從0起): 3 一年的天數(shù)(從1起): 25
- 注意:提取信息時(shí)丧蘸,沒有“isdst”(夏令時(shí))屬性。
2. time模塊常用屬性
屬性 | 功能 | 備注 |
---|---|---|
time.time() | 查看時(shí)間戳 | 不需要參數(shù)遥皂。 |
time.sleep(sec_num) | 睡眠幾秒 | 必須有1個(gè)參數(shù)力喷,參數(shù)為數(shù)字刽漂,表示睡眠的秒數(shù)。 |
time.gmtime([sec_num]) | 將秒轉(zhuǎn)化為0時(shí)區(qū)的時(shí)間元組 | 參數(shù)為數(shù)字弟孟,表示秒贝咙;參數(shù)為空則默認(rèn)當(dāng)前時(shí)間。 |
time.localtime([sec_num]) | 將秒轉(zhuǎn)化為本地時(shí)區(qū)的時(shí)間元組 | 參數(shù)為數(shù)字拂募,表示秒庭猩;參數(shù)為空則默認(rèn)當(dāng)前時(shí)間。 |
time.mktime(struct_time) | 將本地時(shí)區(qū)的時(shí)間元組轉(zhuǎn)化為秒 | 必須有1個(gè)參數(shù)陈症,參數(shù)為struct_time時(shí)間元組蔼水。 |
time.strftime(format, struct_time) | 將時(shí)間元組轉(zhuǎn)化為自定義字符串格式的時(shí)間 | 必須有2個(gè)參數(shù),第1個(gè)參數(shù)為自定義格式录肯;第2個(gè)參數(shù)為時(shí)間元組徙缴。 |
time.strptime(string, format) | 將自定義字符串格式的時(shí)間轉(zhuǎn)化為時(shí)間元組 | 必須有2個(gè)參數(shù),第1個(gè)參數(shù)為時(shí)間字符串嘁信;第2個(gè)參數(shù)為時(shí)間自定義格式于样。 |
time.asctime([struct_time]) | 將時(shí)間元組轉(zhuǎn)化為字符串格式的時(shí)間 | 參數(shù)為時(shí)間元組;參數(shù)為空則默認(rèn)當(dāng)前時(shí)間潘靖。結(jié)果格式為:%a %b %d %H:%M:%S %Y |
time.ctime([sec_num]) | 將時(shí)間戳轉(zhuǎn)化為字符串格式的時(shí)間 | 參數(shù)為數(shù)字穿剖,表示時(shí)間戳(秒);參數(shù)為空則默認(rèn)為當(dāng)前時(shí)間卦溢。結(jié)果格式為:%a %b %d %H:%M:%S %Y |
- 注意:
參數(shù)有方括號“[]”的表示參數(shù)可有可無糊余;否則必須有參數(shù)或必須沒有參數(shù)。
調(diào)用屬性語法:
time.屬性名()
3. 時(shí)間戳单寂、時(shí)間元組贬芥、時(shí)間格式化字符串的相互轉(zhuǎn)換
4. time模塊舉例
5. datetime模塊常用屬性
語法 | 所屬類 | 功能 | 備注 |
---|---|---|---|
datetime.date(year_num, month_num, day_num) | date | 設(shè)定日期 | 必須有3個(gè)參數(shù)尊沸。第1個(gè)參數(shù)為4位數(shù)字威沫,表示年;第2個(gè)參數(shù)為1-2位數(shù)字洼专,表示月棒掠;第3個(gè)參數(shù)為1-2位數(shù)字,表示日屁商。 |
datetime.date.today() | date | 獲取當(dāng)前日期 | 不需要參數(shù)烟很。格式為:YYYY-MM-DD |
datetime.date.fromtimestamp(sec_num) | date | 以1970年1月1日為基準(zhǔn),獲取給定時(shí)間的日期 | 必須有1個(gè)參數(shù)。參數(shù)為數(shù)字雾袱,表示秒恤筛。意為:1970年1月1日往后sec_num秒的日期。格式為:YYYY-MM-DD |
datetime.time([hour_num], [minute_num], [second_num]) | time | 設(shè)定時(shí)間 | 位置傳參谜酒。若無參數(shù),則表示00:00:00妻枕;hour_number表示給定小時(shí)數(shù)僻族;minute_num表示給定分鐘數(shù);second_num表示給定秒數(shù)屡谐。 |
datetime.time([hour=], [minute=], [second=]) | time | 設(shè)定時(shí)間 | 關(guān)鍵字傳參述么。若無參數(shù),則表示00:00:00愕掏;"hour/minute/second="跟數(shù)字度秘,表示給定的"時(shí)/分/秒"。 |
datetime.time.min | time | 獲取最小時(shí)間 | 執(zhí)行結(jié)果為:00:00:00 |
datetime.time.max | time | 獲取最大時(shí)間 | 執(zhí)行結(jié)果為:23:59:59.999999 |
datetime.time([hour], [min], [sec]).replace([hour], [minute], [second]) | time | 修改時(shí)間 | time和replace的參數(shù)均可有可無饵撑。若replace沒有參數(shù)剑梳,則不修改時(shí)間;replace既可以使用關(guān)鍵字(hour=, minute=, second=)傳參滑潘,也可以使用位置傳參垢乙。 |
datetime.time([hour], [min], [sec]).strftime(format) | time | 修改時(shí)間的格式 | time的參數(shù)可有可無,strftime必須有1個(gè)參數(shù)语卤,且為格式化字符串追逮。%H對應(yīng)小時(shí),%M對應(yīng)分鐘粹舵,%S對應(yīng)秒钮孵。 |
datetime.datetime.now() | datetime | 獲取當(dāng)前日期和時(shí)間 | 不需要參數(shù)。獲取的日期和時(shí)間格式為:YYYY-MM-DD HH:MM:SS.SS |
datetime.datetime(year, month, day, [hour, minute, second]) | datetime | 設(shè)定日期時(shí)間 | 必須有3個(gè)參數(shù)眼滤,且參數(shù)均為數(shù)字巴席。參數(shù)可使用位置傳參,也可以使用關(guān)鍵字傳參诅需。參數(shù)按位置分別表示年情妖、月、日诱担、時(shí)毡证、分畜侦、秒锚烦、微秒肩榕。 |
datetime.datetime.combine(datetime.date, datetime.time) | datetime | 組合日期和時(shí)間 | 必須有2個(gè)參數(shù)筛婉。第1個(gè)參數(shù)為date類皱炉;第2個(gè)參數(shù)為time類。 |
datetime.datetime(parameter).replace([year, month, day, hour, minute, second]) | datetime | 修改日期時(shí)間 | datetime必須有3個(gè)參數(shù)姓赤,replace的參數(shù)可有可無侄柔。若replace沒有參數(shù)則不作修改;replace的參數(shù)可以位置傳參也可以使用關(guān)鍵字傳參居扒。 |
datetime.datetime(parameter).strftime(format) | datetime | 修改日期時(shí)間的格式 | datetime必須有3個(gè)參數(shù)概漱,strftime必須有1個(gè)參數(shù)且為格式化字符串。參照"六喜喂、time與datetime模塊"中的"1. 時(shí)間的格式"中的"① 格式化字符串"瓤摧。 |
datetime.timedelta([day_num], [sec_num]) | timedelta | 兩個(gè)日期時(shí)間的差值 | 此屬性不單獨(dú)使用。第1個(gè)參數(shù)為數(shù)字玉吁,表示天數(shù)照弥,+表示未來,-表示過去进副;第2個(gè)參數(shù)為數(shù)字这揣,表示秒,+表示未來影斑,-表示過去给赞;若無參數(shù),則無差值矫户。 |
datetime.timedelta([days=], [hours=], [minutes=], [seconds=]) | timedelta | 兩個(gè)日期時(shí)間的差值 | 含義同上一個(gè)屬性塞俱。使用關(guān)鍵字傳參,對特定天數(shù)吏垮、小時(shí)障涯、分鐘和秒傳參,+表示未來膳汪,-表示過去唯蝶。 |
6. datetime模塊舉例
7. datetime模塊常見用法
① 獲取過去或未來的日期
import datetime
datetime.date.today() + datetime.timedelta([days=])
- 注意:
“days=”為關(guān)鍵字傳參,“=”后跟數(shù)字遗嗽,意為天數(shù)粘我。“+”表示未來的天數(shù)痹换;“-”表示過去的天數(shù)征字。
“[]”表示參數(shù)可有可無,在實(shí)際傳參中不需要寫方括號“[]”娇豫。若沒有參數(shù)匙姜,表示日期不偏移。
② 獲取過去或未來的日期和時(shí)間
import datetime
datetime.datetime.now() + datetime.timedelta([days=], [hours=], [minutes=], [seconds=], [microseconds=])
- 注意:
“datetime.timedelta()”為關(guān)鍵字傳參冯痢,“=”后跟數(shù)字氮昧,意為天數(shù)/小時(shí)數(shù)/分鐘數(shù)/秒數(shù)/微秒數(shù)框杜。“+”表示未來的偏移袖肥;“-”表示過去的偏移咪辱。
“[]”表示參數(shù)可有可無,在實(shí)際傳參中不需要寫方括號“[]”椎组。若沒有參數(shù)油狂,表示日期時(shí)間不偏移。
③ 獲取當(dāng)天開始時(shí)間和結(jié)束時(shí)間
⑴ 當(dāng)天開始時(shí)間
import datetime
datetime.datetime.combine(datetime.date.today(), datetime.time.min)
⑵ 當(dāng)天結(jié)束時(shí)間
import datetime
datetime.datetime.combine(datetime.date.today(), datetime.time.max)
④ 獲取datetime.date類的年寸癌、月专筷、日和星期
⑴ 年
import datetime
datetime.date(year_num, month_num, day_num).year
⑵ 月
import datetime
datetime.date(year_num, month_num, day_num).month
⑶ 日
import datetime
datetime.date(year_num, month_num, day_num).day
⑷ 星期
import datetime
datetime.date(year_num, month_num, day_num).weekday()
- 注意:結(jié)果為0-6的數(shù)字,分別表示星期一到星期日灵份。
⑤ 獲取本周最后一天的日期
import datetime
last_day_of_this_week = datetime.date.today() + datetime.timedelta(6 - datetime.date.today())
print(last_day_of_this_week)
思路:將今天的日期加上今天距離本周日的天數(shù)仁堪。
-
注意:
6表示星期日哮洽。
為了便于理解變量的含義填渠,此處的變量名比較長。
⑥ 獲取上個(gè)月最后一天的日期
import datetime
today = datetime.date.today()
first_day_of_this_month = datetime.date(today.year, today.month, 1)
last_day_of_last_month = first_day_of_this_month - datetime.timedelta(days=1)
print(last_day_of_last_month)
思路:獲取當(dāng)前月份第一天的日期鸟辅,然后向過去推移1天氛什。
注意:為了便于理解變量的含義,此處的變量名比較長匪凉。
⑦ 獲取兩個(gè)日期(或時(shí)間日期)相差的天數(shù)枪眉、秒數(shù)
⑴ 日期
import datetime
date1 = datetime.date(year1, month1, day1)
date2 = datetime.date(year2, month2, day2)
delta = date1 - date2
day_delta = delta.days
seconds_delta = delta.total_seconds()
print(day_delta, seconds_delta)
⑵ 日期時(shí)間
import datetime
date_time1 = datetime.datetime(year1, month1, day1, hour1, minute1, second1)
date_time2 = datetime.datetime(year2, month2, day2, hour2, minute2, second2)
delta = date_time1 - date_time2
day_delta = delta.days
seconds_delta = delta.total_seconds()
print(day_delta, seconds_delta)
⑶ 注意
“day_delta”的值為兩個(gè)日期相差的天數(shù)。運(yùn)用了屬性
.days
再层,這個(gè)屬性只有計(jì)算差時(shí)(datetime模塊中的timedelta類中)才可以使用贸铜。“seconds_delta”的值為兩個(gè)日期相差的總秒數(shù)。運(yùn)用了屬性
.total_seconds()
聂受,這個(gè)屬性只有計(jì)算差時(shí)(datetime模塊中的timedelta類中)才可以使用蒿秦。如果使用了seconds
屬性,則結(jié)果為0蛋济。因?yàn)樵搶傩?strong>只計(jì)算兩個(gè)日期的秒的差棍鳖。
8. datetime模塊常見用法舉例
七、calendar模塊
該模塊中的函數(shù)均為日歷相關(guān)操作和處理的模塊碗旅。
1. calendar模塊常見用法
語法 | 功能 | 備注 |
---|---|---|
calendar.calendar(year,w=2,l=1,c=6, m=3) | 返回一個(gè)多行字符串格式的 year年年歷 | year為年數(shù)渡处,w為每日寬度的間隔字符數(shù),l為每個(gè)星期的行間距祟辟,c為每個(gè)月份之間的間隔字符數(shù)医瘫,m為并行的月份個(gè)數(shù)。 |
calendar.firstweekday( ) | 返回當(dāng)前每周起始日期的設(shè)置 | 默認(rèn)情況下旧困,首次載入caendar模塊時(shí)返回0登下,即星期一茫孔。 |
calendar.isleap(year) | 判斷year年是否是閏年 | year年是閏年則返回True,平年則返回False被芳。 |
calendar.leapdays(year1,year2) | 計(jì)算year1和year2之間有幾個(gè)閏年 | 判斷的區(qū)間是前閉后開缰贝,即包括year1但不包括year2。 |
calendar.month(year,month,w=2,l=1) | 返回year年month月的月歷 | year為年數(shù)畔濒,month為月數(shù)剩晴,w為每日寬度的間隔字符數(shù),l為每個(gè)星期的行間距侵状。 |
calendar.monthcalendar(year,month) | 以列表的形式返回year年month月的月歷 | 列表的元素仍是列表赞弥,子列表的個(gè)數(shù)即為當(dāng)月周數(shù)的合計(jì)。子列表的元素為星期一至星期日對應(yīng)的月份日期趣兄,非該月月份的日期為0绽左。 |
calendar.monthrange(year,month) | 返回一個(gè)2個(gè)元素的元組 | 第一個(gè)元素為year年month月第一天的星期數(shù),0到6分別代表星期一到星期日艇潭;第二個(gè)元素為year年month月的總天數(shù) |
calendar.prcal(year,w=2,l=1,c=6, m=3) | 返回一個(gè)多行字符串格式的 year年年歷 | 相當(dāng)于"print(calendar.calendar(year, w=2, l=1, c=6, m=3))"拼窥,但類型為NoneType。 |
calendar.prmonth(year,month,w=2,l=1) | 返回year年month月的月歷 | 相當(dāng)于"print(calendar.month(year, month, w=2, l=1, c=6))"蹋凝,但類型為NoneType鲁纠。 |
calendar.setfirstweekday(weekday) | 設(shè)置每周起始日期數(shù)字 | 0到6分別代表星期一到星期日。 |
calendar.timegm(struct_time) | 返回時(shí)間戳 | 與time.gmtime()相反鳍寂,該函數(shù)接收一個(gè)時(shí)間元組改含,返回該時(shí)間的時(shí)間戳。 |
calendar.weekday(year,month,day) | 返回year年month月day日的星期數(shù) | year為年迄汛,month為月捍壤,day為日,返回結(jié)果為一個(gè)0到6的數(shù)字鞍爱,分別代表星期一到星期日鹃觉。 |
2. 三目運(yùn)算符判斷平年閏年
使用場景:在編程過程中不導(dǎo)入calendar模塊判斷年份為平年還是閏年。
優(yōu)勢:此方法可以根據(jù)需要返回自定義值硬霍,而calendar.isleap()的返回值只能是True或False帜慢。
代碼:
def isLeapYear(year):
return 自定義值1 if year % 4 == 0 and year % 100 != 0 or year % 400 == 0 else 自定義值2
當(dāng)“自定義值1”為True且“自定義值2”為False時(shí),其功能與 calendar.isleap()
完全一致唯卖。
3. 獲取本月的最后一天
import calendar, datetime
today = datetime.date.today()
last_day_num = calendar.monthrange(today.year, today.month)[1]
last_day_date = datetime.date(today.year, today.month, last_day_num)
print(last_day_date)
4. calendar模塊常見用法舉例
八粱玲、random模塊
該模塊用于獲取隨機(jī)數(shù)。
1. random模塊常見用法
語法 | 功能 | 備注 |
---|---|---|
random.random() | 隨機(jī)一個(gè)0到1的浮點(diǎn)數(shù) | |
random.randint(num1, num2) | 在num1和num2之間隨機(jī)一個(gè)整數(shù) | 隨機(jī)數(shù)的范圍為:num1≤隨機(jī)數(shù)≤num2 |
random.randrange(num1, num2[, step]) | 在num1和num2之間隨機(jī)一個(gè)整數(shù)拜轨,步長為step | 隨機(jī)數(shù)的范圍為:num1≤隨機(jī)數(shù)<num2抽减,步長默認(rèn)為1。 |
random.choice(sequence) | 在給出的序列中隨機(jī)一個(gè)值 | 參數(shù)必須為序列橄碾,即:字符串卵沉、列表或元組颠锉。 |
random.sample(sequence, num) | 在給出的序列中隨機(jī)num個(gè)值 | 第1個(gè)參數(shù)必須為序列,即:字符串史汗、列表或元組琼掠。第2個(gè)參數(shù)為隨機(jī)值的個(gè)數(shù)。 |
random.uniform(num1, num2) | 在num1和num2之間隨機(jī)一個(gè)浮點(diǎn)數(shù) | num1和num2可以是浮點(diǎn)數(shù)停撞。 |
random.shuffle(list) | 把list列表的元素順序打亂 | 需要先定義列表瓷蛙,然后把列表作為參數(shù)傳入,之后打印列表即可得亂序后的列表戈毒。 |
2. random模塊常見用法舉例
九艰猬、os模塊
os模塊主要用于處理文件和目錄。
1. os模塊常見用法
語法 | 功能 | 備注 |
---|---|---|
os.curdir | 當(dāng)前目錄的標(biāo)識符 | 結(jié)果為"." |
os.pardir | 上級目錄的標(biāo)識符 | 結(jié)果為".." |
os.sep | 輸出當(dāng)前操作系統(tǒng)特定的路徑分隔符 | Windows:\ Linux & Mac:/ |
os.linesep | 輸出當(dāng)前操作系統(tǒng)特定的換行符 | Windows:\t\n Linux & Mac:\n |
os.pathsep | 輸出當(dāng)前操作系統(tǒng)特定的環(huán)境變量分隔符 | Windows:; Linux & Mac:: |
os.environ | 輸出當(dāng)前系統(tǒng)的環(huán)境變量 | |
os.name | 輸出當(dāng)前系統(tǒng)的名稱 | Windows:'nt' Linux & Mac:'posix' |
os.getcwd() | 獲取當(dāng)前目錄的絕對路徑 | |
os.chdir(abs_path) | 切換路徑 | 參數(shù)為目標(biāo)位置的絕對路徑 |
os.makedirs(abs_path, mode) | 遞歸創(chuàng)建目錄并賦權(quán)限 | 第1個(gè)參數(shù)是需要遞歸創(chuàng)建目錄的絕對路徑埋市;第2個(gè)參數(shù)是創(chuàng)建的目錄的權(quán)限數(shù)字冠桃。若創(chuàng)建的目錄已存在,則報(bào)錯(cuò)道宅。 |
os.removedirs(abs_path) | 遞歸刪除空目錄 | 若目錄為空則刪除該目錄食听;遞歸至上一級目錄,若上一級目錄也為空培己,則也刪除碳蛋。以此類推胚泌。 |
os.mkdir(abs_path) | 創(chuàng)建目錄 | 參數(shù)為創(chuàng)建目錄的絕對路徑省咨,若路徑中含有不存在目錄,則報(bào)錯(cuò)玷室。 |
os.rmdir(abs_path) | 刪除單級空目錄 | 參數(shù)為需刪除目錄的絕對路徑零蓉。被刪除目錄必須為空,否則無法刪除且報(bào)錯(cuò)穷缤。 |
os.listdir(abs_path) | 以列表形式返回目錄下的所有文件 | |
os.remove(path) | 刪除一個(gè)文件 | 參數(shù)為需要?jiǎng)h除文件的路徑。 |
os.rename("old_name", "new_name") | 重命名 | 第1個(gè)參數(shù)是需被重命名的原文件名(字符串格式);第2個(gè)參數(shù)是新文件名(字符串格式)薇溃。 |
os.stat('file_name') | 查看文件的詳細(xì)信息 | |
os.system('command') | 執(zhí)行系統(tǒng)命令 | 參數(shù)為系統(tǒng)命令的字符串搜锰。 |
os.path.abspath('file_name') | 獲取文件的絕對路徑 | 參數(shù)為文件名,字符串格式身坐。 |
os.path.split(path) | 返回包含路徑和文件名的二元組 | 參數(shù)為包含文件名的路徑秸脱,路徑可不存在。結(jié)果返回為2個(gè)元素的元組部蛇。第1個(gè)元素為目錄的路徑摊唇;第2個(gè)元素為文件名。 |
os.path.dirname(path) | 獲取目錄名 | 參數(shù)為路徑涯鲁,結(jié)果返回為目錄名巷查,字符串格式有序。目錄可不存在。 |
os.path.basename(path) | 獲取文件名 | 參數(shù)為路徑岛请,結(jié)果返回為文件名旭寿,字符串格式。目錄和文件可不存在崇败。 |
os.path.exists(path) | 判斷路徑是否存在 | 參數(shù)為路徑许师,結(jié)果為True或False。 |
os.path.isabs(path) | 判斷路徑是否為絕對路徑 | 參數(shù)為絕對路徑僚匆,結(jié)果為True或False微渠。路徑中家目錄若用"~"則結(jié)果為False。路徑可不存在咧擂。 |
os.path.isfile(path) | 判斷是否為文件 | 參數(shù)為路徑逞盆,結(jié)果為True或False。若文件不存在松申,則結(jié)果也為False云芦。路徑中家目錄若用"~"則結(jié)果為False。 |
os.path.isdir(path) | 判斷是否為目錄 | 參數(shù)為路徑贸桶,結(jié)果為True或False舅逸。若目錄不存在,則結(jié)果也為False皇筛。路徑中家目錄若用"~"則結(jié)果為False琉历。 |
os.path.join(path1, path2,...,pathN) | 將多個(gè)路徑組合返回一個(gè)完整路徑 | 參數(shù)個(gè)數(shù)不限,但都須為字符串格式水醋。若每個(gè)路徑中沒有'/'符號則會(huì)自動(dòng)補(bǔ)全旗笔;根目錄符號"/"前的所有參數(shù)將會(huì)被忽略。 |
os.path.getatime('file_name') | 返回文件或目錄的最后存取時(shí)間的時(shí)間戳 | 參數(shù)為含有目錄或文件名的路徑拄踪,字符串格式蝇恶。 |
os.path.getmtime('file_name') | 返回文件或目錄的最后修改時(shí)間的時(shí)間戳 | 參數(shù)為含有目錄或文件名的路徑,字符串格式惶桐。 |
2. 用戶權(quán)限
由于 os.makedirs(abs_path, mode)
函數(shù)中涉及到為目錄賦權(quán)限撮弧,因此,該部分將結(jié)合Linux & Mac系統(tǒng)對用戶權(quán)限做詳細(xì)說明姚糊。僅了解權(quán)限數(shù)字部分已經(jīng)可以使用 os.makedirs(abs_path, mode)
贿衍,因此可以直接跳轉(zhuǎn)至“權(quán)限數(shù)字”部分進(jìn)行閱讀。
① 用戶的分類
每個(gè)用戶都有一個(gè)唯一標(biāo)識符(UID:用戶ID)
用戶類別 | 用途 | UID取值 |
---|---|---|
普通用戶 | 用于登錄使用 | UID ≥ 1000 |
系統(tǒng)用戶 | 用于系統(tǒng)服務(wù)使用(不允許登錄) | 0 < UID < 1000 |
超級管理員用戶 | UID = 0 |
② 用戶組
用戶組:將多個(gè)用戶定義組叛拷,方便管理權(quán)限舌厨,用GID表示用戶組唯一標(biāo)識符。
③ 用戶配置文件
配置文件類型 | 路徑 |
---|---|
用戶信息配置文件 | /etc/passwd |
用戶密碼信息配置文件 | /etc/shadow |
用戶組信息配置文件 | /etc/group |
用戶組密碼信息配置文件 | /etc/gshadow |
④ 用戶管理命令
注意:用戶信息修改必須超級管理員用戶操作忿薇。
用途 | 命令 |
---|---|
獲取當(dāng)前登錄用戶的信息 | id |
獲取指定用戶的信息 | id 用戶名 |
臨時(shí)切換用戶 | su 用戶名 |
添加用戶 | adduser |
刪除用戶信息 | userdel 用戶名 |
刪除用戶信息及用戶家目錄 | userdel -r 用戶名 |
修改密碼 | passwd |
⑤ sudo命令
root用戶可以給其它普通用戶授權(quán), 授權(quán)后普通用戶具備執(zhí)行超級管理員的命令裙椭,但不能直接執(zhí)行躏哩,必須使用 sudo
去執(zhí)行, 對所有操作做二次確認(rèn),減少誤操作揉燃。
sudo
只能運(yùn)行外部命令扫尺。 sudo
執(zhí)行的命令執(zhí)行權(quán)限為root。
-
授權(quán):
步驟 命令 作用 ① su root 切換root ② visudo 輸入命令 ③ root ALL = (ALL:ALL) ALL 搜索記錄 ④ 用戶名 ALL = (ALL:ALL) ALL 添加權(quán)限
⑥ 權(quán)限
⑴ 查看權(quán)限命令
ls -l
或 ls -d
⑵ 舉例解釋
若權(quán)限為:rw-rw-r--
? 分段
以三個(gè)字符為一段炊汤,分成三段
序號 | 字符 | 含義 |
---|---|---|
① | rw- | 代表所屬用戶對此文件的操作權(quán)限(u) |
② | rw- | 第二段代表所屬用戶組對此文件的操作權(quán)限(g) |
③ | r-- | 第三段代表其它用戶對此文件的操作權(quán)限(o) |
? r:讀
* 針對文件:有r權(quán)限代表對此文件可以打開和獲取文件內(nèi)容正驻。
* 針對目錄:有r權(quán)限代表對此目錄可以遍歷(ls)。
? w:寫
* 針對文件:有w權(quán)限代表對此文件可以編輯抢腐。
* 針對目錄:有w權(quán)限代表對此目錄可以新建子目錄和文件姑曙。
? x:執(zhí)行
* 針對文件:有x權(quán)限代表對此文件可以運(yùn)行。
* 針對目錄:有x權(quán)限代表可以進(jìn)入此目錄(cd)迈倍。
⑶ 修改權(quán)限
除了root用戶外伤靠,其他用戶只能修改所屬用戶是自己的文件。
- 語法:
chmod 權(quán)限修改內(nèi)容 文件
⑷ 舉例解釋不同權(quán)限修改方法
序號 | 語法示例 | 含義 |
---|---|---|
① | chmod u=rw- file | 對file文件修改用戶權(quán)限啼染,具有讀宴合、寫權(quán)限但不具備執(zhí)行權(quán)限。(此方法可以修改u, g, o任意權(quán)限) |
② | chmod u=rwx,g=---,o=--- file | 修改file文件用戶迹鹅、用戶組和其他人的權(quán)限(即修改了所有權(quán)限) |
③ | chmod 0 file | 取消file文件的所有權(quán)限 |
④ | chmod o+w file | 為file文件中其他人(o)增加寫的權(quán)限 |
⑤ | chmod o-x,g+w file | 為file文件中其他人(o)減少執(zhí)行權(quán)限卦洽,為用戶組(g)增加寫的權(quán)限 |
⑥ | chmod 755 file | file文件中用戶(u)具有讀、寫斜棚、執(zhí)行權(quán)限阀蒂,用戶組(g)具有讀和執(zhí)行權(quán)限,其他人(o)具有讀和執(zhí)行權(quán)限 |
⑸ 權(quán)限數(shù)字
字符 | 二進(jìn)制 | 十進(jìn)制 |
---|---|---|
--- | 000 | 0 |
--x | 001 | 1 |
-w- | 010 | 2 |
-wx | 011 | 3 |
r-- | 100 | 4 |
r-x | 101 | 5 |
rw- | 110 | 6 |
rwx | 111 | 7 |
⑹ 修改所屬用戶和組
語法:chown 用戶名:組名 文件
⑺ 為目錄及目錄所有文件及子目錄修改用戶和組
語法:chown 用戶名:組名 目錄 -R
⑻ 粘貼位
粘貼位一般用在目錄上打肝,用在文件上起不到作用脂新。
粘貼位只對所有權(quán)限(777或rwxrwxrwx)的目錄的其它用戶權(quán)限設(shè)置挪捕。
? 粘貼位寫法
將所有權(quán)限(rwxrwxrwx)的目錄中其他(o)權(quán)限的x位置上改為t粗梭。e.g.:(dir為自定義目錄)
chmod drwxrwxrwt dir
將所有權(quán)限(777)的目錄權(quán)限前添加1。e.g.:(dir為自定義目錄)
chmod 1777 dir
? 粘貼位設(shè)置的目的
防止其他用戶操作其他(另外)用戶文件级零。
⑼ 特權(quán)位
? 語法
類別 | 語法 |
---|---|
用戶特權(quán) | chmod u+s 文件 |
用戶組特權(quán) | chmod g+s 文件 |
? 特權(quán)位寫法
為用戶權(quán)限添加特權(quán)位:把用戶(u)權(quán)限x替換成s断医。
為用戶組權(quán)限添加特權(quán)位:把用戶組(g)權(quán)限x替換成s。
? 注意
為用戶權(quán)限添加特權(quán)位(u+s):只能針對可執(zhí)行文件(命令和程序)來設(shè)定奏纪。
為用戶組權(quán)限添加特權(quán)位(g+s):既可以對可執(zhí)行文件(命令和程序)來設(shè)定鉴嗤,也可以對目錄進(jìn)行設(shè)定。如果g+s對目錄來設(shè)定序调,那么在該目錄下直接創(chuàng)建文件醉锅、創(chuàng)建目錄,這些文件或者目錄的所有組就會(huì)自動(dòng)繼承該目錄的所有組发绢。
? 特權(quán)位設(shè)置的作用
當(dāng)命令文件被設(shè)定了特權(quán)位硬耍,無論什么用戶執(zhí)行該命令或操作該文件垄琐,進(jìn)程的有效身份都是該命令或文件本身的所屬用戶(u)或者擁有組(g)身份一樣,與執(zhí)行者(o)權(quán)限無關(guān)经柴。
十狸窘、其他模塊
由于現(xiàn)階段的學(xué)習(xí)進(jìn)度限制無法花更多的精力在其他模塊的學(xué)習(xí)上,在此先將打算學(xué)習(xí)的模塊列出(我的學(xué)習(xí)優(yōu)先級由上至下)坯认,日后再研究學(xué)習(xí)并完善該部分內(nèi)容翻擒。
- sys
- re
- json & pickle
- thread
- threading
- Queue
- xml
- ConfigParser
- shutil
- shelve
- logging
- subprocess
- PyYAML
- hashlib
- hmac
一、編程范式
1. 編程
編程是編寫程序的中文簡稱牛哺,就是讓計(jì)算機(jī)代為解決某個(gè)問題陋气,對某個(gè)計(jì)算體系規(guī)定一定的運(yùn)算方式,是計(jì)算體系按照該計(jì)算方式運(yùn)行引润,并最終得到相應(yīng)結(jié)果的過程恩伺。為了使計(jì)算機(jī)能夠理解人的意圖,人類就必須將需解決的問題的思路椰拒、方法和手段通過計(jì)算機(jī)能夠理解的形式告訴計(jì)算機(jī)晶渠,使得計(jì)算機(jī)能夠根據(jù)人的指令一步一步去工作,完成某種特定的任務(wù)燃观。這種人和計(jì)算體系之間交流的過程就是編程褒脯。——百度百科
簡而言之缆毁,編程就是程序員通過 特定語法 + 數(shù)據(jù)結(jié)構(gòu) + 算法
與計(jì)算機(jī)交流的過程番川。
2. 編程范式
指計(jì)算機(jī)編程的基本風(fēng)格或典范模式。編程范式是對不同編程方式特點(diǎn)的歸納和總結(jié)脊框。編程范式統(tǒng)括為:面向?qū)ο缶幊贪涠健⒚嫦蜻^程編程、函數(shù)式編程浇雹。其中沉御,面向?qū)ο缶幊?/strong>和面向過程編程是最為重要的兩種編程范式。
① 面向過程(Procedural Programming)
Procedural programming uses a list of instructions to tell the computer what to do step-by-step.
解釋:面向過程是一種以過程為中心的編程思想昭灵。解決問題的思路是針對問題分析所需要的步驟吠裆,然后按步實(shí)現(xiàn)。
設(shè)計(jì)思路:top-down language烂完,即程序從上到下按步執(zhí)行试疙。
弊端:凡是對程序的修改,都需要對修改部分有依賴的部分進(jìn)行修改抠蚣,維護(hù)難度大祝旷。
使用場景:寫簡單腳本;任務(wù)是一次性的。
② 面向?qū)ο缶幊蹋∣bject Oriented Programming)
世界萬物怀跛,皆可分類奇昙。世界萬物,皆為對象敌完。
解釋:面向?qū)ο笫且环N以事物(對象)為中心的編程思想储耐。通過“類”和“對象”創(chuàng)建各種模型來實(shí)現(xiàn)對真實(shí)世界的描述。因?yàn)槭篱g萬物只要是對象滨溉,就肯定屬于某種品類什湘;只要是對象,就肯定有屬性晦攒。
-
優(yōu)點(diǎn):
- 程序的維護(hù)和擴(kuò)展變得簡單闽撤。
- 提高開發(fā)效率。
- 更容易理解代碼邏輯脯颜。
使用場景:任務(wù)復(fù)雜哟旗;需要不斷迭代和維護(hù)。
3. 面向?qū)ο笙嚓P(guān)概念及特性
① 概念
類(Class):對一類具有相同屬性對象的抽象栋操,且定義了該類對象都具備的屬性(Variables(data))以及共同的方法闸餐。
對象(Object):一個(gè)類實(shí)例化后的實(shí)例。
② 特性
封裝(Encapsulation):類中對數(shù)據(jù)的賦值矾芙、內(nèi)部的調(diào)用對外部用戶是透明的舍沙。
繼承(Inheritance):類可以派生子類,父類定義的屬性剔宪、方法自動(dòng)被子類繼承拂铡。
多態(tài)(Polymorphism):一個(gè)接口,多種實(shí)現(xiàn)葱绒。
二菱鸥、類翻翩、實(shí)例和繼承
1. 語法
class 類名(object): # 類名通常首字母大寫
變量名 = value # 類變量
def __init__(self, 參數(shù)1, 參數(shù)2, ..., 參數(shù)n):
"""
構(gòu)造函數(shù):實(shí)例化時(shí)所做的類的初始化工作
self.參數(shù):實(shí)例變量(靜態(tài)屬性)墓臭。作用于為實(shí)例本身精堕。
"""
self.參數(shù)1 = 參數(shù)1
self.參數(shù)2 = 參數(shù)2
...
self.參數(shù)n = 參數(shù)n
def 方法名(self):
"""
類的方法登钥,功能(動(dòng)態(tài)屬性)
"""
函數(shù)體
2. 新式類和經(jīng)典(舊式)類
① 新式類
class 類名(object):
pass
② 經(jīng)典(舊式)類
class 類名:
pass
③ 新式類與經(jīng)典(舊式)類的區(qū)別
如上圖所示施符,第1幅圖可以明顯地展示出新式類與經(jīng)典類的區(qū)別碍舍,其運(yùn)行環(huán)境是Python 2.7版本脯厨;然而,在Python 3.6版本中作箍,這個(gè)區(qū)別已經(jīng)不再存在,如第2幅圖所示前硫。
新式類都從object類繼承胞得,而經(jīng)典類不需要。
新式類相同父類只執(zhí)行一次構(gòu)造函數(shù)屹电,經(jīng)典類重復(fù)執(zhí)行多次阶剑。
在多繼承方面跃巡,新式類的基類搜索順序與經(jīng)典類存在較大區(qū)別,詳見“二牧愁、類素邪、實(shí)例和繼承”中“7. 繼承”中“ ②多繼承”。
3. 實(shí)例化
把一個(gè)類變成一個(gè)具體對象的過程猪半,稱為實(shí)例化兔朦。
對象名 = 類名()
例如:
class Student(object):
def __init__(self, name, age):
self.name = name
self.age = age
def registration(self):
print("%s registers successfully! %s is %s years old." % (self.name, self.name, self.age))
raxxie = Student('Raxxie', 18)
其中,Student是學(xué)生類磨确,而raxxie就是Student類的一個(gè)實(shí)例化對象沽甥。
4. 舉例說明實(shí)例變量的增刪改查
5. 析構(gòu)函數(shù)
在實(shí)例釋放和銷毀的時(shí)候執(zhí)行,通常用于做一些收尾工作乏奥。如:關(guān)閉一些數(shù)據(jù)庫連接摆舟,關(guān)閉已打開的臨時(shí)文件,等邓了。
def __del__(self):
函數(shù)體
當(dāng)對象在內(nèi)存中被釋放時(shí)恨诱,自動(dòng)觸發(fā)執(zhí)行。
- 注意:此方法一般無須定義骗炉,因?yàn)镻ython是一門高級語言胡野,程序員在使用時(shí)無需關(guān)心內(nèi)存的分配和釋放,因?yàn)榇斯ぷ鞫际墙唤oPython解釋器來執(zhí)行痕鳍,所以析構(gòu)函數(shù)的調(diào)用是由解釋器在進(jìn)行垃圾回收時(shí)自動(dòng)觸發(fā)執(zhí)行的硫豆。
6. 私有方法和私有屬性
① 私有屬性
self.__屬性名(變量名) = value
② 私有方法
def __方法名(self):
函數(shù)體
③ 訪問私有屬性和調(diào)用私有方法
⑴ 訪問私有屬性
- 私有屬性是無法從外部直接訪問的,如下圖:
訪問私有屬性有兩種方法:
- 方法一:在類的內(nèi)部構(gòu)造方法進(jìn)行內(nèi)部訪問私有屬性笼呆,并在外部調(diào)用方法熊响。如下圖:
- 方法二:在外部通過
對象名._類名__私有屬性名
的方法訪問私有屬性。如下圖:
⑵ 調(diào)用私有方法
- 私有方法是無法從外部直接調(diào)用的诗赌,如下圖:
- 調(diào)用私有方法可以通過
對象名._類名__私有方法名()
的方法調(diào)用私有方法汗茄。如下圖:
7. 繼承
① 語法
class A(object):
def __init__(self, name, age):
self.name = name
self.age = age
class B(A):
def __init__(self, name, age, addr, gender):
A.__init__(self, name, age) # 也可寫為 super(B, self).__init__(name, age) # 新式類
self.addr = addr
self.gender = gender
上面代碼為新式類,object類是A類的基類铭若,A類是B類的基類洪碳,B類繼承了A類,因此在B類的 __init__
方法當(dāng)中叼屠,直接繼承了A類的 __init__
同時(shí)增加了B類 __init__
方法的自有屬性“addr”和“gender”瞳腌。
② 多繼承
類是支持多繼承的,即一個(gè)類可以有多個(gè)基類镜雨,即繼承多個(gè)類嫂侍。但在經(jīng)典類和新式類中,基類的搜索順序(Method Resolution Order)是不同的√舫瑁基類的搜索順序分為“廣度優(yōu)先”和“深度優(yōu)先”
⑴ 廣度優(yōu)先(效率高)
- Python 2.x的新式類
- Python 3.x的經(jīng)典類和新式類
# 【廣度優(yōu)先】Python 2.x 和 Python 3.x的新式類
class A(object):
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
以及
# 【廣度優(yōu)先】Python 3.x的經(jīng)典類
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
- D類中缺少的函數(shù)方法將從基類繼承菲盾,其基類的搜索順序?yàn)椋築 → C → A
⑵ 深度優(yōu)先(效率低)
- Python 2.x的經(jīng)典類
# 【深度優(yōu)先】Python 2.x的經(jīng)典類
class A:
pass
class B(A):
pass
class C(A):
pass
class D(B, C):
pass
D類中缺少的函數(shù)方法將從基類繼承,其基類的搜索順序?yàn)椋築 → A → C
注意:如果C類的基類不是A而是其他類各淀,則基于上述順序懒鉴,搜索C之后再搜索C的基類。
三碎浇、類的方法
1. 靜態(tài)方法
@staticmethod
靜態(tài)方法與類無關(guān)临谱,僅相當(dāng)于一個(gè)單純的函數(shù)。靜態(tài)方法名義上是歸類管理的南捂,但實(shí)際上在靜態(tài)方法里訪問不了類或?qū)嵗械娜魏螌傩浴?/p>
使用場景:屬于該類吴裤,但不需要被復(fù)用的函數(shù),可以考慮使用靜態(tài)方法溺健。
-
注意:
靜態(tài)方法的參數(shù)中不需要寫“self”麦牺,在調(diào)用靜態(tài)方法時(shí),實(shí)參個(gè)數(shù)必須與形參個(gè)數(shù)相等鞭缭。
調(diào)用靜態(tài)方法既可以使用類名調(diào)用剖膳,也可以使用實(shí)例名調(diào)用。
2. 類方法
@classmethod
類方法只能訪問類變量岭辣,不能訪問實(shí)例變量吱晒。當(dāng)在類方法中訪問實(shí)例變量時(shí)將報(bào)錯(cuò),如下圖所示:
因此沦童,類方法只能訪問類變量仑濒。
3. 屬性方法
@property
顧名思義,類的屬性方法是將類的方法轉(zhuǎn)換成以屬性的形式進(jìn)行修改和調(diào)用偷遗。
該部分主要參考的是“Python 之 @property”的講解墩瞳。該部分內(nèi)容是根據(jù)我的理解進(jìn)行重新整理,供參考氏豌。
① 類的屬性和方法調(diào)用
類的屬性調(diào)用:
實(shí)例名.屬性名
類的方法調(diào)用:
實(shí)例名.方法名()
② 問題引出
# 創(chuàng)建類
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
# 實(shí)例化
s1 = Student('Lily', 9999)
上述代碼的實(shí)例對象s1的name屬性和score屬性分別為 s1.name = 'Lily'
喉酌, s1.score = 9999
。代碼邏輯是完全成立的泵喘,但業(yè)務(wù)邏輯中泪电,成績?yōu)?999顯然是不合理的,因此:通過屬性的調(diào)用和修改是無法進(jìn)行參數(shù)檢查的纪铺。
③ 構(gòu)造方法解決問題
# 構(gòu)造get_score方法和set_score方法
class Student(object):
def __init__(self, name, score):
'''
類的初始化
'''
self.name = name
self.score = score
def get_score(self):
'''
獲取score
'''
return self.score
def set_score(self, score):
'''
設(shè)置score并進(jìn)行參數(shù)檢查
'''
if not isinstance(score, int):
raise ValueError("Invalid score!")
if score < 0 or score > 100:
raise ValueError("Score must be between 0 and 100!")
self.score = score
上述代碼通過構(gòu)造“get_score”方法來獲取score相速;通過構(gòu)造“set_score”方法來設(shè)置或修改score的值,同時(shí)進(jìn)行參數(shù)檢查霹陡。
此時(shí)和蚪,當(dāng)通過實(shí)例對象調(diào)用“set_score”方法時(shí)止状,將會(huì)對score的值進(jìn)行檢查烹棉≡芘看似問題得到了解決,但仍然存在2個(gè)缺陷:
第一浆洗,只有通過調(diào)用“set_score”方法才能進(jìn)行score的檢驗(yàn)催束;如果通過屬性的賦值,仍然無法檢驗(yàn)score伏社;在實(shí)例化時(shí)抠刺,無法對score的值進(jìn)行檢驗(yàn)。
第二摘昌,想要在檢查score輸入合法性的前提下修改score不能夠通過修改屬性的方法速妖,必須通過調(diào)用“set_score”方法,盡管復(fù)雜度較低聪黎,但也客觀地增加了復(fù)雜度罕容。
④ @property解決問題
class Student(object):
def __init__(self, name, score):
self.__name = name
self.__score = score
@property # 讀取__score值
def score(self):
return self.__score
@score.setter # 設(shè)置/修改__score值
def score(self, score):
if not isinstance(score, int):
raise ValueError("Invalid score!")
if score < 0 or score > 100:
raise ValueError("Score must be between 0 and 100!")
self.__score = score
@score.deleter # 刪除__score屬性
def score(self):
del self.__score
@property # 讀取__name值
def name(self):
return self.__name
代碼說明:
實(shí)例變量由“name”和“score”改變?yōu)椤癬_name”和“__score”,均為私有屬性稿饰。
@property
:讀取值锦秒。裝飾的方法可以直接以調(diào)用屬性名的方法查看值。如:實(shí)例名.方法名
而非實(shí)例名.方法名()
喉镰。@方法名.setter
:設(shè)置/修改值旅择。裝飾的方法可以直接以修改屬性值的方法修改值。如:實(shí)例名.方法名 = 值
而非實(shí)例名.方法名(值)
侣姆。@方法名.deleter
:刪除方法(屬性)生真。裝飾的方法可以直接以刪除屬性值的方法刪除方法。如:del 實(shí)例名.方法名
捺宗。
注意:
# 實(shí)例化
s1 = Student('Mory', 90)
s1.name = 'Raxxie'
s1.score = 100
執(zhí)行實(shí)例化代碼后柱蟀,
s1.name = 'Raxxie'
會(huì)出現(xiàn)編譯錯(cuò)誤:“AttributeError: can’t set attribute”。因?yàn)檫@里只為“name”提供了讀取方法(@property
)偿凭,沒有提供@name.setter
产弹,故無法對值進(jìn)行設(shè)置和修改。當(dāng)然弯囊,由于沒有@name.deleter
痰哨,想要?jiǎng)h除“name”也是無法實(shí)現(xiàn)的。充滿好奇心又細(xì)心的你或許會(huì)發(fā)現(xiàn)匾嘱,如果直接使用
s1.__name = 'Raxxie'
是可以通過編譯的斤斧。但是,這并不是修改了我們在初始化方法__init__
中的“__name”霎烙,可以通過print(s1.__dict__)
來查看“s1”實(shí)例的屬性撬讽。不難發(fā)現(xiàn)蕊连,私有屬性是“_Student__name”和“_Student__score”,而“__name”則是新的屬性游昼。因此甘苍,通過實(shí)例名.__屬性名 = 值
的方法無法修改值,只是創(chuàng)建了新的屬性烘豌。
⑤ 實(shí)例變量使用私有屬性的原因
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
@property
def score(self):
return self.score
@score.setter
def score(self,score):
if not isinstance(score,int):
raise ValueError("Invalid score!")
if score < 0 or score > 100:
raise ValueError("Score must be between 0 and 100!")
self.score = score
@property
def name(self):
return self.name
def func(self):
self.score = score
上述代碼存在2個(gè)錯(cuò)誤载庭,且無法定義Student類的任何實(shí)例:
第一,@property
把“score”和“name”兩個(gè)成員函數(shù)可以當(dāng)作成員變量來訪問廊佩。那么在定義實(shí)例時(shí)囚聚,調(diào)用 __init__
方法時(shí),執(zhí)行self.name = name
語句标锄,Python會(huì)將左端的“self.name”當(dāng)作函數(shù)調(diào)用顽铸,然而上述代碼并未給“name”定義set函數(shù),即 @name.setter
料皇,于是錯(cuò)誤信息為:“AttributeError: can’t set attribute.”
第二谓松,若注釋掉 @property
裝飾的 name
方法,即:
class Student(object):
def __init__(self,name,score):
self.name = name
self.score = score
@property
def score(self):
return self.score
@score.setter
def score(self,score):
if not isinstance(score,int):
raise ValueError("Invalid score!")
if score < 0 or score > 100:
raise ValueError("Score must be between 0 and 100!")
self.score = score
# @property
# def name(self):
# return self.name
def func(self):
self.score = score
上述代碼仍會(huì)報(bào)錯(cuò)瓶蝴,因?yàn)?__init__
函數(shù)中毒返,執(zhí)行 self.score = score
時(shí),由于已經(jīng)定義了“score”的set函數(shù)舷手,即 @score.setter
拧簸, 因此“self.score”將調(diào)用 @score.setter
裝飾的“score”方法。當(dāng)執(zhí)行到“score”方法中的 self.score = score
時(shí)男窟,等號的左邊還是 @score.setter
裝飾的“score”方法的調(diào)用盆赤。 如此往復(fù),最終以函數(shù)遞歸深度達(dá)到上限退出程序歉眷。
解決方法:
盡量不要讓方法(函數(shù))名與實(shí)例變量(靜態(tài)屬性)同名牺六。因此,建議將方法(函數(shù))名命名為常被調(diào)用的名稱,而實(shí)例變量(靜態(tài)函數(shù))名直接在方法(函數(shù))名前加雙下劃線(“__”),變?yōu)樗接袑傩浴?/p>
四辛燥、類的特殊成員方法
1. __doc__
打印類的描述信息(注釋信息)。
2. __module__和 __class__
__module__:打印對象所屬模塊的模塊名春缕。
__class__:打印對象所屬類的類名。
3. __init__
構(gòu)造方法艘蹋,通過類創(chuàng)建對象時(shí)锄贼,自動(dòng)觸發(fā)執(zhí)行。
語法:
class Test(object):
def __init__(self):
pass
test = Test() # 執(zhí)行__init__方法
4. __del__
在實(shí)例釋放和銷毀的時(shí)候執(zhí)行女阀,通常用于做一些收尾工作宅荤。如:關(guān)閉一些數(shù)據(jù)庫連接屑迂,關(guān)閉已打開的臨時(shí)文件,等冯键。
def __del__(self):
函數(shù)體
當(dāng)對象在內(nèi)存中被釋放時(shí)惹盼,自動(dòng)觸發(fā)執(zhí)行。
- 注意:此方法一般無須定義琼了,因?yàn)镻ython是一門高級語言逻锐,程序員在使用時(shí)無需關(guān)心內(nèi)存的分配和釋放夫晌,因?yàn)榇斯ぷ鞫际墙唤oPython解釋器來執(zhí)行雕薪,所以析構(gòu)函數(shù)的調(diào)用是由解釋器在進(jìn)行垃圾回收時(shí)自動(dòng)觸發(fā)執(zhí)行的。
5. __call__
實(shí)例化之后再調(diào)用晓淀,觸發(fā)執(zhí)行所袁。即: 類名()()
或 實(shí)例對象名()
語法:
class Test(object):
def __init__(self):
pass
def __call__(self):
pass
test = Test() # 執(zhí)行__init__方法
test() # 執(zhí)行__call__方法
Test()() # 執(zhí)行__init__方法后再執(zhí)行__call__方法
6. __dict__
類調(diào)用,打印類中的所有屬性凶掰;實(shí)例調(diào)用燥爷,打印當(dāng)前實(shí)例的所有屬性。
7. __str__
在類中定義 def \_\_str__(self)
方法懦窘,打印實(shí)例化對象(名)時(shí)可以打印出該方法的返回值前翎。
8. __getitem__, __setitem__, __delitem__
用于索引操作,如字典畅涂。 __getitem__
用于獲取數(shù)據(jù)港华; __setitem__
用于設(shè)置數(shù)據(jù); __delitem__
用于刪除數(shù)據(jù)午衰。
9. __new__ 和 __metaclass__
① Python萬物皆對象
用于創(chuàng)建實(shí)例的立宜,先于__init__
執(zhí)行,默認(rèn)已寫好臊岸,不需要寫橙数。
上述代碼中,obj 是通過 Foo 類實(shí)例化的對象帅戒。其實(shí)灯帮,不僅 obj 是一個(gè)對象,F(xiàn)oo 類本身也是一個(gè)對象逻住,因?yàn)?strong>在Python中一切皆對象钟哥。
所以可得如下結(jié)論:obj 對象是通過執(zhí)行 Foo 類的構(gòu)造方法創(chuàng)建;那么 Foo 類對象應(yīng)該也是通過執(zhí)行某個(gè)類的 構(gòu)造方法而創(chuàng)建鄙信。而根據(jù)上述代碼的執(zhí)行結(jié)果來看瞪醋,F(xiàn)oo 應(yīng)為 type 類的實(shí)例對象,即:Foo類對象 是通過type類的構(gòu)造方法創(chuàng)建装诡。
② 類的創(chuàng)建方法:普通方法
③ 類的創(chuàng)建方法:特殊方法
類的特殊構(gòu)造方法的作用和功能以及調(diào)用方式與普通構(gòu)造方法相同银受,只是構(gòu)造語法存在區(qū)別践盼。
- 類的特殊構(gòu)造方法語法:
def 函數(shù)名1(self):
函數(shù)體
def 函數(shù)名2(self):
函數(shù)體
...
def 函數(shù)名N(self):
函數(shù)體
類名 = type('類名', (object,), {'方法名1': 函數(shù)名1, '方法名2': 函數(shù)名2, ..., '方法名N': 函數(shù)名N})
- 注意:
語法中加引號的為字符串類型,沒有引號的直接寫相應(yīng)內(nèi)容即可宾巍。
-
type 函數(shù)的參數(shù):
- 參數(shù)1:類名咕幻,字符串格式。
- 參數(shù)2:當(dāng)前類的基類顶霞,元組格式肄程,只有1個(gè)基類則需要有逗號。
- 參數(shù)3:類的成員选浑,字典格式蓝厌,鍵為類的方法名(字符串格式),值為對應(yīng)的函數(shù)古徒。
④ type 創(chuàng)建類和類創(chuàng)建實(shí)例對象的原理
類中有一個(gè)屬性 __metaclass__
拓提,其用來表示該類由“誰”來實(shí)例化創(chuàng)建,所以隧膘,我們可以為 __metaclass__
設(shè)置一個(gè) type 類的派生類代态,從而查看類創(chuàng)建的過程。
10. 類的生成和調(diào)用順序
__new__
→ __init__
→ __call__
五疹吃、反射
1. getattr
getattr(實(shí)例名, 屬性/方法名[, 默認(rèn)值])
調(diào)用實(shí)例當(dāng)中的屬性/方法蹦疑。若屬性存在,則打印屬性值萨驶;若方法存在歉摧,則打印方法的內(nèi)存地址。默認(rèn)值可有可無篡撵,若設(shè)定默認(rèn)值判莉,則當(dāng)屬性/方法不存在時(shí),返回默認(rèn)值育谬。
- 注意:實(shí)例名不加引號券盅;屬性/方法名和默認(rèn)值加引號。
2. hasattr
hasattr(實(shí)例名, 屬性/方法名)
判斷對象中是否含有指定的屬性/方法膛檀。有锰镀,返回True;沒有咖刃,返回False泳炉。
- 注意:實(shí)例名不加引號,屬性名加引號嚎杨。
class Dog(object):
def __init__(self, name):
self.name = name
def eat(self):
print("%s is eating..." % self.name)
dog = Dog('Jackie')
choice = input(">>:").strip()
print(hasattr(dog, choice))
3. setattr
① 自定義字符串與函數(shù)關(guān)聯(lián)
setattr(實(shí)例名, 字符串, 函數(shù)名)
意為:實(shí)例名.字符串 = 函數(shù)名
通過字符串設(shè)置新的屬性花鹅。
- 注意:實(shí)例名和函數(shù)名不加引號,字符串加引號枫浙。
def dancing(self):
print('%s is dancing...' % self.name)
class Dog(object):
def __init__(self, name):
self.name = name
def eating(self):
print("%s is eating..." % self.name)
dog = Dog('Jackie')
setattr(dog, 'dance', dancing) # 即 dog.dance = dancing
print(dog.dance(dog)) # 即 dancing(dog)
- 注意:由于
dancing
函數(shù)沒有在Dog
類中刨肃,因此它的參數(shù)“self”需要手動(dòng)傳入古拴。
② 屬性賦值
setattr(實(shí)例名, 屬性名, 值)
給對象的屬性賦值,若屬性存在真友,則修改值黄痪;若屬性不存在,則先創(chuàng)建屬性再為屬性賦值盔然。
4. delattr
delattr(實(shí)例名, 屬性名)
刪除實(shí)例的指定屬性桅打。
六、異常處理
① 異常
簡單來說愈案,異常即錯(cuò)誤挺尾。在Python無法正常處理程序時(shí)就會(huì)發(fā)生一個(gè)異常。
當(dāng)發(fā)生異常時(shí)刻帚,程序會(huì)終止執(zhí)行潦嘶,因此,對異常的捕獲和處理有助于我們在運(yùn)行代碼時(shí)規(guī)避錯(cuò)誤而使代碼正常執(zhí)行崇众。
② 語法
try:
<代碼>
except <錯(cuò)誤類型>: # try代碼執(zhí)行時(shí)如出現(xiàn)了異常(<錯(cuò)誤類型>)則執(zhí)行該代碼
<代碼>
else: # try代碼執(zhí)行沒有異常時(shí)執(zhí)行該代碼
<代碼>
finally: # 無論try代碼執(zhí)行是否有異常都會(huì)執(zhí)行該代碼
<代碼>
③ 說明
異常處理的代碼執(zhí)行順序?yàn)椋簣?zhí)行try代碼,若try代碼能夠正常執(zhí)行航厚,則直接執(zhí)行后顷歌,執(zhí)行else代碼,最后執(zhí)行finally代碼幔睬;若try代碼執(zhí)行發(fā)生異常眯漩,且錯(cuò)誤類型為except后指定的錯(cuò)誤類型,則終止try代碼的執(zhí)行麻顶,執(zhí)行except代碼赦抖,最后執(zhí)行finally代碼。
finally語句可有可無辅肾,非必需队萤。但finally語句和except語句必有其一。
except語句可以有多個(gè)矫钓,Python將按照except語句的順序依次匹配異常要尔,若異常被處理,則不再檢索后續(xù)except語句新娜。
-
捕捉錯(cuò)誤信息:
except <錯(cuò)誤類型> as e: print('錯(cuò)誤信息:', e)
其中赵辕,e表示錯(cuò)誤日志,可以是任何字母或單詞概龄。as可以由英文逗號代替还惠。
-
except可以處理多個(gè)錯(cuò)誤類型,錯(cuò)誤類型之間以英文逗號隔開需將所有錯(cuò)誤類型用括號括起:
except (<錯(cuò)誤類型1>, <錯(cuò)誤類型2>, ..., <錯(cuò)誤類型N>) as e: print('錯(cuò)誤信息:', e)
-
捕獲所有異常:
except Exception as e: print('錯(cuò)誤信息:', e)
Exception須首字母大寫私杜。
-
不捕獲錯(cuò)誤信息的所有異常處理:
try: <代碼> except: <代碼> else: <代碼>
當(dāng)try代碼能夠正常執(zhí)行時(shí)蚕键,隨后執(zhí)行else代碼互拾;當(dāng)try代碼執(zhí)行拋出異常時(shí),無論什么異常(未指定錯(cuò)誤類型)嚎幸,都執(zhí)行except代碼颜矿。
④ 常見的錯(cuò)誤類型
錯(cuò)誤類型 | 解釋 |
---|---|
ArithmeticError | 所有數(shù)值計(jì)算錯(cuò)誤的基類 |
AssertionError | 斷言語句失敗 |
AttributeError | 對象沒有這個(gè)屬性 |
BaseException | 所有異常的基類 |
DeprecationWarning | 關(guān)于被棄用的特征的警告 |
EnvironmentError | 操作系統(tǒng)錯(cuò)誤的基類 |
EOFError | 沒有內(nèi)建輸入,到達(dá)EOF 標(biāo)記 |
Exception | 常規(guī)錯(cuò)誤的基類 |
FloatingPointError | 浮點(diǎn)計(jì)算錯(cuò)誤 |
FutureWarning | 關(guān)于構(gòu)造將來語義會(huì)有改變的警告 |
GeneratorExit | 生成器(generator)發(fā)生異常來通知退出 |
ImportError | 導(dǎo)入模塊/對象失敗 |
IndentationError | 縮進(jìn)錯(cuò)誤 |
IndexError | 序列中沒有此索引(index) |
IOError | 輸入/輸出操作失敗 |
KeyboardInterrupt | 用戶中斷執(zhí)行(通常是輸入^C) |
KeyError | 映射中沒有這個(gè)鍵 |
LookupError | 無效數(shù)據(jù)查詢的基類 |
MemoryError | 內(nèi)存溢出錯(cuò)誤(對于Python 解釋器不是致命的) |
NameError | 未聲明/初始化對象 (沒有屬性) |
NotImplementedError | 尚未實(shí)現(xiàn)的方法 |
OSError | 操作系統(tǒng)錯(cuò)誤 |
OverflowError | 數(shù)值運(yùn)算超出最大限制 |
OverflowWarning | 舊的關(guān)于自動(dòng)提升為長整型(long)的警告 |
PendingDeprecationWarning | 關(guān)于特性將會(huì)被廢棄的警告 |
ReferenceError | 弱引用(Weak reference)試圖訪問已經(jīng)垃圾回收了的對象 |
RuntimeError | 一般的運(yùn)行時(shí)錯(cuò)誤 |
RuntimeWarning | 可疑的運(yùn)行時(shí)行為(runtime behavior)的警告 |
StandardError | 所有的內(nèi)建標(biāo)準(zhǔn)異常的基類 |
StopIteration | 迭代器沒有更多的值 |
SyntaxError | Python 語法錯(cuò)誤 |
SyntaxWarning | 可疑的語法的警告 |
SystemError | 一般的解釋器系統(tǒng)錯(cuò)誤 |
SystemExit | 解釋器請求退出 |
TabError | Tab 和空格混用 |
TypeError | 對類型無效的操作 |
UnboundLocalError | 訪問未初始化的本地變量 |
UnicodeDecodeError | Unicode 解碼時(shí)的錯(cuò)誤 |
UnicodeEncodeError | Unicode 編碼時(shí)錯(cuò)誤 |
UnicodeError | Unicode 相關(guān)的錯(cuò)誤 |
UnicodeTranslateError | Unicode 轉(zhuǎn)換時(shí)錯(cuò)誤 |
UserWarning | 用戶代碼生成的警告 |
ValueError | 傳入無效的參數(shù) |
Warning | 警告的基類 |
WindowsError | 系統(tǒng)調(diào)用失敗 |
ZeroDivisionError | 除(或取模)零 (所有數(shù)據(jù)類型) |
⑤ 觸發(fā)異常
根據(jù)需要,可以使用raise語句自行觸發(fā)異常嫉晶,即自己報(bào)錯(cuò)骑疆。
語法:
raise <錯(cuò)誤類型>
自定義錯(cuò)誤信息:
raise Exception(錯(cuò)誤信息)
⑥ 自定義錯(cuò)誤
class 自定義錯(cuò)誤名(Exception): # Exception為基類
def __init__(self, message): # message為錯(cuò)誤信息
self.message = message
def __str__(self): # 打印e即調(diào)用的此方法。返回值為self.message替废,因此實(shí)例化時(shí)定義的錯(cuò)誤原因就是顯示的錯(cuò)誤原因箍铭。由于Exception基類中已經(jīng)有了__str__,因此除非需要額外增加內(nèi)容椎镣,否則不必再寫__str__方法诈火。
return self.message
try:
raise 自定義錯(cuò)誤名("錯(cuò)誤原因")
except 自定義錯(cuò)誤名 as e:
print(e) # 打印錯(cuò)誤原因
第五部分:參考資料
Python 官方文檔:PEP 8 -- Style Guide for Python Code
菜鳥教程:Python 字典
菜鳥教程:Python3 條件控制
菜鳥教程:Python3 循環(huán)語句
菜鳥教程:Python 函數(shù)
Python官方文檔:Built-in Functions
菜鳥教程:Python內(nèi)置函數(shù)
python 最大遞歸次數(shù) RuntimeError: maximum recursion depth exceeded
菜鳥教程:Python 日期和時(shí)間
菜鳥教程:Python OS 文件/目錄方法
百度百科:編程
菜鳥教程:Python 異常處理