您的位置:首页 > 编程语言 > Python开发

python学习之高阶函数

2017-07-14 22:09 429 查看
#####高阶函数#######

1.函数

函数本身也可以赋值给变量,即:变量可以指向函数。

In [91]: abs(-10)

Out[91]: 10

In [92]: abs

Out[92]: <function abs>

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

In [94]: print x

10



函数名其实就是指向函数的变量!

In [95]: abs(-12)

Out[95]: 12

In [96]: abs = 1

In [97]: abs(-12)

---------------------------------------------------------------------------

TypeError                                 Traceback (most recent call last)

<ipython-input-97-8e9734c06f36> in <module>()

----> 1 abs(-12)

TypeError: 'int' object is not callable



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

2.高阶函数

变量可以指向函数,函数的参数能接收变量,那么一个函数就可以接收另一个函数作为参数,这种函数就称之为高阶函数

In [1]: def fun(x,y,f):

   ...:     print f(x),f(y)

   ...:     

In [2]: fun(2,-10,abs)

2 10



3.map函数

map() 函数接收两个参数,一个是函数,一个是序列, map 将传入的函数依次作用到序列的每个元素,并把结果作为新的 list 返回。

不需要 map() 函数,写一个循环,也可以计算出结果.

map() 作为高阶函数,把运算规则抽象了.

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

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

In [2]: str(1)

Out[2]: '1'

In [3]: map(str,li)

Out[3]: ['1', '2', '3']



4.reduce函数

reduce 把一个函数作用在一个序列[x1, x2, x3...]上,这个函数必须接收两个参数,reduce 把结果继续和序列的下一个元素做累积计算。

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

def fun(x,y):

    return x*10 + y

def char2int(x):

    return {'0':0,'1':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9}[x]

print reduce(fun,map(char2int,'12345'))



map/reduce练习题

•利用 map() 函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入: ['adam', 'LISA', 'barT'] ,输出: ['Adam', 'Lisa','Bart'] 。

def fun (x):

    return x.capitalize()

print map(fun,['adam', 'LISA', 'barT'])



•Python 提供的 sum() 函数可以接受一个 list 并求和,请编写一个 prod()函数,可以接受一个 list 并利用 reduce() 求积。

def prod(x,y):

    re
4000
turn x*y

print reduce(prod,[1,2,3,4])



5.filter函数

filter() 也接收一个函数和一个序列。和 map() 不同的时,filter() 把传入的函数依次作用于每个元素,然后根据返回值是 True还是 False 决定保留还是丢弃该元素。

在一个 list 中,删掉偶数,只保留奇数:

In [3]: def isodd(n):

   ...:     return n %2 == 1

   ...:

 

In [4]: filter(isodd,range(10))

Out[4]: [1, 3, 5, 7, 9]



• 把一个序列中的空字符串删请尝试用 filter() ;

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

6.sorted函数

• 排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速排序,排序的核心是比较两个元素的大小。通常规定如下:

x < y, return -1

x == y, return 0

x > y, return 1

• python内置的 sorted() 函数就可以对 list 进行排序(默认从小到大);

倒序排序

In [4]: t = (12,3,65,24,13,33)

In [5]: sorted(t)

Out[5]: [3, 12, 13, 24, 33, 65]

In [6]: def reversed_cmp(x,y):

   ...:     if x>y:

   ...:         return -1

   ...:     elif x<y:

   ...:         return 1

   ...:     else:

   ...:         return 0

   ...:     

In [7]: sorted(t,reversed_cmp)

Out[7]: [65, 33, 24, 13, 12, 3]



如果要对字符串进行排序呢?(根据字符串对应的ASCII)

In [8]: li = ['alili','flili','xlii']

In [9]: sorted(li)

Out[9]: ['alili', 'flili', 'xlii']

In [10]: li = ['alili','flili','xlii','Flili']

In [11]: sorted(li)

Out[11]: ['Flili', 'alili', 'flili', 'xlii']

In [12]: 'Flili'>'flili'

Out[12]: False

In [13]: 'flili'>'alili'

Out[13]: True



高阶函数的抽象能力非常强大,而且核心代码可以保持得非常简洁。

7.函数作为返回值

高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回。

#函数作为返回值

def wrap_sum(*args):      #*args表示可变参数,可用于传多个参数

    def mysum():

        sum_num = 0     #给一个初始值

        for i in args:

            if not isinstance(i,(int,float)):   #判断i是否为数字记即整形或浮点型

               print 'Error Type'

            sum_num = sum_num + i       #累加

        return sum_num

    return mysum

f = wrap_sum(2,4,6,8)

print  f()   #返回求和结果

print f     #返回求和函数地址



调用f时,每次调用都会返回一个新的函数,即使传入相同的参数







8.匿名函数

•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。

•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数匿名函数,冒号后面表示输出

eg

要求输入[1,2,3..10],输出[1,4,9..100]

print map(lambda x:x*x, range(1,11))



eg

可传多个参数

f = lambda x,y=2:x**y   #可以传多个参数,y的默认值为2

print f(2,3)            #x=2,y=3

print f(2)              #当没有给y赋值时,默认2



eg

f = lambda *x:map(lambda  x:x*x,x)    #*x可变参数

print f(1,2,3,4)



eg

f = lambda **kwargs:kwargs.items()  #**kwargs关键字参数传字典

print f(name='lee',age=5)



eg

#用匿名函数实现四则运算

x = input('input num1:')

y = input('input num2:')

oper = raw_input('input a oper:')

d = {

    '+': lambda x,y:x+y,

    '-': lambda x,y:x-y,

    '*': lambda x,y:x*y,

    '/': lambda x,y:x/y

}

if oper not in d.keys():

    print 'input +,-,*,/'

print d[oper](x,y)



• 匿名函数只能有一个表达式,不用写 return ,返回值就是该表达式的结果。

• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;

•也可以把匿名函数作为返回值返回

9.装饰器

基础铺垫

调用函数

def hello1():

    print 'hello1...'

def hello():

    print 'hello........'

    hello1()

hello()


•装饰器就是用来装饰函数。

• 想要增强原有函数的功能;

• 但不希望修改now()函数的定义;

• 在代码运行期间动态增加功能的方式;

•定义的装饰器实质是返回函数的高阶函数。(试试下面的装饰器)

#装饰器

#添加功能,装饰函数

#1)不改变函数的源代码

#2)函数的调用方式改变    #字符串%s 数值%d

import time

def timmer(func):

    def dec():

        start_time = time.time()

        func()

        stop_time = time.time()

        return '%s run %fs' %(func.__name__,stop_time-start_time)

    return dec

@timmer         #这里是 python 提供的一个语法糖

def hello():

    print 'hello...'

    time.sleep(2)

hello=timmer(hello)

print hello()



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: