Python函數式編程

Python函數式編程

也稱泛函編程,是一種編程泛型,它將電腦運算視作數學上的函數計算,並且避免狀態以及可變數據;

函數式編程語言最重要的基礎是lambda演算,而且lambda演算的函數可以接受函數當做輸入和輸出;

Python支持有限的函數式編程功能

1)、filter(func,seq):

調用一個布爾函數func來迭代遍歷每個seq中的元素,返回一個是func返回值爲true的元素的序列

filter()使用示例:

In [1]:def f1(x):

  ...:    if x > 10:

  ...:        returnTrue

  ...:    else:

  ...:        return False

  ...:    

In [2]: l1= [1,2,44,55,22]

In [3]:filter(f1,l1)

Out[3]:[44, 55, 22]

In [4]: l2= [1,2,11,22]

In [5]:filter(f1,l2)

Out[5]:[11, 22]

2)、映射器:map()

map()將函數調用“映射”到每個序列的對應元素上並返回一個含有所有返回值的列表

map(func,seq1[,seq2...]):將函數func作用於給定序列(s)的每個元素,並用一個序列提供返回值;

如果func爲none,func表現爲一個身份函數,返回一個含有每個序列中元素集合的n個元組的列表

map()使用示例:

In [1]: l1= [0,1,2,3,4,5,6];l2 =["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]

In [2]:map(None,l1,l2)

Out[2]:

[(0,'Sun'),(1, 'Mon'),(2, 'Tue'),(3, 'Wed'),(4, 'Thu'),(5, 'Fri'),(6,'Sat')]

In [3]: l1= [0,1,2,3,4,5,6];l2 =["Sun","Mon","Tue","Wed","Thu","Fri"]

In [4]:map(None,l1,l2)

Out[4]:

[(0,'Sun'),(1, 'Mon'),(2, 'Tue'),(3, 'Wed'),(4, 'Thu'),(5, 'Fri'),(6,None)]

In [5]:def f1(x): return x*2

In [6]:map(f1,l1)

Out[6]:[0, 2, 4, 6, 8, 10, 12]

In [7]:map(f1,l2)

Out[7]:['SunSun', 'MonMon', 'TueTue', 'WedWed', 'ThuThu','FriFri']

In [8]:def f2(x,y): return x*2,y*2

In [9]: l1= [0,1,2,3,4,5,6];l2 =["Sun","Mon","Tue","Wed","Thu","Fri","Sat"]

In [10]:map(f2,l1,l2)

Out[10]:

[(0,'SunSun'),(2, 'MonMon'),(4, 'TueTue'),(6, 'WedWed'),(8,'ThuThu'),(10, 'FriFri'),(12, 'SatSat')]

In [11]:map(f2,l2,l1)

Out[11]:

[('SunSun', 0),('MonMon', 2),('TueTue', 4),('WedWed',6),('ThuThu', 8),('FriFri', 10),('SatSat', 12)]

3)、reduce(func,seq[,init]):

將二元函數作用於seq序列的元素,每次攜帶一對(先前的結果以及下一個序列元素),連續地將現有的結果和下一個值作用在獲得的隨後結果上,最後減少我們的序列爲一個單一的返回值;如果初始值init給定,第一個比較會是init和第一個序列元素而不是序列的頭兩個元素

reduce()使用示例:

In [12]:def f3(x,y): return x+y

In [13]:l1

Out[13]:[0, 1, 2, 3, 4, 5, 6]

In [14]:reduce(f3,l1)

Out[14]:21

In [15]:reduce(f3,l1,10)

Out[15]:31

練習:

使用filter函數,返回/etc/passwd中包含了/bin/bash字串的所有用戶名爲一個列表

[root@test0527]# vim test4.py

#!/usr/bin/python27

#

importre

filename ='/etc/passwd'

f1 =open(filename,'r')

flist =f1.readlines()

ush =[]

user =[]

 

for i inflist:

   j = [(i.split(':')[0]),(i.split(':')[6])]

   ush.append(j)

 

deffunc(x):

   if x[1] == "/bin/bash\n":

       return True

   else:

       return False

 

userbash=filter(func,ush)

for k inuserbash:

   user.append(k[0])  

f1.close()

printuserbash

printuser

#printflist

[root@test0527]# ./test4.py

[['root','/bin/bash\n'], ['field', '/bin/bash\n'], ['mysql','/bin/bash\n']]

['root','field', 'mysql']

發佈了108 篇原創文章 · 獲贊 47 · 訪問量 48萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章