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']