def get_data(a):#a爲形式參數(或形參)
v = [1,5,6,,8,5]
print(v[a])
get_data(1)# 1在調用函數是傳遞叫:實際參數(實參)
# 嚴格按照順序傳參數:位置方式傳參。
# 實際參數能夠是任意類型。
任意個數python
任意類型app
def func(a1,a2,a3):
print(a1,a2,a3)
func(1,"asdf",True) # 1 asdf True
def func(a1,a2):
print(a1,a2)
func(11,22) # 11 22
# 典例一
def func(a1,a2):
print(a1,a2)
func(a2=11,a1=22) # 22 11
# 典例二
def func(a1,a2):
print(a1,a2)
func(11,a2=22) # 11 22
位置傳參>關鍵字傳參(順序)ide
位置傳參 + 關鍵字傳參 = 總傳參個數函數
前面是關鍵字傳參,後面也必須關鍵字傳參ui
# 若是要想給value設置默認是空列表
# 不推薦(坑)
def func(data,value=[]):
pass
# 推薦
def func(data,value=None):
if not value:
value = []
# 練習
def func(data,value=[]):
value.append(data)
return value
v1 = func(1) # [1,]
v2 = func(1,[11,22,33]) # [11,22,33,1]
def func(a,b=[]) 有什麼陷阱?spa
# 典例一 def func(a,b=[]): b.append(a) return b l1 = func(1) print(l1) # [1] l2 = func(2,[11,22]) print(l2) # [11,22,2] l3 = func(3) print(l3) # [1,2] # 示例二 def func(a,b=[]): b.append(a) print(b) func(1) # [1] func(2,[11,22,33]) # [11,22,33,2] func(3) # [1,3] def func(a1,a2,a3=9,a4=10): print(a1,a2,a3,a4) func(11,22) # 11,22,9,10 func(11,22,10) # 11,22,10,10 func(11,22,10,100) # 11,22,10,100 func(11,22,10,a4=100) # 11,22,10,100 func(11,22,a3=10,a4=100) # 11,22,10,100 func(11,a2=22,a3=10,a4=100) # 11,22,10,100 func(a1=11,a2=22,a3=10,a4=100) # 11,22,10,100
*args3d
能夠接受任意個數的位置參數,並將參數轉換成元組.code
調用函數無 *blog
def func(*args):
print(args)
func((1,2,3,4)) # ((1,2,3,4),)
func([1,2,3,4]) # ([1, 2, 3, 4],)
調用函數有 *作用域
def func(*args):
print(args)
func(*(1,2,3,4)) # (1, 2, 3, 4)
func(*[1,2,3,4]) # (1, 2, 3, 4)
只能用位置傳參
def func(*args):
print(args)
func(1) # ()
func(1,2) # (1,2)
func((11,22,33,44,55)) # ((11,22,33,44,55),)
func(*(11,22,33,44,55)) # (11,22,33,44,55)
**kwargs
能夠接受任意個數的關鍵字參數,並將參數轉換成字典。
調用函數無 **
def func(**kwargs):
print(kwargs)
func(k1=1,k2="alex") # {'k1':1,'k2':'alex'}
調用函數有**
def func(**kwargs):
print(kwargs)
func(**{'k1':'v2','k2':'v2'}) # {'k1':'v2','k2':'v2'}
只能用關鍵字傳參
綜合應用:無敵 + 無敵 => 真無敵
def func(*args,**kwargs):
print(args,kwargs)
func(1,2,3,4,5,k1=2,k5=9,k19=999)#(1, 2, 3, 4, 5) {'k1': 2, 'k5': 9, 'k19': 999}
func([1,2,3],k1=2,k5=9,k19=999)# ([1, 2, 3],) {'k1': 2, 'k5': 9, 'k19': 999}
func([1,2,3],**{'k1':1,'k2':3})# (1, 2, 3) {'k1': 1, 'k2': 3}
func(111,222,*[1,2,3],k11='alex',**{'k1':1,'k2':3})#(111, 222, 1, 2, 3) {'k11': 'alex', 'k1': 1, 'k2': 3}
定義函數
def func1(a1,a2):
pass
def func2(a1,a2=None):
pass
def func3(*args,**kwargs):
pass
調用函數
位置參數 > 關鍵字參數
py文件:全局做用域
函數:局部做用域
a = 1
def s1():
x1 = 666
print(x1) #666
print(a) #1
print(b) #2
b = 2
print(a) #1
s1()
a = 88888
def s2():
print(a,b) #88888,2
s1() #666,88888,2
s2()
def func():
x = 9
print(x) #9
func()
print(x) #9
優先在本身的做用域找數據,本身沒有就去 "父級" -> "父級" -> 直到全局,所有麼有就報錯。注意:父級做用域中的值究竟是什麼?
# 示例一 x = 10 def func(): x = 9 print(x) #9 func() # 練習題 x = 10 def func(): x = 9 print(x) #9 def x1(): x = 999 print(x) # 999 func() x = 10 def func(): x = 9 print(x) # 9 def x1(): x = 999 print(x) # 999 print(x) # 9 x1() func()
global :對全局的變量進行賦值
nonloca : 找到上一級的局部變量進行賦值
# 示例一 name = 'oldboy' def func(): name = 'alex' # 在本身做用域再建立一個這樣的值。 print(name)# alex func() print(name)# oldboy # 示例二 name = [1,2,43] def func(): name.append(999) print(name) # [1, 2, 43, 999] func() print(name) #[1, 2, 43, 999] # 示例三 name = ["老男孩",'alex'] def func(): global name name = '我' print(name) # 我 func() print(name) # 我 # 示例四 name = "老男孩" def func(): name = 'alex' def inner(): global name name = 999 inner() print(name) # alex func() print(name) # 999 # 示例五 name = "老男孩" def func(): name = 'alex' def inner(): nonlocal name # name = 999 inner() print(name) # 999 func() print(name) # 老男孩
參數
調用(執行)函數時,傳參:位置參數 > 關鍵字參數
定義函數:
def func(a)
def func(a,b=None) # 對於默認值,若是是可變類型,----> 坑。
def func(*args,**kwargs)
做用域
函數爲做用域
本身 > 父級 > 父級 > 全局 【讀/修改(可變)】
從新賦值:
global
nonlocal
所有變量之後必須所有是大寫
USER_LIST = [11,22,3]
def func():
name = 'asdf'
USER_LIST.append(12)
USER_LIST.append(name)
func()
print(USER_LIST)