Python基礎(chǔ)

〇、前言

本文共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ī)范述呐、基本數(shù)據(jù)類型和流程控制語句
第一部分:Python代碼規(guī)范惩淳、基本數(shù)據(jù)類型和流程控制語句

一、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

例如:


數(shù)字類型
數(shù)字類型

② 進(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() 最大值 返回整型

例如:


相關(guān)內(nèi)置函數(shù)
相關(guān)內(nèi)置函數(shù)

③ 操作符

⑴ 算術(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秉撇。
舉例
“==” 與 “is” 的區(qū)別
“==” 與 “is” 的區(qū)別

④ 浮點(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)

⑴ 字符串的字符從左到右順序排列赡麦。

⑵ 字符串不可改變们衙。

⑶ 字符串使用英文半角單引號('')梦皮、雙引號("")溃睹、三單引號('''''')商佑、三雙引號("""""")引用來表示。

  • 注意:

    1. 單獨(dú)使用時(shí)新症,單引號和雙引號沒有區(qū)別泡躯。
    2. 當(dāng)引號中嵌套引號時(shí),必須單引號中嵌套雙引號;或者雙引號中嵌套單引號艾少。
    3. 三引號當(dāng)中的內(nèi)容可以跨行陪踩,將保留內(nèi)容的原格式荆秦。
  • 舉例:


    字符串引號的區(qū)別
    字符串引號的區(qū)別

③ 字符串格式化表達(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ù)字代替滤否。

⑶ 舉例

字符串格式化表達(dá)
字符串格式化表達(dá)

④ 前綴字符

⑴ “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碼表:
ASCII碼表一
ASCII碼表一
ASCII碼表二
ASCII碼表二
  • 舉例:


    字符串與其他格式之間的轉(zhuǎn)換
    字符串與其他格式之間的轉(zhuǎn)換

⑥ 字符串的序列屬性

⑴ 索引

索引即根據(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”為可迭代對象。

例如:


其他數(shù)據(jù)類型轉(zhuǎn)為列表
其他數(shù)據(jù)類型轉(zhuǎn)為列表

④ 列表的序列屬性

⑴ 索引

列表是“有序”的鹤盒。索引即根據(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ù)字(intfloat)棚壁、字符串(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>”是元素的取值條件系吩,可有可無来庭。

舉例:


列表推導(dǎo)式
列表推導(dǎo)式

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”為可迭代對象狈醉。

例如:


其他數(shù)據(jù)類型轉(zhuǎn)為列表
其他數(shù)據(jù)類型轉(zhuǎn)為列表

④ 元組的序列屬性

⑴ 索引

元組是“有序”的廉油。索引即根據(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ù)據(jù)類型轉(zhuǎn)為集合
  • 注意:
    1. 其他數(shù)據(jù)類型轉(zhuǎn)為集合時(shí)木羹,重復(fù)的元素將只會(huì)保留1個(gè)甲雅。

    2. 字典轉(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)算(關(guān)系測試)
集合運(yùn)算(關(guān)系測試)

⑥ 三組運(yùn)算的實(shí)例對比

⑴ difference() 與 difference_update()

set1.difference(set2) 與 set1.difference_update(set2)
set1.difference(set2) 與 set1.difference_update(set2)

⑵ intersection() 與 intersection_update()

set1.intersection(set2) 與 set1.intersection_update(set2)
set1.intersection(set2) 與 set1.intersection_update(set2)

⑶ symmetric_difference() 與 symmetric_difference_update()

set1.symmetric_difference(set2) 與 set1.symmetric_difference_update(set2)
set1.symmetric_difference(set2) 與 set1.symmetric_difference_update(set2)

⑦ 集合的增刪

⑴ 增

增加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ù)颂斜。

  • 清空集合。

例如:


隨機(jī)刪除元素和清空集合
隨機(jī)刪除元素和清空集合

⑧ 內(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ù)字皂冰,否則將拋出異常

⑵ 舉例

集合與內(nèi)置函數(shù)
集合與內(nèi)置函數(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>”是元素的取值條件崖咨,可有可無。

舉例:


集合推導(dǎo)式
集合推導(dǎo)式

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è)鍵值對珊随。

例如:


字典的鍵重復(fù)
字典的鍵重復(fù)
  • 字典的“鍵”必須是不可變對象的數(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)建字典碗淌,鍵名不需要加引號盏求。

例如:


創(chuàng)建字典
創(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>”是元素的鍵和值的取值條件,可有可無档玻。

舉例:


字典推導(dǎo)式
字典推導(dǎo)式

三怀泊、流程控制語句

1. 條件控制

條件控制
條件控制

① 語法一:if

if 條件:
    代碼塊

該情況只有一個(gè) if 語句,表示當(dāng)條件成立時(shí)窃肠,執(zhí)行代碼塊包个,否則就繼續(xù)執(zhí)行主程序。

例如:


if
if

② 語法二:if...else...

if 條件:
    代碼塊1
else:
    代碼塊2

當(dāng) if 語句條件成立時(shí),執(zhí)行 代碼塊1碧囊;否則執(zhí)行 else 語句的代碼塊2树灶。然后再繼續(xù)執(zhí)行主程序。

例如:


if...else...
if...else...

③ 語法三: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í)行主程序诺祸。

例如:


if...elif...else...
if...elif...else...

④ 語法四:三元運(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”。

例如:


三元運(yùn)算符
三元運(yùn)算符

⑤ 注意

  • 其中"判斷條件"成立時(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í)行囤攀。
    • andor 的優(yōu)先級低于比較操作符號,即比較操作符在沒有括號的情況下會(huì)比邏輯操作符要優(yōu)先判斷宫纬。

2. 循環(huán)語句

① for循環(huán)

⑴ for循環(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辽故。

⑷ 舉例

for循環(huán)和range()函數(shù)
for循環(huán)和range()函數(shù)

② while循環(huán)

⑴ while循環(huán)流程圖

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è)置為 1True维苔。

無限循環(huán)的使用場景:

  • 游戲界面的實(shí)時(shí)刷新。
  • 服務(wù)器上客戶端的實(shí)時(shí)請求懂昂。
  • ......

例如:


自定義條件的無限循環(huán)
自定義條件的無限循環(huán)
條件為1的無限循環(huán)
條件為1的無限循環(huán)
條件為True的無限循環(huán)
條件為True的無限循環(huán)

⑸ 舉例

while循環(huán)
while循環(huán)

③ continue 和 break

contiue 語句的作用是跳過當(dāng)前循環(huán)介时,執(zhí)行下一輪循環(huán)。如果當(dāng)前循環(huán)后邊仍有代碼未執(zhí)行凌彬,那么也直接跳到下一輪循環(huán)潮尝。可以用于 forwhile 循環(huán)中饿序。

break 語句的作用是跳出整個(gè)循環(huán)體。如果接下來仍有循環(huán)未進(jìn)行羹蚣,那么不再執(zhí)行余下循環(huán)原探,跳出整個(gè)循環(huán)體。可以用于 forwhile 循環(huán)中咽弦。

例如:


continue 和 break
continue 和 break

④ pass

pass 是空語句徒蟆,是為了保持程序結(jié)構(gòu)的完整性。

pass 不做任何事情型型,一般用做占位語句段审。

例如:

class Test(object):
    pass

def test():
    pass

第二部分:函數(shù)
第二部分:函數(shù)

一、函數(shù)

1. 函數(shù)的定義

函數(shù)是組織好的闹蒜,可重復(fù)使用的寺枉,用來實(shí)現(xiàn)單一,或相關(guān)聯(lián)功能的代碼段绷落。

能夠被稱為函數(shù)的代碼段姥闪,具有以下特點(diǎn):

  1. 代碼段被封裝。
  2. 具有特定的名稱作為函數(shù)名砌烁。
  3. 可以通過調(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)勢在于:

  1. 減少重復(fù)代碼蹲蒲。
  2. 代碼便于維護(hù)番甩。
  3. 程序可擴(kuò)展性強(qiáng)。

3. 語法

① 定義函數(shù)

def 函數(shù)名([參數(shù)1, 參數(shù)2, ..., 參數(shù)N]):
    """
    函數(shù)的解釋說明文字
    """
    函數(shù)體
    [return 返回值]
  • 必需要素:

    1. def 開頭届搁。
    2. 確定的函數(shù)名缘薛,可自定義窍育,通常以小寫字母開頭,并與 def 以空格隔開宴胧。
    3. 在函數(shù)名后必須有英文半角的括號()冒號漱抓。
    4. 函數(shù)體中的代碼前均需縮進(jìn)
  • 非必需要素:

    1. 參數(shù)為非必需要素恕齐,函數(shù)可以沒有參數(shù)乞娄,也可以有1個(gè)或多個(gè)參數(shù)。多個(gè)參數(shù)之間以英文半角逗號隔開显歧。
    2. 函數(shù)的解釋說明文字為非必需要素仪或,但建議為函數(shù)匹配相應(yīng)的解釋說明。解釋說明內(nèi)容前后均要有3個(gè)英文半角單引號雙引號追迟。
    3. return 返回值 為非必需要素溶其。

② 調(diào)用函數(shù)

函數(shù)名([參數(shù)1, 參數(shù)2, ..., 參數(shù)N])
  • 必需要素:

    1. 被調(diào)用函數(shù)的函數(shù)名。
    2. 緊接著函數(shù)名后的英文半角括號()敦间。
  • 非必需要素:參數(shù)瓶逃。須遵循定義函數(shù)時(shí)的參數(shù)個(gè)數(shù),即調(diào)用函數(shù)時(shí)參數(shù)的個(gè)數(shù)需要與定義函數(shù)時(shí)參數(shù)的個(gè)數(shù)相等廓块,否則會(huì)報(bào)錯(cuò)厢绝。

③ 舉例

函數(shù)的定義與調(diào)用
函數(shù)的定義與調(diào)用

二、參數(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ù)獲得確定值虚婿。

  • 例如:


    形式參數(shù)和實(shí)際參數(shù)
    形式參數(shù)和實(shí)際參數(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)鍵字傳參疮跑。

  • 例如:


    位置參數(shù)和關(guān)鍵字參數(shù)
    位置參數(shù)和關(guān)鍵字參數(shù)

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)形參之后。

  • 例如:


    默認(rèn)參數(shù)
    默認(rèn)參數(shù)

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í)參賦的值勉盅。

③ 注意

  1. 元組型不定長參數(shù)和字典型不定長參數(shù)在星號之后的形參名可以自定義為任意名稱佑颇。但我們習(xí)慣把元組型用 *args,把字典型用 **kwargs 表示草娜,分別為“arguments”和“keyword arguments”的縮寫挑胸。

  2. 元組型不定長參數(shù)和字典型不定長參數(shù)可以和普通參數(shù)結(jié)合使用,其位置順序應(yīng)當(dāng)遵循:普通參數(shù)宰闰,默認(rèn)參數(shù)茬贵,元組型不定長參數(shù),字典型不定長參數(shù)议蟆。在上述位置順序中闷沥,不建議使用默認(rèn)參數(shù)。

  3. 元組型不定長參數(shù)和字典型不定長參數(shù)既可以單獨(dú)使用咐容,也可以結(jié)合使用舆逃,但字典型不定長參數(shù)必須放在元組型不定長參數(shù)之后。

④ 舉例

非固定參數(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的版本中無法使用。

③ 舉例

global與nonlocal
global與nonlocal

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. 舉例

return
return

五、匿名函數(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 = 1b = 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ù)舉例

高階函數(shù)
高階函數(shù)

7. 嵌套函數(shù)

① 定義

顧名思義,嵌套函數(shù)就是在一個(gè)函數(shù)的函數(shù)體內(nèi)定義另一個(gè)函數(shù)至壤。

② 嵌套函數(shù)舉例

嵌套函數(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

  • 舉例:


    裝飾器基礎(chǔ)版
    裝飾器基礎(chǔ)版

② 進(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ù)。

  • 舉例:


    裝飾器進(jìn)階版
    裝飾器進(jìn)階版

③ 高階版——裝飾器和原函數(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)系圖

容器、可迭代對象火焰、迭代器劲装、生成器的關(guān)系
容器、可迭代對象昌简、迭代器占业、生成器的關(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ù)匯總表

Python的內(nèi)置函數(shù)
Python的內(nèi)置函數(shù)

2. 內(nèi)置函數(shù)詳解

菜鳥教程:Python內(nèi)置函數(shù)

3. ASCII碼表

ASCII碼表一
ASCII碼表一
ASCII碼表二
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ù))

  1. 導(dǎo)入模塊之前調(diào)用重名方法(函數(shù))
def greeting():
    print("Welcome to Main File!")

greeting()

from module_test import *

運(yùn)行結(jié)果為:

Welcome to Main File!
  1. 導(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ù))

  1. 導(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!
  1. 在當(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
  • 注意:
    1. “module_name”為引入的模塊名晦炊。
    2. “function_name”為從模塊中引入的方法(函數(shù))名鞠鲜。
    3. 如果引入的方法(函數(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)入包即可碧信。

  • 注意:
    1. 直接在 __init__ 文件中導(dǎo)入包中的模塊會(huì)報(bào)錯(cuò)赊琳,即 import module_name 的語法會(huì)報(bào)錯(cuò),需要使用 from . import module_name 砰碴。其中躏筏,“.” 指的是 __init__ 文件所在的當(dāng)前目錄。

    2. 若當(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)前文件所在目錄名(相對路徑)
    當(dāng)前文件所在目錄名(相對路徑)

⑤ 當(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>

  1. 查找名為“module_name”的Python文件店煞。

  2. 在“modul_name”文件中查找被調(diào)用的方法(函數(shù))蟹演。

  3. 執(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_namefrom module_name import function_name as alias囤萤。此時(shí)昼窗,當(dāng)前文件調(diào)用模塊中名為“function_name”的方法(函數(shù))時(shí),其執(zhí)行順序?yàn)椋?/p>

  1. 查找名為“module_name”的Python文件阁将。

  2. 在“modul_name”文件中查找被調(diào)用的“function_name”方法(函數(shù))膏秫。

  3. 執(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
  • 注意:
    1. 參數(shù)有方括號“[]”的表示參數(shù)可有可無糊余;否則必須有參數(shù)或必須沒有參數(shù)。

    2. 調(diào)用屬性語法:time.屬性名()

3. 時(shí)間戳单寂、時(shí)間元組贬芥、時(shí)間格式化字符串的相互轉(zhuǎn)換

時(shí)間戳、時(shí)間元組宣决、時(shí)間格式化字符串的相互轉(zhuǎn)換
時(shí)間戳蘸劈、時(shí)間元組、時(shí)間格式化字符串的相互轉(zhuǎn)換

4. time模塊舉例

time模塊舉例
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模塊舉例

datetime模塊舉例
datetime模塊舉例

7. datetime模塊常見用法

① 獲取過去或未來的日期

import datetime

datetime.date.today() + datetime.timedelta([days=])
  • 注意:
    1. “days=”為關(guān)鍵字傳參,“=”后跟數(shù)字遗嗽,意為天數(shù)粘我。“+”表示未來的天數(shù)痹换;“-”表示過去的天數(shù)征字。

    2. “[]”表示參數(shù)可有可無,在實(shí)際傳參中不需要寫方括號“[]”娇豫。若沒有參數(shù)匙姜,表示日期不偏移。

② 獲取過去或未來的日期和時(shí)間

import datetime

datetime.datetime.now() + datetime.timedelta([days=],  [hours=], [minutes=], [seconds=], [microseconds=])
  • 注意:
    1. “datetime.timedelta()”為關(guān)鍵字傳參冯痢,“=”后跟數(shù)字氮昧,意為天數(shù)/小時(shí)數(shù)/分鐘數(shù)/秒數(shù)/微秒數(shù)框杜。“+”表示未來的偏移袖肥;“-”表示過去的偏移咪辱。

    2. “[]”表示參數(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ù)仁堪。

  • 注意:

    1. 6表示星期日哮洽。

    2. 為了便于理解變量的含義填渠,此處的變量名比較長。

⑥ 獲取上個(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)

⑶ 注意

  1. “day_delta”的值為兩個(gè)日期相差的天數(shù)。運(yùn)用了屬性 .days再层,這個(gè)屬性只有計(jì)算差時(shí)(datetime模塊中的timedelta類中)才可以使用贸铜。

  2. “seconds_delta”的值為兩個(gè)日期相差的總秒數(shù)。運(yùn)用了屬性 .total_seconds()聂受,這個(gè)屬性只有計(jì)算差時(shí)(datetime模塊中的timedelta類中)才可以使用蒿秦。如果使用了 seconds 屬性,則結(jié)果為0蛋济。因?yàn)樵搶傩?strong>只計(jì)算兩個(gè)日期的秒的差棍鳖。

8. datetime模塊常見用法舉例

datetime模塊常見用法舉例
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模塊常見用法舉例

calendar模塊常見用法舉例
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模塊常見用法舉例

random模塊常見用法舉例
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 -lls -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

⑻ 粘貼位

  1. 粘貼位一般用在目錄上打肝,用在文件上起不到作用脂新。

  2. 粘貼位只對所有權(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

第四部分:面向?qū)ο蠛皖?><div   id=第四部分:面向?qū)ο蠛皖?/div>

一、編程范式

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):

    1. 程序的維護(hù)和擴(kuò)展變得簡單闽撤。
    2. 提高開發(fā)效率。
    3. 更容易理解代碼邏輯脯颜。
  • 使用場景:任務(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ū)別

新式類與經(jīng)典類的區(qū)別Python 2.7
新式類與經(jīng)典類的區(qū)別Python 2.7
新式類與經(jīng)典類的區(qū)別Python 3.6
新式類與經(jīng)典類的區(qū)別Python 3.6
  1. 如上圖所示施符,第1幅圖可以明顯地展示出新式類與經(jīng)典類的區(qū)別碍舍,其運(yùn)行環(huán)境是Python 2.7版本脯厨;然而,在Python 3.6版本中作箍,這個(gè)區(qū)別已經(jīng)不再存在,如第2幅圖所示前硫。

  2. 新式類都從object類繼承胞得,而經(jīng)典類不需要。

  3. 新式類相同父類只執(zhí)行一次構(gòu)造函數(shù)屹电,經(jīng)典類重復(fù)執(zhí)行多次阶剑。

  4. 在多繼承方面跃巡,新式類的基類搜索順序與經(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í)例變量的增刪改查

實(shí)例變量的增刪改查
實(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)用方法熊响。如下圖:
訪問私有屬性方法一
訪問私有屬性方法一
  • 方法二:在外部通過 對象名._類名__私有屬性名 的方法訪問私有屬性。如下圖:
05_訪問私有屬性
05_訪問私有屬性

⑵ 調(diào)用私有方法

  • 私有方法是無法從外部直接調(diào)用的诗赌,如下圖:
無法調(diào)用私有方法
無法調(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)方法溺健。

  • 注意:

    1. 靜態(tài)方法的參數(shù)中不需要寫“self”麦牺,在調(diào)用靜態(tài)方法時(shí),實(shí)參個(gè)數(shù)必須與形參個(gè)數(shù)相等鞭缭。

    2. 調(diào)用靜態(tài)方法既可以使用類名調(diào)用剖膳,也可以使用實(shí)例名調(diào)用。

靜態(tài)方法
靜態(tài)方法

2. 類方法

@classmethod

類方法只能訪問類變量岭辣,不能訪問實(shí)例變量吱晒。當(dāng)在類方法中訪問實(shí)例變量時(shí)將報(bào)錯(cuò),如下圖所示:

類方法無法訪問實(shí)例變量
類方法無法訪問實(shí)例變量

因此沦童,類方法只能訪問類變量仑濒。

類方法訪問類變量
類方法訪問類變量

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__

打印類的描述信息(注釋信息)。

__doc__
__doc__

2. __module__和 __class__

  • __module__:打印對象所屬模塊的模塊名春缕。

  • __class__:打印對象所屬類的類名。

__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__方法
__call__
__call__

6. __dict__

類調(diào)用,打印類中的所有屬性凶掰;實(shí)例調(diào)用燥爷,打印當(dāng)前實(shí)例的所有屬性。

__dict__
__dict__

7. __str__

在類中定義 def \_\_str__(self) 方法懦窘,打印實(shí)例化對象(名)時(shí)可以打印出該方法的返回值前翎。

__str__
__str__

8. __getitem__, __setitem__, __delitem__

用于索引操作,如字典畅涂。 __getitem__ 用于獲取數(shù)據(jù)港华; __setitem__ 用于設(shè)置數(shù)據(jù); __delitem__ 用于刪除數(shù)據(jù)午衰。

__getitem__ & __setitem__ & __delitem__
__getitem__ & __setitem__ & __delitem__

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})
  • 注意:
    1. 語法中加引號的為字符串類型,沒有引號的直接寫相應(yīng)內(nèi)容即可宾巍。

    2. type 函數(shù)的參數(shù):

      1. 參數(shù)1:類名咕幻,字符串格式。
      2. 參數(shù)2:當(dāng)前類的基類顶霞,元組格式肄程,只有1個(gè)基類則需要有逗號。
      3. 參數(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)建屬性再為屬性賦值盔然。

setattr
setattr

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í)行該代碼
    <代碼>

③ 說明

  1. 異常處理的代碼執(zhí)行順序?yàn)椋簣?zhí)行try代碼,若try代碼能夠正常執(zhí)行航厚,則直接執(zhí)行后顷歌,執(zhí)行else代碼,最后執(zhí)行finally代碼幔睬;若try代碼執(zhí)行發(fā)生異常眯漩,且錯(cuò)誤類型為except后指定的錯(cuò)誤類型,則終止try代碼的執(zhí)行麻顶,執(zhí)行except代碼赦抖,最后執(zhí)行finally代碼。

  2. finally語句可有可無辅肾,非必需队萤。但finally語句和except語句必有其一

  3. except語句可以有多個(gè)矫钓,Python將按照except語句的順序依次匹配異常要尔,若異常被處理,則不再檢索后續(xù)except語句新娜。

  4. 捕捉錯(cuò)誤信息:

    except <錯(cuò)誤類型> as e:
        print('錯(cuò)誤信息:', e)
    

    其中赵辕,e表示錯(cuò)誤日志,可以是任何字母或單詞概龄。as可以由英文逗號代替还惠。

  5. except可以處理多個(gè)錯(cuò)誤類型,錯(cuò)誤類型之間以英文逗號隔開需將所有錯(cuò)誤類型用括號括起:

    except (<錯(cuò)誤類型1>, <錯(cuò)誤類型2>, ..., <錯(cuò)誤類型N>) as e:
        print('錯(cuò)誤信息:', e)
    
  6. 捕獲所有異常:

    except Exception as e:
        print('錯(cuò)誤信息:', e)
    

    Exception須首字母大寫私杜。

  7. 不捕獲錯(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ò)誤原因

第五部分:參考資料

  1. Python 官方文檔:PEP 8 -- Style Guide for Python Code

  2. 菜鳥教程:Python 編碼規(guī)范(Google)

  3. 菜鳥教程:Python3 基本數(shù)據(jù)類型

  4. Python之路,Day1 - Python基礎(chǔ)1

  5. Python中的運(yùn)算符

  6. Python常見序列詳解

  7. Python中的可變對象和不可變對象

  8. 集合

  9. Python 集合

  10. 菜鳥教程:Python 字典

  11. 菜鳥教程:Python3 條件控制

  12. 菜鳥教程:Python3 循環(huán)語句

  13. Python之路,Day3 - Python基礎(chǔ)3

  14. 菜鳥教程:Python 函數(shù)

  15. Python中的LEGB規(guī)則

  16. Python/函數(shù)的嵌套和閉包

  17. 深入理解python中閉包,閉包的實(shí)質(zhì)

  18. python裝飾器

  19. python 裝飾器 (多個(gè)參數(shù)的函數(shù)状答,帶參數(shù)的裝飾器)

  20. Python之路,Day4 - Python基礎(chǔ)4 (new版)

  21. Iterables vs. Iterators vs. Generators

  22. Python官方文檔:Built-in Functions

  23. 菜鳥教程:Python內(nèi)置函數(shù)

  24. 內(nèi)存堆和棧的區(qū)別

  25. Python入門之遞歸函數(shù)

  26. python 最大遞歸次數(shù) RuntimeError: maximum recursion depth exceeded

  27. Python 之路 Day5 - 常用模塊學(xué)習(xí)

  28. Python標(biāo)準(zhǔn)庫官方文檔

  29. 菜鳥教程:Python 日期和時(shí)間

  30. python datetime模塊基本操作

  31. Python的datetime模塊分析

  32. python 日歷(Calendar)模塊

  33. 菜鳥教程:Python OS 文件/目錄方法

  34. Python os._exit() sys.exit() exit()區(qū)別

  35. 百度百科:編程

  36. Python之路,Day6 - 面向?qū)ο髮W(xué)習(xí)

  37. Python新式類和舊式類的區(qū)別

  38. Python新式類與經(jīng)典類(舊式類)的區(qū)別

  39. Python 之 @property

  40. Python官方文檔對property的介紹

  41. python學(xué)習(xí)筆記-使用@property冷守、setter、deleter

  42. Python的hasattr() getattr() setattr() 函數(shù)使用方法詳解

  43. Python類的特殊成員方法

  44. Special method names

  45. 菜鳥教程:Python 異常處理

  46. 總結(jié):Python中的異常處理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末惊科,一起剝皮案震驚了整個(gè)濱河市拍摇,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌馆截,老刑警劉巖充活,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蜡娶,居然都是意外死亡混卵,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進(jìn)店門窖张,熙熙樓的掌柜王于貴愁眉苦臉地迎上來幕随,“玉大人,你說我怎么就攤上這事荤堪『狭辏” “怎么了?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵澄阳,是天一觀的道長拥知。 經(jīng)常有香客問我,道長碎赢,這世上最難降的妖魔是什么低剔? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上襟齿,老公的妹妹穿的比我還像新娘姻锁。我一直安慰自己,他們只是感情好猜欺,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布竿开。 她就那樣靜靜地躺著值桩,像睡著了一般弧烤。 火紅的嫁衣襯著肌膚如雪漓帚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天赋荆,我揣著相機(jī)與錄音笋妥,去河邊找鬼。 笑死窄潭,一個(gè)胖子當(dāng)著我的面吹牛春宣,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播嫉你,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼月帝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了均抽?” 一聲冷哼從身側(cè)響起嫁赏,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎油挥,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體款熬,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡深寥,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了贤牛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片惋鹅。...
    茶點(diǎn)故事閱讀 37,989評論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖殉簸,靈堂內(nèi)的尸體忽然破棺而出闰集,到底是詐尸還是另有隱情,我是刑警寧澤般卑,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布武鲁,位于F島的核電站,受9級特大地震影響蝠检,放射性物質(zhì)發(fā)生泄漏沐鼠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望饲梭。 院中可真熱鬧乘盖,春花似錦、人聲如沸憔涉。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽兜叨。三九已至穿扳,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間浪腐,已是汗流浹背纵揍。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留议街,地道東北人泽谨。 一個(gè)月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓,卻偏偏與公主長得像特漩,于是被迫代替她去往敵國和親吧雹。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,700評論 2 345