Python基礎函數之函數式編程

一. 匿名函數

  匿名函數就是不須要顯示的指定函數,只要運行過一次後就立馬釋放內存空間。編程

  主要表現形式爲:app

     lambda 形參:具體功能編程語言

def calc(n):
    return n**n
print(calc(10))
 
#換成匿名函數
calc = lambda n:n**n
print(calc(10))

  你也許會說,用上這個東西沒感受有毛方便呀, 。。。。呵呵,若是是這麼用,確實沒毛線改進,不過匿名函數主要是和其它函數搭配使用的呢,以下ide

res = map(lambda x:x**2,[1,5,7,4,8])
for i in res:
    print(i)

輸出
1
25
49
16
64

 

l=[3,2,100,999,213,1111,31121,333]
print(max(l))

dic={'k1':10,'k2':100,'k3':30}

print(max(dic))
print(dic[max(dic,key=lambda k:dic[k])])

 

二. 函數式編程

  1.高階函數函數式編程

    知足以下兩個特色的任意一個即爲高階函數:函數

    (1) 函數的傳入參數是一個函數名spa

    (2) 函數的返回值是一個函數名code

def foo():
print("from the foo")
def test(func):
return func

res = test(foo)
res()

foo = test(foo)
foo()

  2. 函數式編程:函數式=編程語言定義的函數+數學意義的函數對象

   通俗來說,函數式就是用編程語言去實現數學函數。這種函數內對象是永恆不變的,要麼參數是函數,要麼返回值是函數,沒有for和while循環,全部的循環都由遞歸去實現,無變量的賦值(即不用變量去保存狀態),無賦值即不改變。blog

  3.

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函數
map函數

  4.

from functools import reduce
#合併,得一個合併的結果
array_test=[1,2,3,4,5,6,7]
array=range(100)

#報錯啊,res沒有指定初始值
def reduce_test(func,array):
    l=list(array)
    for i in l:
        res=func(res,i)
    return res

# print(reduce_test(lambda x,y:x+y,array))

#能夠從列表左邊彈出第一個值
def reduce_test(func,array):
    l=list(array)
    res=l.pop(0)
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))

#咱們應該支持用戶本身傳入初始值
def reduce_test(func,array,init=None):
    l=list(array)
    if init is None:
        res=l.pop(0)
    else:
        res=init
    for i in l:
        res=func(res,i)
    return res

print(reduce_test(lambda x,y:x+y,array))
print(reduce_test(lambda x,y:x+y,array,50))

reduce函數
reduce函數

  5.

#電影院彙集了一羣看電影bb的傻逼,讓咱們找出他們
movie_people=['alex','wupeiqi','yuanhao','sb_alex','sb_wupeiqi','sb_yuanhao']

def tell_sb(x):
    return x.startswith('sb')


def filter_test(func,array):
    ret=[]
    for i in array:
        if func(i):
            ret.append(i)
    return ret

print(filter_test(tell_sb,movie_people))


#函數filter,返回可迭代對象
print(filter(lambda x:x.startswith('sb'),movie_people))

filter函數
filter函數
#固然了,map,filter,reduce,能夠處理全部數據類型

name_dic=[
    {'name':'alex','age':1000},
    {'name':'wupeiqi','age':10000},
    {'name':'yuanhao','age':9000},
    {'name':'linhaifeng','age':18},
]
#利用filter過濾掉千年王八,萬年龜,還有一個九千歲
def func(x):
    age_list=[1000,10000,9000]
    return x['age'] not in age_list


res=filter(func,name_dic)
for i in res:
    print(i)

res=filter(lambda x:x['age'] == 18,name_dic)
for i in res:
    print(i)


#reduce用來計算1到100的和
from functools import reduce
print(reduce(lambda x,y:x+y,range(100),100))
print(reduce(lambda x,y:x+y,range(1,101)))

#用map來處理字符串列表啊,把列表中全部人都變成sb,比方alex_sb
name=['alex','wupeiqi','yuanhao']

res=map(lambda x:x+'_sb',name)
for i in res:
    print(i)

總結
總結
相關文章
相關標籤/搜索