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如果循環代碼中有breakreturn或者錯誤產生的時候不會執行其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()需要傳入xy參數按正常做法是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


推薦閱讀:
相关文章