Python知識梳理(二)
Day6:控制流
- 控制流就是控制程序的運行方向,符合條件的代碼執行,不符合的不執行;程序代碼是從上到下執行,從左到右執行,和人的行為習慣是類似;
- 控制流分為
順序控制流
、分支控制流
、嵌套控制流
、循環控制流
; 順序控制流
的基本語法為:if...else
,條件滿足執行if的條件代碼塊,否則執行else的代碼塊;分支控制流
就是在順序控制流if...else
的基礎上,在if和else的中間加上不定量的elif
,可以加入多個elif,執行順序是自上而下,滿足條件則執行;嵌套控制流
,顧名思義就是在控制流的語句裡面裡面嵌套一個或者多個控制流,比如:if順序裡面再嵌套新的if順序控制流,建議不要嵌套太深,一般不大於3層以上為佳,執行順序依舊是自上而下,滿足條件則執行;循環控制流
分為四種情況:
(1) while循環 就是在某條件下,循環執行某段程序,多用於處理需要重複處理的相同任務
while 判斷條件:
執行語句
(2) while...else循環 和while循環的不同在於,它會在循環正常執行完畢後執行 else 語句塊中的代碼
(3) for循環可以遍歷任何序列的項目,如一個列表或者一個字元串
(4) for...else循環和while...else循環一樣,會在循環正常執行完畢後執行 else 語句塊中的代碼
(5) while...else和for...else如果循環代碼中有break、return、或者錯誤產生的時候,不會執行其else語句哦。
循環控制流需要注意,循環需要有結束循環的條件,否則無限執行就會耗盡資源而導致代碼崩潰中止。
continue 語句
表示跳出本次循環,繼續進行下一輪循環break語句
表示跳出整個循環,即循環條件沒有False條件或者序列還沒被完全遞歸完,也會停止執行循環語句- 一般來說,0、"" 空字元串、() 空元組、[] 空列表、{} 空字典、None 等空值的都為False,而像 1、"Str" 字元串等有值的都為True
Day13:容器類型結構的封裝和解構
- 能夠裝載元素的數據結構就可以定義為
容器類型的數據結構
,也就是可以往裡面放數據的,如整數類的數據,就不能往裡面放數據了,那麼就不是容器類數據; - 容器類型的數據結構包括:
list列表,tuple元組,set集合,dict字典
; 封裝
表示通過逗號對多個元素進行組裝,組合在一起,本質上返回的是一個元組,只是省略了小括弧;解構
則是將元素從容器類型的數據結構分離出來,在解構時候,左右兩邊的元素個數必須一一對應;- 解構時可以使用可變位置參數接收多個元素, args收集剩餘的元素且組裝成一個列表;
- 也可以在解構的時候將不需要的元素使用_來接收;
- 封裝和解構可以快速的構建我們需要的數據,比如:a, _, _, _ = (首頁,產品,地圖,聯繫),我想獲取第一個元祖的元素,a這樣就很方便得到;
Day15:解析式與生成器
- 解析式主要是用來減少編程行數,並減少棧幀從而達到代碼優化的效果,也就是把原本要幾行的代碼實現的功能,通過使用解析式一行代碼就可以實現,解析式可以提升代碼質量,但針對Python新手可能不太適應,大家可以選擇性的先了解一下這些解析式,以後熟練了再使用也是可以的。
- 列表解析式
(1) 列表解析式是將數據全部存儲在內存中一併返回
(2) 列表解析是Python迭代機制的一種應用,它常用於實現創建新的列表,因此使用中括弧[]表示
(3) 使用列表解析式不會因為簡寫而影響效率,反而優化提升效率,減少代碼量,可讀性強,工作量降低,
減少出錯
- 集合解析式
集合解析式和列表解析式用法一樣,只是集合解析式使用大括弧{}表示
- 字典解析式
字典解析式使用大括弧{}表示,並且要有兩個表達式:一個生成key,一個生成value;
兩個表達式之間使用冒號分隔,返回結果是字典
- 生成器
1.在Python中,這種一邊循環一邊計算的機制,稱為生成器(Generator)
2.語法:g = (item for item in range(10)),和列表解析式很類似,只是最外層為(),不是[]
3.生成器的特點是按需計算,惰性求值,最大可能的節約內存空間。比如:1萬條列表數據,
我只需要讀取裡面的幾條,如果直接用for循環這些數據的話,就會把這些數據一次性裝進內存,
導致佔據大量資源,這個時候,使用生成器,那麼就可以做到我需要那幾條,就把那幾條裝進內存來求值
4.生成器是可迭代對象,取值完畢之後,無法再次取值,它有兩種取值方式,一種是通過next獲取值,
這種方式取值時如果取值的次數超過生成器對象值的長度,就會報錯,需要傳入None參數。
5.還有一種是通過for循環取值,通過這種方式取值時如果取值的次數超過生成器對象值的長度,for循環會通知
迭代,所以不會報錯,我們一般使用for來進行循環獲取。
Day16:函數
- 函數是組織好的,可重複使用的,用來實現單一,或相關聯功能的代碼段
- 定義函數的語法為:
def 函數名稱(參數)
,它的規則如下:
1.函數代碼塊以 def 關鍵詞開頭,後接函數標識符名稱和圓括弧()
2.任何傳入參數和自變數必須放在圓括弧中間,圓括弧之間可以用於定義參數
3.函數的第一行語句可以選擇性地使用文檔字元串(用於存放函數說明)
4.函數內容以冒號起始,並且縮進
5.return [表達式] 結束函數,選擇性地返回一個值給調用方,不帶表達式的return相當於返回 None
- 實現了
__inter__()
方法的對象就叫做可迭代對象,可迭代對象包括:list、tuple、string、bytes、bytearray、range、set、dict等,可迭代簡單理解為就是可以使用for來循環的對象; - 實現了
__next__()
方法的對象都是迭代器,迭代器的特點和生成器很像,特別適合迭代大量數據,惰性求值。生成器就是迭代器,但迭代器不一定是生成器 - 默認參數
當一個函數中的某個參數的改動不大,就可以考慮將這個參數設置為默認參數
默認參數在一個函數中可以有多個,且默認參數必須放在位置參數後面
- 位置參數:函數定義的參數位置來傳遞參數,如第1個參數為位置參數,調用的函數時候就第一位傳入,如:add(1,2,34)
- 關鍵字參數:在函數調用的時候,通過「鍵=值」形式指定參數,鍵就是定義函數的是參數名字,可以讓函數更加清晰易用,同時,參數的位置可以不需要按位置順序,如:add(x=1, y=2, z=3)。
位置參數可以和關鍵字參數一起使用,但是位置參數必須在關鍵字參數之前,如:add(1, z=2, y=3)
- 可變參數
1.可變參數就是表示傳入的參數個數是可變的,可以一個也可以多個參數,它包括可變位置參數和可變關鍵字參數
2.可變位置參數(一個*+參數名)就是把參數封裝成一個元組,然後在元組裡面迭代
3.可變關鍵字參數(兩個**+參數名)把參數構成一個key-value鍵值對組成的字典
- 可變位置參數和關鍵字參數的使用注意
前面有可變位置參數收集參數,後面的所有參數必須使用關鍵字參數傳值,如下Python:
應該這樣調用:add(1,2,3, k=6),不要這樣調用:add(1,2,3,6)
def add(*args, k):
print(*args, k)
- 參數的封裝與解構
參數封裝就是在調用函數的時候,把本應傳入多個參數的數據封裝成一個元祖或者字典,更加簡便
解構就是把封裝成的元組或者是字典的數據解成單個的值,符合函數參數的需求
*號是解構元組,**號是解構字典
示例一:如下函數add(),需要傳入x、y參數,按正常做法是add(1,2)這樣,但是我的數據是元祖也就是傳入add((1,2)),
但是這樣的話,就相當於只傳入了x這個參數,我們通過*(1,2)這樣就可以把這個元祖解構為1,2這樣的數據了:
def add(x, y):
print(x, y)
add(*(1,2))
示例二,字典的示例:
def add(x=1, y=2):
print(x, y)
add(**{x:100, y:200})
Day17:函數的返回值與嵌套函數
- 返回值指的是函數返回的結果
當return語句執行完畢,後面的語句將不會再執行
如果一個函數裡面有兩個return,前面return執行完畢,後面的return也不會執行,如:
def add(x, y):
print(x, y)
return x + y
return x - y
- 函數體內沒有return語句的,稱為隱式返回(默認返回None),有return語句,稱為顯示返回(直接返回結果)
- 函數可以返回多個值
將這些值通過逗號分開,會把值進行壓縮,封裝成一個元組,如:return x,y,z得到結果是元祖:(x,y,z)
而如果返回一個列表,得到的就是一個列表
- 嵌套函數,顧名思義就是函數內部還有函數
且內部函數只能在包含它的函數的直接父級調用,也就是只能在直接包含它的外部函數中調用
嵌套函數層數不宜過深,一般3層以內即可,太深不夠直觀,容易造成代碼混亂
- 作用域指的是,一個標識符(也就是函數或者變數)的作用範圍就是這個函數或者變數的作用域
在函數外部定義的變數,即全局作用域,在函數體外部和內部都能被訪問
在函數裡面定義的變數,即局部作用域,只能在函數體內部被訪問,函數外部不能訪問
- 閉包:內部函數引用了外部函數的變數,外部函數把內部函數作為返回結果,如:
def outer():
def inner(a):
print(a)
return inner
func = outer()
func(1)
func得到的是inner這個函數引用,需要調用
閉包的理解:
就是在函數a裡面再嵌套一個函數b等,那麼函數b裡面都可以引用函數a的變數,然後函數a返回值是函數b,
這樣就形成了閉包
如果要訪問函數體內部的函數,可以先把內部函數的函數名作為外部函數的返回值,把外部函數的引用賦值給
變數,再調用變數,這就是閉包
- global關鍵字:可以指定變數為全局變數,但是global關鍵字會污染全局變數,也就是會覆蓋之前全局變數的值,所以最好慎用
- nonlocal關鍵字:可以申明內部函數的變數引用的是外部函數變數的值(作用域在外部函數),不是全局作用域的值,因此不會污染全局作用域
- 函數默認值的作用域
同一個函數的生命周期相同,函數的默認值會綁定在函數的整個生命周期上,不會因為函數內部對默認值的操作
而發生改變
函數默認值,如果進行修改後,默認值會發生改變,這個時候可以使用淺拷貝copy模塊的copy()函數(簡寫[:])來清空默認值,
那每次調用函數,默認值都為初始值。如:
def add(lst = []):
lst = lst[:]
# lst = copy.copy(lst)
lst.append(hello)
print(lst)
add()
add()
也可以通過參數值判斷來給默認值重新賦值,那每次調用函數,默認值都為初始值
- 函數運行結束時,使用del 刪除函數對象,釋放計算機資源佔用,如:
def add():
print(add)
del add
Day18:遞歸函數與匿名函數
- 調用自己本身的函數叫遞歸函數
- 前兩項都是1,第三項開始,每一項都是前兩項之和的數列是斐波那契數列
- 遞歸函數的特性
1.遞歸一定需要有結束條件
2.每次進入更深一層遞歸時,問題規模比上一次遞歸都應有所減少
3.通常前一次遞歸的輸出就作為後一次遞歸的輸入
4.遞歸效率不高,遞歸層次過多會導致棧溢出
- 沒有名字的函數就是匿名函數
因為匿名函數沒有名字,所以不必擔心函數名衝突,匿名函數可以實現自調用
在Python中,通常藉助lambda表達式構建匿名函數,關鍵字lambda表示匿名函數,冒號前面的變數名表示函數參數,
如:
fn = lambda x: x+1
調用:fn(3)
Day19:生成器函數
- 生成器函數指的是函數體中包含yield關鍵字的函數,它也是一個函數,和普通函數區別就是yield關鍵字(可以結合Day15中的生成器理解),如:
def gen():
print(line 1)
yield line 1
print(line 2)
yield line 2
print(line 3)
yield line 3
g = gen()
print(g)
next(g)
next(g)
yield就相當於專門給生成器用的return,可以理解每次next()迭代讀取一個yield之前的代碼來執行
生成器可以通過生成器表達式和生成器函數獲取到
我們可以通過yield關鍵字來定義一個生成器函數,這個生成器函數返回值就是一個生成器對象
生成器函數也是用於惰性計算,相當於把函數分為多次執行。
- 生成器函數可以使用next()迭代,且每次next()只會返回一次yield的值,然後暫停,下次一次next()時會在當前位置繼續,如果沒有元素可以迭代了,還執行next()則需要給定一個默認值,不給默認值會報錯
- 如果在生成器函數中使用return,則會終止迭代,且不能得到返回值
- 在生成器中使用死循環,不會一直執行,仍舊是執行多少次next(),返回多少個值
- 生成器函數中的語法糖(可以先行理解,暫不要求熟練使用)
語法糖指那些沒有給計算機語言添加新功能,而只是對人類來說更加易於使用和理解的語法
語法糖給程序員提供了更實用的編碼方式,有益於更好的編碼風格,更易讀
生成器的語法糖也就是生成器的一種語法,作用是使代碼更加簡潔
Day20:高階函數
- 一個函數可以作為參數傳給另外一個函數,或者一個函數的返回值為另外一個函數(若返回值為該函數本身,則為遞歸),滿足其一則為高階函數,本節課程稍微有點抽象,要求掌握好標準庫中的:
sorted、filter、map
這幾個高階函數的使用。 - sorted函數:
sorted(iterable[, key][, reverse])
1.sorted是Python提供的功能強大的排序函數,滿足字元、數字等排序要求
2.函數的第一個參數為可迭代對象,第二個參數key作為排序的規則(指定按什麼排序),
第三個參數表明是否反向
3.sorted函數的返回結果是列表類型
- filter函數:
filter(function, iterable)
1.filter函數也是接收一個函數和一個序列的高階函數,其主要功能是過濾
2.第一個參數是一個函數,第二個參數是可迭代對象
3.filter函數的返回值是迭代器對象filter
- map函數:
map(func, *iterables)
1.map函數用來將序列中的值處理再依次返回至列表內
2.第一個參數func為函數,實現函數映射的功能,第二個參數為可迭代對象
3.map函數的返回值為一個迭代器對象map
來自:https://www.9xkd.com/user/plan.html
推薦閱讀: