函数式编程之高阶函数

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()))
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值