一、函數的作用域 1、作用域在定義函數時就已經固定住了,不會隨著調用位置的改變而改變 二、匿名函數 三、函數式編程 函數的參數傳入,是函數吃進去的食物,而函數return的返回值,是函數拉出來的結果,面向過程的思路就是,把程式的執行當做一串首尾相連的函數,一個函數吃,拉出的東西給另外一個函數吃,另外 ...
一、函數的作用域
1、作用域在定義函數時就已經固定住了,不會隨著調用位置的改變而改變
例一: name='alex' def foo(): name='lhf' def bar(): print(name) return bar func=foo() func() 例二: name='alex' def foo(): name='lhf' def bar(): name='wupeiqi' def tt(): print(name) return tt return bar func=foo() func()()
foo()()()
二、匿名函數
#匿名函數 #格式:lambda關鍵字 形參:表達式 fun=lambda x:x+1 print(fun(3))
name='張鵬' fun=lambda x:x+'帥鍋' red=fun(name) print(red)
name='name' funn=lambda x,y:(x.startswith('n'),y+'1') print(funn('knnnn','dddddd'))
三、函數式編程
函數的參數傳入,是函數吃進去的食物,而函數return的返回值,是函數拉出來的結果,
面向過程的思路就是,把程式的執行當做一串首尾相連的函數,一個函數吃,拉出的東西給另外一個函數吃,另外一個函數吃了再繼續拉給下一個函數吃。。。
1、不可變,不用變了保存狀態,不修改變數
2、第一類對象:函數即‘變數’
函數名可以當參數傳遞
返回值可以是函數名
例如:
用戶登錄流程:前端接收處理用戶請求-》將用戶信息傳給邏輯層,邏輯詞處理用戶信息-》將用戶信息寫入資料庫
驗證用戶登錄流程:資料庫查詢/處理用戶信息-》交給邏輯層,邏輯層處理用戶信息-》用戶信息交給前端,前端顯示用戶信息
函數式編程:
(以下部分內容摘自網路)
11 高階函數
滿足倆個特性任意一個即為高階函數
1.函數的傳入參數是一個函數名(把函數當做參數,傳給另外一個函數;)
1 def foo (n): 2 print(n ) 3 def bar(name): 4 print('my name is %s'%name) 5 foo(bar('張三'))
2.函數的返回值是一個函數名(返回值中包含函數)
尾調用
map()函數
array=[1,3,4,71,2]
ret=[]
for i in array:
ret.append(i**2)
print(ret)
#如果我們有一萬個列表,那麼你只能把上面的邏輯定義成函數
def map_test(array):
ret=[]
for i in array:
ret.append(i**2)
return ret
print(map_test(array))
#如果我們的需求變了,不是把列表中每個元素都平方,還有加1,減一,那麼可以這樣
def add_num(x):
return x+1
def map_test(func,array):
ret=[]
for i in array:
ret.append(func(i))
return ret
print(map_test(add_num,array))
#可以使用匿名函數
print(map_test(lambda x:x-1,array))
#上面就是map函數的功能,map得到的結果是可迭代對象
print(map(lambda x:x-1,range(5)))
map函數
array=[1,3,4,71,2] ret=[] for i in array: ret.append(i**2) print(ret) #如果我們有一萬個列表,那麼你只能把上面的邏輯定義成函數 def map_test(array): ret=[] for i in array: ret.append(i**2) return ret print(map_test(array)) #如果我們的需求變了,不是把列表中每個元素都平方,還有加1,減一,那麼可以這樣 def add_num(x): return x+1 def map_test(func,array): ret=[] for i in array: ret.append(func(i)) return ret print(map_test(add_num,array)) #可以使用匿名函數 print(map_test(lambda x:x-1,array)) #上面就是map函數的功能,map得到的結果是可迭代對象 print(map(lambda x:x-1,range(5)))
filter()函數
move_people=['zp','sb','sb_ls','alex'] ret=[] for p in move_people: if not p.startswith('sb'): ret.append(p) print(ret) move_people1=['sgzp','sb','sb_lssb','sbalexsb','sbooppp','sssddhfhfhhdhsb'] """ 開始位置查詢或排除 """ def sb_(p): return p.endswith('sb') ''' 結尾處查找或排除 ''' def _sb(p): return p.startswith('sb') ''' 總的調用 ''' def save(area,func): ret = [] for p in area: if not func(p): ret.append(p) return ret n=save(move_people1,sb_) print('好人1:',n) n=save(move_people1,_sb) print('好人2:',n) '''終極版 ''' n=save(move_people1,lambda x: p.startswith('sss')) print('好人3:',n) print('好人4',list(filter(lambda p:not p.endswith('hsb'),move_people1)))#move_people1是一個可迭代對象
reduce()函數
1 from functools import reduce 2 #合併,得一個合併的結果 3 array_test=[1,2,3,4,5,6,7] 4 array=range(100) 5 6 #報錯啊,res沒有指定初始值 7 def reduce_test(func,array): 8 l=list(array) 9 for i in l: 10 res=func(res,i) 11 return res 12 13 # print(reduce_test(lambda x,y:x+y,array)) 14 15 #可以從列表左邊彈出第一個值 16 def reduce_test(func,array): 17 l=list(array) 18 res=l.pop(0) 19 for i in l: 20 res=func(res,i) 21 return res 22 23 print(reduce_test(lambda x,y:x+y,array)) 24 25 #我們應該支持用戶自己傳入初始值 26 def reduce_test(func,array,init=None): 27 l=list(array) 28 if init is None: 29 res=l.pop(0) 30 else: 31 res=init 32 for i in l: 33 res=func(res,i) 34 return res 35 36 print(reduce_test(lambda x,y:x+y,array)) 37 print(reduce_test(lambda x,y:x+y,array,50)) 38 39 reduce函數
總結
map()
處理序列中的每個元素,得到的結果是一個’列表‘,該‘列表’元素個數及位置與原來一樣
filter()
遍歷序列中的每個元素,得到的每個元素得到的布爾值,如果是true則保留下來
reduce()
處理一個序列,然後將序列合併操作
1 #當然了,map,filter,reduce,可以處理所有數據類型 2 3 name_dic=[ 4 {'name':'alex','age':1000}, 5 {'name':'wupeiqi','age':10000}, 6 {'name':'yuanhao','age':9000}, 7 {'name':'linhaifeng','age':18}, 8 ] 9 #利用filter過濾掉千年王八,萬年龜,還有一個九千歲 10 def func(x): 11 age_list=[1000,10000,9000] 12 return x['age'] not in age_list 13 14 15 res=filter(func,name_dic) 16 for i in res: 17 print(i) 18 19 res=filter(lambda x:x['age'] == 18,name_dic) 20 for i in res: 21 print(i) 22 23 24 #reduce用來計算1到100的和 25 from functools import reduce 26 print(reduce(lambda x,y:x+y,range(100),100)) 27 print(reduce(lambda x,y:x+y,range(1,101))) 28 29 #用map來處理字元串列表啊,把列表中所有人都變成sb,比方alex_sb 30 name=['alex','wupeiqi','yuanhao'] 31 32 res=map(lambda x:x+'_sb',name) 33 for i in res: 34 print(i)總結