溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

python函數、參數解構以及函數作用域的示例分析

發(fā)布時間:2021-10-18 15:54:08 來源:億速云 閱讀:99 作者:小新 欄目:編程語言

這篇文章將為大家詳細講解有關python函數、參數解構以及函數作用域的示例分析,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。

函數定義:

def 函數名(參數列表)
    函數體
    [return 返還值]
callable()  #判斷是否為調用對象(括號內為函數名,后面不能有括號)

例:
def add(x,y):
return x + y

add(10,2)         #位置傳參
add(x=10,y=2)     #關鍵字傳參,按照形參的名字一一對應

**要求位置傳參必須在關鍵字穿參之前。
形參:

def add(x=3,y=4):
return x + y
add()
默認不輸入,缺省值為x=3,y=4,輸入后已輸入的為準
 
 
def sum1(iterable):  #iterable 用作可迭代對象
result = 0
for x in iterable:
result += x
return result
 
 
def sum1(iterable):  #代表可變形參,將多個參數封裝到元組,不可變。和上面區(qū)別:(參數為[1,3]就錯了)
result = 0
for x in iterable:
result += x
return result

可變未知參數:形參前用*   必須用位置傳參。
如上;

可變關鍵字參數:形參前使用  如kwargs 必須用關鍵字參數
如下:
def showconfig(**kwargs):    #k-v對傳參
print(type(kwargs))
print(kwargs)

showconfig(host='192.168.1.1','username'='tom')

形參定義順序:普通參數、位置參數、關鍵字參數
username,*args,**kwargs  
   
 

keyword-only:  # 在一個args之后出現的普通參數,成為keyword-only
 
def fn(
args,x)   # x只能關鍵字傳參
 
def fn3(x,y,*,z)   #  ''純粹為了改變'z'變成keyword-only
 
將必須使用名稱的才能使用的參數,定義為keyword-only
 
 

參數解構
add(*[4,5]) 相當于add(4,5)
add(**{'a':2,'b':4})   相當于add(a=2,b=4)
add(*{'a':2,'b':4}) 相當于add(a,b)
add(*{'a':2,'b':4}.values())

return語句執(zhí)行之后,不會再進行執(zhí)行函數內其他語句
 
 
 

函數作用域:

 
在函數內定義的變量只能在此函數中
 
def fn()
print('~~~')
x = 100             #x可見范圍只在函數內部

fn()
print(x)                #不能輸出x
   
每一個函數都會開辟一個作用域
 
作用域分類:
 
全局作用域
在整個程序運行環(huán)境中都可見
global
局部作用域  
在函數、類等內部可見
局部作用域中的變量成為局部變量,適用范圍不能超過其所在作用域
local作用域
   
創(chuàng)建的.py的文件中,非函數的變量是全局變量
 
 
x = 1000
 
def fn2():
print(2,x)
print(1,x)
fn2()
打?。?br/>1 1000
2 1000
 

函數嵌套:

對外不可見,對內可見  
 

例1:
x = 100
def fn():
x+= 200  #賦值即定義,x變成局部,但沒被賦值,所以這么寫會報錯

fn()

 
例2:
x = 100
def fn()
print(x)    #會報錯,只定義了x為局部變量,此時沒有賦值
x = 200    #先定義為局部,等執(zhí)行進行賦值

print(x)
fn()    
 

global  #聲明全局變量,要用加在行數前

例3:
x = 100
def fn()
global x    #聲明x為全局變量
print(x)    
x += 200

print(x)
fn()
print(x)    
打?。?
100
100
300
   
   
 

*****閉包  #嵌套函數中

自由變量:#未在本地作用域中定義的變量,
例如定義在內層函數外的外層函數的作用域中的變量  
閉包:指的是內層函數引用到了外層函數的自由變量,就形成了閉包

 
內層函數如沒有用到外層函數的變量,則外層的變量會消亡,用到則不會消亡
   
 

def counter():
c = 0
def inc()
nonlocal c #聲明c不是當前函數本地變量,而在上一級定義,也不是全局變量
c += 1
return
 

nonlocal :不適用于最外層函數
 
 

默認值的作用域

缺省值

def foo (x=1) # 默認x = 1
x += 1
print(x)

foo()
foo()
打?。?br/>1
1  
 
 

def bar (x=[]) # x=[]是引用類型
x += 1
print(x)    
 
foo()
foo()
打?。?br/>[1]
[1][1]  
 
bar.defaults
([1,1],)
 

.defaults  #查看參數缺省值屬性

 
如果有keyword-only:

.kwdefults  

例:
def foo (xyz,m=123,*,n='abc',t = [1,2]:

print(foo.defaults,foo.kwdefults)
(123,){'n':'abc','t':[1,2]}

a += [5]  #相當于a.extend([5]),就地修改,不會更改地址值
a = a + [5]  #相當于創(chuàng)建了新列表

****變量名解析原則LEGB

Local
Enclosing
Global
Build-in 內置模塊的命名空間 #print(open) print open

所以一個名詞的查找順序就是LEGB

函數的消亡
本質使其引用計數清零

關于“python函數、參數解構以及函數作用域的示例分析”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI