1.什么是高阶函数
引入:
变量可以指向函数
In [10]: a = max
In [11]: a(1,2,3,46)
Out[11]: 46
说明变量a现在已经指向了max函数本身。直接调用max()函数和调用变量f()完全相同。
既然变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
2.常见的内置高阶函数
- map()
map()函数接收两个参数,一个是函数,一个是Iterable(可迭代对象),map将传入的函数依次作用到序列的每个元素,并把结果作为新的Iterator返回。
以一个列表为例:
比如,把这个list所有数字立方:
def fun(x):
return x**3
list = [1,2,3,4,5]
print map(fun,list)
运行结果:
[1, 8, 27, 64, 125]
比如,把这个list所有数字转为字符串:
list = [1,2,3,4,5]
print map(str,list)
运行效果:
['1', '2', '3', '4', '5']
#两行代码就可以搞定
- reduce(0
reduce把一个函数作用在一个序列[x1, x2, x3, …]上,这个函数必须接收两个参数,reduce把结果继续和序列的下一个元素做累积计算,其效果就是:
reduce(f, [x1, x2, x3, x4]) = f(f(f(x1, x2), x3), x4)
计算一个数的阶乘:
def fun(x,y):
return x*y
N = input("N:")
print "N的阶乘为:"
print reduce(fun,range(1,N+1))
运行效果:
N:9
N的阶乘为:
362880
- filter()
和map()类似,filter()也接收一个函数和一个序列。和map()不同的是,filter()把传入的函数依次作用于每个元素,然后根据返回值是True还是False决定保留还是丢弃该元素。
注意: function函数返回值为bool类型
举例:输入一个数,在这个数范围内判断,满足两个素数之和等于这个数的素数对有几对
n = input("输入一个数n:")
def is_prime(x):
if x==1:
return False
else:
for i in range(2,x):
if x%i == 0:
return False
else:
return True
prime_list =filter(is_prime,range(1,n))
print "这个数范围内的素数队列为%s" %(prime_list)
print "分别是以下:"
count = 0
for i in prime_list:
if is_prime(n-i) and i<=n-i:
print (i,n-i)
count +=1
print "共%d对" %(count)
运行效果:
输入一个数n:10
这个数范围内的素数队列为[2, 3, 5, 7]
分别是以下:
(3, 7)
(5, 5)
共2对
- sorted()
sorted函数的参数
sorted(iterable, cmp=None, key=None, reverse=False) –> new sorted list
cmp=用于比较的函数, 返回值一定和cmp函数的返回值对应(1,-1,0)
举例1:令一个队列逆序输出
li = [1,2,5,7,0,3]
li = sorted(li,reverse=True)
print li
运行效果:
[7, 5, 3, 2, 1, 0]
举例2:字符串按照ASCII排序的时候,忽略大小写
name = ["Dredia","david","robert","Jibert"]
def ignore(s1,s2):
s1 = s1.lower()
s2 = s2.lower()
return cmp(s1,s2)
print sorted(name ,ignore)
运行效果:
['david', 'Dredia', 'Jibert', 'robert']
当然也可以使用匿名函数一步完成
name = ["Dredia","david","robert","Jibert"]
print sorted(name,cmp=lambda s1,s2:cmp(s1.lower(),s2.lower()))