帶括號就執行函數,返回函數返回值;不加括號指向函數地址,函數不執行閉包
函數能夠做爲字典的鍵值,能夠做爲鍵app
# 典例一 def func(): print(123) v1 = func # func函數不執行 func # func函數不執行 v1() # 執行func函數 # 典例二 def func(): print(123) v1 = func() # func函數返回值 func() # 執行func函數 print(v1) # None def func(): print(123) func_list = [func, func, func] # func_list爲三個func函數地址 func_list = [func(), func(), func()] # [None, None, None] # func_list[0]() # func_list[1]() # func_list[2]() for item in func_list: v = item() #123 循環3次 print(v) #None def func(): print(123) def bar(): print(666) info = {'k1': func, 'k2': bar} info['k1']() # 執行函數func 123 info['k2']() # 執行函數bar 666 def func(): return 123 func_list1 = [func,func,func] func_list2 = [func(),func(),func()] print(func_list1) #func()函數地址 * 3 print(func_list2) # 123 123 123 info = { 'k1':func, 'k2':func(), } print(info) # {'k1': <function func at 0x000001D5315DDA60>, 'k2': 123}
當參數時有(),獲得返回值;當參數時無(),獲得函數地址ide
def func(arg): print(arg) func(1) # 執行func 1 func([1,2,3,4]) # 執行func [1,2,3,4] def show(): return 999 func(show) # show不執行 指向函數地址 func(show()) # show執行 999 def func(arg): v1 = arg()#函數show執行 v1爲函數show返回值 print(v1) def show(): print(666)#輸出666 func(show)#指向函數show地址不執行 def func(arg): v1 = arg() print(v1) def show(): print(666) result = func(show)#result爲函數func的返回值 print(result)
無返回值函數
v = [11,22,33]
v.append(99) # 無返回值
僅有返回值:ui
v = "alex"
result = v.split('l')
v = {'k1':'v2'}
result1 = v.get('k1')
result2 = v.keys()
有返回+修改數據spa
v = [11,22,33]
result = v.pop()
經常使用須要記住3d
str 字符串的全部方法基本上都是返回值爲新值code
strip,返回字符串blog
split,返回列表遞歸
replace,返回字符串
join,返回字符串。
list 列表全部方法基本上都是返回值None
append,無
insert,無
pop,返回要刪除的數據
remove,無
find/index,返回索引的位置。
dict
get ,返回指定鍵值
keys,返回全部鍵
values,返回全部值
items,返回全部鍵值對
函數內部執行相互之間不會混亂
執行完畢 + 內部元素不被其餘人使用 => 銷燬
就找函數什麼時候被誰建立
def func(): print(123) #輸出123 def bar(): return fun #返回函數fun v = bar() #執行函數bar() v() # 執行函數func() name = 'oldboy' def func(): print(name) def bar(): return func v = bar() v() # oldboy def bar(): def inner(): print(123) return inner v= bar() v() # 123 name = 'oldboy' def bar(): name = 'alex' def inner(): print(name) return inner v = bar() v() # alex name = 'oldboy' def bar(name): def inner(): print(name) return inner v1 = bar('alex') v2 = bar('eric') v1() # alex v2() # eric # 示例一 name = 'alex' def base(): print(name) def func(): name = 'eric' base() func() # alex # 示例二 name = 'alex' def func(): name = 'eric' def base(): print(name) base() func() # eric # 示例三 name = 'alex' def func(): name = 'eric' def base(): print(name) return base base = func() base() # eric
閉包概念:爲函數建立一塊區域併爲其維護本身數據,之後執行時方便調用。
閉包應用場景:裝飾器、SQLAlchemy源碼
a函數裏面有b函數,而且返回值爲b函數(b函數只被調用,沒被執行;b函數引用a函數的變量)
def func(name):
def inner():
print(name)
return inner
v1 = func('alex') # 執行func()函數值爲alex,返回inner
v1() #執行inner()函數,輸出alex
v2 = func('eric')
v2()
把函數當作參數傳遞
把函數當作返回值
對函數進行復制
含義:函數本身調本身(效率低)
def func():
print(1)
func()
func()
# 示例
def func(i):
print(i)
func(i+1)
func(1) # 1,2,3---988報錯,死循環
斐契那波數列(有限制)
def func(a,b):
# 1
# 1
# 2
# 3
# 5
print(b)
func(b,a+b)
func(0,1)
遞歸函數返回值
# 示例一 def func(a): if a == 5: return 100000 result = func(a+1) + 10 return result v = func(1) print(v) # 10040 # 示例二 def func(a): if a == 5: return 100000 result = func(a+1) + 10 v = func(1) name = 'alex' def func(): def inner(): print(name) return inner v =func()
函數執行的流程分析(函數是由誰建立的)
def base():
return i
def func(arg):
def inner():
return arg
return inner
base_list = [] # [base,base,]
func_list = [] # [由第一次執行func函數的內存地址,內部arg=0 建立的inner函數,有arg=1的inner函數 ]
for i in range(10): # i = 0 ,1
base_list.append(base)
func_list.append(func(i))
# 1. base_list 和 func_list中分別保存的是什麼? """ base_list中存儲都是base函數。 func_list中存儲的是inner函數,特別要說的是每一個inner是在不一樣的地址建立。 """ # 2. 若是循環打印什麼? for item in base_list: v = item() # 執行base函數 print(v) # 都是9 for data in func_list: v = data() print(v) # 0 1 2 3 4