標籤:定義函數 efault 代碼 匿名 字串 input cti module 等於
ParisGabriel 感謝 大家的支援
每天堅持 一天一篇 點個訂閱吧 灰常感謝 當個死粉也闊以
Python人工智慧從入門到精通
globals()/locals()函數:
globals()返回當前全域範圍內變數的字典
locals() 返回當前局部範圍內變數的字典
函數變數:
函數名是變數,它在def 語句建立時綁定函數
fa1 = fa 沒有括弧 綁定函數 fa1 = fa() 返回結果
函數的變數名可以序列交換演算法
一個函數可以作為另一個函數的實參傳遞:
例如:
def myinput(fn): L = [5, 3, 1, 9, 7] return fn(L) print(myinput(max)) print(myinput(min)) print(myinput(sum)) print(myinput(len))
函數可以作為另一個函數的傳回值:
例如:
def get_op(): s = input("qing shu ru cao zuo") if s == "zui da": return max elif s == "zui xiao": return min elif s == "he": return sumL = [2, 3, 4, 6,5, 6, 9, 1]print(L)f = get_op()print(f(L))
函數的嵌套:
函數嵌套定義是指一個函數裡用def語句來建立其他的函數
樣本:
def fn_outter(): print("fn_outter被調用")def fn_inner(): print("fn_inner被調用") fn_inner() fn_inner() print("fn_outter調用結束")fn_outter()
Python的範圍:
範圍也叫名字空間,是訪問變數時尋找變數的範圍空間
python的4個範圍:
範圍: 英文解釋 縮寫
局部範圍(函數內) Local(function) L
外部嵌套函數範圍 Enclosing functio loc E
函數定義所在模組(檔案)範圍 Global(module) G
python內建模組範圍 Builtin(python) B
內含項目關聯性(內建>模組>外部嵌套函數>函數內)
變數名尋找規則:
訪問變數時,先尋找本地變數,然後是包裹此函數外的函數內部的變數
,之後是全域變數,最後是內建變數
L ---> E ---> G ---> B
在預設情況下,變數名賦值會建立或者改變當前範圍的變數
global語句:
告訴解釋執行器global語句聲明一個或多個變數,
這些變數的範圍為模組層級別的範圍,也稱為全域變數
全域聲明(global)
將指派陳述式操作的變數映射到模組檔案內部的範圍
文法:
global 變數1, 變數2, ....
說明:
1. 全域變數如果要在函數內部被賦值,則必須經過全域聲明(否則會被認為是建立局部變數)
2. 全域變數在函數內部不經過聲明就可以直接存取(變數已經存在並關聯一個對象)
3. 不能先聲明局部變數,再用global聲明為全域變數,此做法不附合規則
4. global變數列表裡的變數名不能出現在此範圍的形參列表裡
nonlocal語句:
告訴解釋執行器,nonlocal聲明變數不是局部變數,也不是全域變數
它是外部嵌套函數變數
文法:
nonlocal 變數名1,變數名2,...
說明:
1. nonlocal 語句只能在被嵌套的函數內部進行使用
2. 訪問nonlocal變數將對外部嵌套函數範圍內的變數進行操作
3. 當有兩層或兩層以上函數嵌套時,訪問nonlocal變數只對最近的一層變數進行操作
4. nonlocal語句的變數列表裡的變數名,不能出現在此函數的參數列表中
lambda運算式(又稱匿名函數)(希臘字母:入)
作用:
建立一個匿名函數對象
同def類似 但是不提供函數名
格式:
lambda[ 參數1, 參數...]: 運算式
說明:
1. lambda 只是一個運算式,它用來建立一個函數對象
2. 當lambda運算式調用時,先執行冒號(:)後的運算式,並返回運算式的結果的參考關聯性
3. lambda 運算式建立的函數只能包含一條運算式
4. lambda 比函數簡單且可以隨時建立和銷毀,有利於減少程式的偶合度
函數:
eval () / exec() 函數
eval(source, globals=None, local=None) 把一個字串 srouce 當成一個運算式來執行,返回運算式執行的結果
exec(source, globals=None, locals=None) 把一個字串source 當成程式來執行
練習:
寫一個函數叫hello(name),部分代碼如下:
count = 0
def hello(name):
print(‘你好‘, name)
... 此處代碼省略,需要同學們自己填寫
... 此處代碼需要改變全域變數來記錄此函數曾經被調用過多少次.
hello(‘小張‘)
hello(‘小李‘)
print(‘hello 函數被調用‘, count, ‘次‘) # 2次
count = 0def hello(name): global count count += 1 print("hello", name)hello("name")hello("xiaoli")hello("xiaoliu")hello("xiaowei")hello("xiaozhang")
1. 寫一個lambda 運算式,判斷這個數的2次方+1是否能被5整除,如果能被整除返回True, 否則返回False
例:
fa = lambda x: .....
print(fa(2)) # True
print(fa(4)) # False
fa = lambda x: (x ** 2 + 1) % 5 == 0print(fa(2)) # Trueprint(fa(4)) # False
2. 寫一個lambda運算式,求兩個變數的最大值
例如:
def mymax(x, y):
...
mymax = lambda ...
print(mymax(100, 200)) # 200
def mymax(x, y): if x > y: return x else: return yprint(mymax(100, 200)) # 200mymax = lambda x, y: x if x > y else y print(mymax(100, 200)) # 200
1. 給出一個整數n,寫一個函數myfac來計算n!(n的階乘)
n! = 1 * 2 * 3 * 4 * ..... * n
如:
print(myfac(5)) # 120
def myfac(n): x = 1 for i in range(1, n + 1): x = x * i return xprint(myfac(5))
2. 給出一個整數n,寫一個Function Computemyfn(n):
1 + 2**2 + 3**3 + .... + n**n的和
如:
print(myfn(10)) # ???
def myfu(n): s = 0 for x in range(2, n + 1): s += x ** x return sprint(myfu(10))
3. 完全數:
1 + 2 + 3 = 6 (6為完全數)
1,2,3都為6的因數(因數是能被一個數x整除的整數為y,則y為x的因數)
1 x 6 = 6
2 x 3 = 6
完全數是指除自身以外的所有因數相加之和等於自身的數
求 4~5個完全數並列印出來
答案:
6
28
496
......
def mywqs(x): s = 0 L = [] for i in range(1, x): if x % i == 0: L.append(i) for i in L: s += i if s == x: return True else: return Falsei = 0wqs = 0while wqs < 5: i += 1 if mywqs(i) == True: print(i) wqs += 1
咳咳 又到了吹NB環節
locals()、globals()
就是一個查詢函數 以字典形式返回資訊而已
函數變數?
你就就把它看做一個全域變數 變數綁定資料 而它綁定語句塊 就這麼簡單
什麼是範圍?
範圍就是變數的所屬範圍 超過範圍就失效
在別的地方一般是3個範圍 而python有4個
內建變數 局部變數 模組全域變數
特殊那個就是兩個函數嵌套之間的範圍(外部嵌套)
分別都是內含項目關聯性(內建>模組>外部嵌套函數>函數內)
內建函數 不可刪除或修改 其他範圍 不能與內建函數重名
否則內建函數失效 只作用於當前空間自訂函數
各範圍各不相干 同空間不可重名
global 不管在任何空間使用global都直接聲明全域變數
nonlocal 只能在被嵌套函數內部使用 多層嵌套 只會跳一層
lambda 用運算式建立一個函數 和if一樣
ParisGabriel:Python全棧工程師(0基礎到精通)教程 第十五課(函數嵌套、變數範圍)