python---高阶函数

###################################
############# 高阶函数 #############
###################################
1.函数
1)函数本身也可以赋值给变量,即:变量可以指向函数。
In [1]: abs(-10)

Out[1]: 10


In [2]: abs

Out[2]: <function abs>


In [3]: x = abs(-10)

In [4]: x
Out[4]: 10

In [5]: f = abs

In [6]: f(-10)
Out[6]: 10

In [7]: f
Out[7]: <function abs>

2)函数名其实就是指向函数的变量!
In [8]: abs(-10)
Out[8]: 10

In [9]: abs = 1

In [10]: abs(-10)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-10-c432e3f1fd6c> in <module>()
----> 1 abs(-10)

TypeError: 'int' object is not callable


上述操作发现:abs为函数名,给abs=1重新赋值后,abs已不是函数,而是一个整数。


2.高阶函数
    变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数。
In [2]: def func(x,y,f):
   ...:     print f(x),f(y)
   ...:     

In [3]: func(-2,-10,abs)
2 10


3.map函数

    map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。map() 作为高阶函数,把运算规则抽象了。
In [1]: def f(x):
   ...:     return x*x
   ...:

In [2]: map(f,range(1,10))
Out[2]: [1, 4, 9, 16, 25, 36, 49, 64, 81]

练习: 把这list列表中的所有数字转为字符串;([1,2,3]---['1','2','3'])

In [3]: list = [1,2,3]

In [4]: map(str,list)
Out[4]: ['1', '2', '3']


4.reduce函数

    reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。
In [5]: def add(x,y):
   ...:     return x+y
   ...:

In [6]: reduce(add,[2,3,4])    # 2+3=5-->5+4=9
Out[6]: 9

In [7]: def fn(x,y):
   ...:     return x * 10 + y
   ...:

In [8]: reduce(fn,[1,2,5,6])    # 1*10+2=12-->12*10+5=125-->125*10+6=1256
Out[8]: 1256


综合编程:写出把 str 转换为 int 的函数(eg:'12345'--12345)
In [1]: str = '12345'

In [2]: def fn(x,y):
   ...:     return x * 10 + y
   ...:

In [3]: def char2int(x):
   ...:     return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5}[x]
   ...:

In [4]: map(char2int,'12345')
Out[4]: [1, 2, 3, 4, 5]

In [5]: reduce(fn,map(char2int,'12345'))
Out[5]: 12345


5.filter函数

    filter() 也接收一个函数和一个序列。和 map() 不同的时,filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True 还是 False 决定保留还是丢弃该元素。
1)在一个 list 中,删掉偶数,只保留奇数:
In [6]: def isodd(n):
   ...:     return n % 2 == 1
   ...:

In [7]: filter(isodd,range(10))
Out[7]: [1, 3, 5, 7, 9]


2)把一个序列中的空字符串删掉

In [19]: def noempty(s):
   ....:     return s and s.strip()
   ....:

In [20]: filter(noempty,['1','','A',None,' '])
Out[20]: ['1', 'A']


3)用 filter()删除 1~100 的素数

import math
l = range(1,101)
def delprimenum(str):
    if str == 1:
        return str
    for i in range(2,int(math.sqrt(str)+1)):
        if str%i == 0:
            return str
print filter(delprimenum,l)


6.sorted函数

    排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:
    x < y, return -1
    x == y, return 0
    x > y, return 1
1)默认正序
In [1]: t = (12,34,5,43,2)

In [2]: sorted(t)
Out[2]: [2, 5, 12, 34, 43]

2)倒序排序
In [3]: def reversed_cmp(x,y):
   ...:     if x>y:
   ...:         return -1
   ...:     elif x<y:
   ...:         return 1
   ...:     else:
   ...:         return 0
   ...:     

In [4]: sorted(t,reversed_cmp)
Out[4]: [43, 34, 12, 5, 2]

3)字符串排序
按照ASCII码排序:
In [5]: li = ['hello','linux','apple']

In [6]: sorted(li)
Out[6]: ['apple', 'hello', 'linux']

In [7]: li = ['hello','linux','apple','Hello']

In [8]: sorted(li)
Out[8]: ['Hello', 'apple', 'hello', 'linux']


忽略大小写排序:

In [12]: def ignore_case_cmp(x,y):
   ....:     lower1 = x.lower()
   ....:     lower2 = y.lower()
   ....:     if lower1 < lower2:
   ....:         return -1
   ....:     elif lower1 > lower2:
   ....:         return 1
   ....:     else:
   ....:         return 0
   ....:     

In [13]: li
Out[13]: ['hello', 'linux', 'apple', 'Hello']

In [14]: sorted(li,ignore_case_cmp)
Out[14]: ['apple', 'hello', 'Hello', 'linux']


7.函数作为返回值
1)高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。
def wrap_sum(*args):
    def my_sum():
        sum_num = 0
        for i in args:        3# for循环,依次相加
            if not isinstance(i,(int,float)):
                print "ERROR TYPE"
            sum_num = sum_num + i
        return sum_num        4# 返回sum_num值
    return my_sum        2# 返回my_sum,调用my_sum
f = wrap_sum(1,2,3,6)        1# 调用wrap_sum函数,返回的并不是求和结果,而是my_sum函数
print f()            5# 调用函数 f 时,才真正计算求和的结果
结果:12


2)调用 wrap_sum() 时,每次调用都会返回一个新的函数,即使传入相同的参数。

def wrap_sum(*args):
    def my_sum():
        sum_num = 0
        for i in args:
            if not isinstance(i,(int,float)):
                print "ERROR TYPE"
            sum_num = sum_num + i
        return sum_num
    return my_sum
f = wrap_sum(1,2,3,6)
f1 = wrap_sum(1,2,3,6)
print f == f1
结果:False

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值