函式也是一種型別,我們自定義的函式就是函式物件,函式名儲存了函式物件的引用(位址)
def test():
print('我是測試函式')
print(test) #函式名是變數,指向了函式物件
pf = test #pf變數也指向了函式物件,所以也可以通過pf呼叫test函式
pf()
##裝逼利器
不再使用def 函式名()這種形式定義函式,而是使用lambda來建立匿名函式
特點:
lambda只是乙個表示式,函式體比def定義的函式簡單的多
lambda的函式體不再是**塊,而是乙個表示式
lambda只有一行,執行效率很高
lambda [arg1,arg2....argn]:表示式(只能是⼀個表示式)
add = lambda a,b:a + b
print(add(3,5))
我們可以在乙個函式中再定義乙個函式,在函式內部定義的函式稱之為內部函式,內部函式只能在函式內使用,不會汙染外部空間。定義內部函式的函式稱之為外部函式,這樣的定義構成函式的巢狀
def outter(a): #外部函式
x = 10
def inner(y): #內部函式
print(x + y)
inner(a)
outter(20)
內部函式只能在外部函式裡呼叫,外界無法直接呼叫內部函式
在乙個外部函式中定義了乙個內部函式,內部函式裡引用了外部函式的變數,並且外部函式的返回值是內函式的引用。這樣內部函式和其執行所需的環境變數就構成了乙個閉包。
一般情況下,如果乙個函式結束,函式的內部所有東西都會釋放掉,區域性變數都會消失。但是閉包是一種特殊情況,如果外函式在結束的時候發現有自己的區域性變數
將來會在內部函式中用到,就把這個區域性變數繫結給了內部函式,然後自己再結束。
def outter(a): #外部函式
x = a
def inner(y): #內部函式
return x + y #引⽤外部變數
return inner #返回內部函式(閉包)
pf = outter(20)
print(pf(10)) #30
print(pf(20)) #40
在閉包中無法直接修改外部變數x的值
def outter(a): #外部函式
x = a
def inner(y): #內部函式
# x += 10 #unboundlocalerror: local variable 'x' referenced
before assignment
return x + y
return inner
在python3中可以通過nonlocal關鍵字宣告一下x,表示這個變數不是區域性變數,需要向上一層變數空間找這個變數。
def outter(a): #外部函式
x = a
def inner(y): #內部函式
nonlocal x
x += 10
return x + y
return inner
當乙個函式有大量引數,調⽤的時候非常不可便,可以使用偏函式技術,將一些引數固定(給預設值),達到簡化函式呼叫的目的。
import functools
def test(a,b,c,d):
print(a, b, c, d)
#從前面固定引數,使用位置引數就行,1=>a,2=>b
test1 = functools.partial(test,1,2)
test1(3,4) #3=>c 4=>d
#從後面固定引數,需要使用關鍵字引數
test2 = functools.partial(test,c=3,d=4)
test2(1,2) #1=>a 2=>b
#如果固定的引數不連續,則需使用關鍵字引數固定
test3 = functools.partial(test,b=2,d=4)
test3(a=1,c=3) #需要使用關鍵字引數,否則會報錯
l:local,區域性作用域
e:enclosing,閉包作用域【閉包的外部函式中定義的變數】
g:global,全域性作用域 在所有函式外定義的變數
b:built-in,內建作用域【內建作用域】
1 區域性作用域
#區域性變數只能在函式內部使用,外部無法引用
#區域性變數的作用域從定義開始到函式體結束
def demo():
num = 20 #區域性變數
print(num)
demo()
#print(num) 錯誤
2.閉包作用域
def outter():
x = 10 #函式作用域,從定義開始到本函式結束
def inner():
y = x #在閉包中可以引用
print(y)
return inner
pf = outter()
pf() #執行閉包
print(pf.__closure__)
3.全域性作用域
x = 100 #全域性作用域 從定義開始到本檔案結束
def demo():
print(x)
print(x)
4.內建作用域
是指系統內建的函式或常量,在系統載入時載入,在所有模組中都可以直接引用
#比如說系統函式
print(max(1,2,3)) #max函式就是內建作用域 **都可以引用
def demo():
x = 30
y = 50
print(max(x, y))
變數起作用的範圍,那些**段可以應用指定變數
全域性變數: 在所有函式(方法、類)外面定義的變數
全域性變數的作用域: 從定義開始到本檔案結束
a = 10
print(a)
def demo():
print(a)
demo()
print(a)
區域性變數: 在函式(方法) 裡面定義的變數
區域性變數的作用域:從定義開始到本函式結束
def outter(x): # x區域性變數
print(x)
a = 10 # 區域性變數
print(a)
outter(20)
global
在python中,當內部作用域想修改全域性變數的時候,則就要使用global關鍵字進行
宣告
獲取所有的全域性變數
print(globals())
def test3(x=1):
c=2d=3
# locals()獲取當前函式中的區域性變數,返回乙個字典
print(locals()) #
test3()
num = 1
def fun1():
global num #告訴編譯器,此處的num是全域性變數
print(num) #1
num = 123
print(num) #123
fun1()
a = 10
def test():
global a
a = a + 1
print(a)
test()
nonlocal
如果要修改函式作用域中的變數,則使用nonlocal
#需要明確的是,nonlocal關鍵字定義在閉包裡面
x = 0 #全域性作用域
def outer():
x = 1 #閉包作用域
def inner():
nonlocal x
x = 2 #區域性作用域
print("inner:",x) #2
inner()
print("outer:",x) #1---->2
outer()
print("全域性:",x) #0
#nonlocal關鍵字:宣告了該變數不只是在outer函式中有效,在inner函式內部也有效
def outter():
a = 10 # 閉包作用域
def inner():
nonlocal a # 引用的不是區域性變數 是閉包作用域中變數
print(a)
a = 190 # 修改閉包變數
inner()
print(a)
outter()
print(a)
python入門基礎總結筆記(2) 函式
求絕對值的abs 函式 求最大最小值的max 和min 函式 將其他資料型別轉換為整數的int 函式 在python中,用def語句定義乙個函式,依次寫出函式名 括號 括號中的引數和冒號 編寫乙個求絕對值的例子 def my abs x if x 0 return x else return x其中...
Python基礎入門 2
nput 輸入 接受乙個標準輸入資料,返回為 string 型別。s 1.什麼是識別符號 就是一堆字串 2.規則 a.只能有數字,字母,下劃線組成 b.不能以數字開始 c.python的關鍵字不能做標誌符 關鍵字 false none true and as assert async await b...
Python基礎入門2
編寫python程式的兩個地方 互動式環境 ide integrated development environment 整合開發環境 python3 d a.txt 先啟動python直譯器 python直譯器會將a.txt的內容讀入記憶體 python直譯器會解釋執行剛剛讀入記憶體的 識別pyt...