Day08_Python偏函數、回調函數、遞歸函數
08.01_Python語言基礎(偏函數)(熟練)
08.02_Python語言基礎(回調函數)(掌握)
08.03_Python語言基礎變量(Python變量)(重點重點重點掌握)
08.04_Python語言基礎(遞歸函數)(重點)
08.05_Python語言基礎(棧模拟遞歸周遊目錄)(熟練)
08.06_Python語言基礎(隊列模拟周遊目錄)(熟練)
08.01_Python語言基礎(偏函數)(熟練)
定義:
* 函數在執行時,要帶上所有必須的參數進行調用,但是有時參數可以在函數被調用之前提前獲知
* 好處: 一個函數或者多個函數的參數預先就能用上,一邊函數能用更少的參數進行調用
from functools import partial
def add(a, b):
return a + b
add(3, 5) # 8
add(4, 7) # 11
puls = partial(add, 100)
result = puls(10)
print(result)
運作輸出結果:
110
# 進制轉換
import functools
# 案例:
print(int("1010", base=2), "--> base表示進制")
# 偏函數
def int2(str, base=2): # int(x,base)x-->字元串或者數字 base---》進制數 預設是十進制
return int(str, base)
print(int2("1011"))
int3 = functools.partial(int, base=2)
print(int3("111"))
總結:
在這裡偏函數表達式的意思就是:
* 在函數add的調用時,我們已經知道裡面其中一個參數,我們通過這個參數,
* 重新綁定一個函數partial(add,100),然後再去調用
08.02_Python語言基礎(回調函數)(掌握)
回調函數的定義
- 回調函數:
- 就是通過函數指針調用函數,如果你把函數的指針(位址)作為參數傳遞給另外一個函數,當這個指針被用來調用其所指向的函數時,------回調函數,
- 回調函數不是由該函數的實作方直接調用,而是在特定的事件或者條件發生時由另外一方調用,用于對該時間或者條件進行響應
回調函數使用案例
第一個案例(回調函數無傳回值):
def clear1(times):
"""
模拟飯店掃地
:param times:
:return: None
"""
print("完成掃地的次數", str(times))
def clear2(times):
"""
模拟飯店灑水
:param times:
:return: None
"""
print("灑水的次數", str(times))
def call_clear(times, function_name):
"""
相當于控制器,控制方法的調用,實作回調函數的核心
:param times: 調用函數次數
:param function_name: 回調函數名稱
:return: 調用函數的結果
"""
return function_name(times)
call_clear(10, clear1)
第二個案例(回調函數有傳回值):
"""
回調函數
1.編寫生成一個2 * K形式偶數的函數
2.編寫一個數字字元串轉換為數字(base=2)形式的函數
"""
def double_2k(x):
return x * 2
def str2int02(x):
return int(x, base=2)
def get_result(func, num):
return func(num)
print(get_result(str2int02, "1001"))
print(get_result(double_2k, 23))
08.03_Python語言基礎變量(Python變量)(重點重點重點掌握)
變量的分類
* 局部變量
* 成員變量(全局變量)
局部變量
#局部變量
def test1():
a = 10
b = 10
def test2():
a = 10
b = 20
# 以上函數中的變量----》局部變量
總結:
局部變量:
就是在函數内部定義的變量
不同的函數,可以定義相同名字的局部變量,各個變量之間不會發生幹涉不會影響
局部變量的作用:為了臨時儲存資料需要在函數中定義變量來進行儲存
全局變量
#全局變量
定義:
如果一個變量,既能在一個函數中使用,
也能在另外一個函數中使用---》全局變量
"""
#定義一個全局變量
a = 100
def test3():
print(a)
def test4():
print(a)
test3()
test4()
全局變量和局部變量名字相同的問題
"""
全局變量和局部變量名字相同的問題
"""
s = 100
def test5():
s = 200
print(s)
s = 300
print(s)
def test6():
print(s)
test5()
修改全局變量
* global 關鍵字 修改全局變量
* 格式:global 需要修改變量名
# 沒有加global修飾的全局變量
num = 11
def num01():
num = 12
return num
print(num01())
print(num)
print("*" * 30)
# 在外部加global修飾的全局變量
global num001
num001 = 110
def num011():
global num001
num001 = 100
return num001
print(num011())
print(num001)
print("*" * 30)
# 在函數内部加global修飾的全局變量
num002 = 110
def num012():
global num002
num002 = 100
return num002
print(num012())
print(num002)
print("*" * 30)
再來一個案例
print("*" * 30)
wendu = 0
def get_wendu():
# 想一下wendu=33不加注釋的運作結果
# wendu = 33
global wendu
wendu = 34
def print_wendu():
print(wendu)
get_wendu()
print_wendu()
局部變量和全局變量的差別
1.在函數外面定義的變量稱為:全局變量
2.全局變量能夠在所有的函數中被通路
3.如果在函數中修改全局變量,那麼需要使用global關鍵字進行聲明,否則出錯
4.如果出現同名的現象,先到局部找---》全局-----》報錯,這個被稱為:就近原則
他們的本質的差別:
在于作用域
局部變量和全局變量差別案例
#案例:
def get_wendu():
wendu = 33
return wendu
def print_wendu(wendu):
print(wendu)
result = get_wendu()
print_wendu(result)
wendu = 0
def get_wendu1():
wendu = 34
# global wendu
wendu = 33
def print_wendu1():
print(wendu)
可變類型的全局變量
- 可變類型值: 清單 字典 集合
- 不可變類型: 引用 元祖 數字 字元串
當不可變的資料類型作為全局變量: 需要用global聲明,進行修改
當可變的資料類型作為全局變量: 不一定需要global聲明
可變類型的全局變量案例:
#案例:
test = []
def d():
test.append(2)
print(test)
d()
test1 = []
def e():
test1 = [1,2]
# global test1
test1 = [3,4]
# print(test1)
e()
print(test1)
test2 = [1,2]
def f(a):
a += a
print(a)
f(test2)
print(test2)
再來一個案例
# 沒有加global修飾的全局變量--可變類型
list01 = [1, 2, 3, 4]
def list001():
list01.append(5)
return list01
print(list001())
print(list01)
print("*" * 30)
# 加global修飾的全局變量--可變類型
global list02
list02 = [6, 1, 2, 3, 4]
def list002():
global list02
list02.append(5)
return list02
print(list002())
print(list02)
不可變類型的全局變量案例:
#不可變
a = 1
def g():
a = 2
a += 1
print(a)
# global a
a = 4
g()
print(a)
08.04_Python語言基礎(遞歸函數)(重點)
遞歸函數的定義
定義:
在函數中不調用其他函數,而是調用自己------》遞歸函數(自己玩自己)
凡是循環能做的事,遞歸都能做
遞歸函數的作用
def show():
print("我叫王二小")
show()
show()
"""
例如:
計算一個階乘n!
n! = 1*2*3*4...*n
1! = 1
2! = 2*1 2*1!
3! = 3*2*1 3*2!
4! = 4*3*2*1 4*3!
n! = n*(n-1)!
參數
要 1個
傳回值
要 結果
#方法1
def calnum(num):
# for temp in range(1,num+1):
i = 1
result = 1
while i <= num:
# result = result * i
result *= i
i += 1
return result
ret = calnum(3)
print(ret)
#方法2:
def calnum(num):
if num >=1:
result = num*calnum(num-1)
else:
result = 1
return result
ret = calnum(3)
print(ret)
注意:防止死循環(遞歸)
遞歸周遊目錄
import os
def getAllDirRE(path,sp = ""):
#得到目前目錄下的所有的檔案
filesList = os.listdir(path)
#處理每一個檔案
sp += " "
for fileName in filesList:
#判斷是否是路徑(用絕對路徑)
fileAbsPath = os.path.join(path,fileName)
if os.path.isdir(fileAbsPath):
print(sp+"目錄:",fileName)
#遞歸函數
getAllDirRE(fileAbsPath,sp)
else:
print(sp + "普通檔案",fileName)
getAllDirRE(r"G:\1806")
08.05_Python語言基礎(棧模拟遞歸周遊目錄)(熟練)
- 模拟棧存儲方式擷取指定路徑下所有檔案
棧定義:
又名堆棧,
import os
"""
棧:
先進後出
裝子彈
"""
#模拟棧結構
#入棧
stack = []
stack.append("A")
print(stack)
stack.append("B")
print(stack)
stack.append("C")
print(stack)
#出棧
res1 = stack.pop()
print("res1=",res1)
print(stack)
res2 = stack.pop()
print("res1=",res2)
print(stack)
def getAllDirRE(path):
stack = []
stack.append(path)
#處理棧,當棧為空的時候結束目前動作
while len(stack) != 0:
#從棧中取資料
dirPath = stack.pop()
filesList = os.listdir(dirPath)
#得到的資料,如果是普通的檔案,直接列印,如果,是目錄繼續壓棧
for fileName in filesList:
fileAbsPath = os.path.join(dirPath,fileName)
if os.path.isdir(fileAbsPath):
print("目錄"+fileName)
#壓棧
stack.append(fileAbsPath)
else:
print("普通"+fileName)
getAllDirRE(r"G:\1806")
08.06_Python語言基礎(隊列模拟周遊目錄)(熟練)
- 模拟隊列擷取指定路徑下所有檔案
"""
先進先出 排隊
collections
append:添加
queue:擷取隊列
len:擷取長度
popleft:出隊
listdir:擷取目前目錄的所有檔案
isdir :判斷是否是檔案
"""
import os
import collections
def getAllDirQu(path):
#建立一個隊列
queue = collections.deque()
#進隊
queue.append(path)
while len(queue) != 0:
#出隊
dirPath = queue.popleft()
#擷取目前路徑下的所有的檔案
filesList = os.listdir(dirPath)
for fileName in filesList:
#絕對路徑
fileAbsPath = os.path.join(dirPath,fileName)
#判斷是否是目錄(檔案夾),如果是進隊,不是直接列印
if os.path.isdir(fileAbsPath):
print("目錄:"+fileName)
queue.append(fileAbsPath)
else:
print("普通檔案"+fileName)
getAllDirQu(r"G:\1806")