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