Python入門基礎 函式(2)

2021-10-08 20:43:53 字數 4734 閱讀 7050

函式也是一種型別,我們自定義的函式就是函式物件,函式名儲存了函式物件的引用(位址)

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...