Chinaunix首页 | 论坛 | 博客
  • 博客访问: 237515
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 557
  • 用 户 组: 普通用户
  • 注册时间: 2015-10-01 18:05
文章分类

全部博文(57)

文章存档

2017年(57)

我的朋友

分类: Python/Ruby

2017-11-02 14:24:39

这篇我们讲讲python的高阶函数
在讲高阶函数前面,我们先看一个实例:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 12:03
  5. # @file :gaojiefunc.py


  6. def f(x):
  7.     return x * x

  8. def h(func, x):
  9.     return func(x) * func(x)

  10. print(h(f, 2))
运行结果是:16
这段代码中函数h就是一个高阶函数,因为它的第一个参数是一个函数(即接受一个函数作为输入,满足高阶函数的第一个条件)。
再来看一个:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 12:58
  5. # @file :func.py


  6. def m(x):
  7.     def n():
  8.         return x * x
  9.     return n

  10. print(m(2)())
运行结果是:4
在函数m内部定义了一个子函数n,并且将该函数作为返回值返回。
当我们调用m(2)时,返回值是函数n,那么m(2)()就是对函数n的调用。
map() 函数
map(func,lst),将传入的函数变量func作用到lst变量的每个元素中,并将结果组成新的列表返回。
实例如下:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 12:03
  5. # @file :gaojiefunc.py
  6. import math

  7. x_2 = [x**2 for x in xrange(9)]
  8. print x_2

  9. x_sqrt_lst = map(math.sqrt,x_2)
  10. print x_sqrt_lst

  11. x_2_str_lst = map(str,x_2)
  12. print x_2_str_lst
运行结果:
[0, 1, 4, 9, 16, 25, 36, 49, 64]
[0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0]
['0', '1', '4', '9', '16', '25', '36', '49', '64']
由此可见::map函数有两个参数,一个是函数,另一个是列表,返回值为对传入的列表每一个元素执行传入的函数操作得到的列表

reduce()函数
reduce(func(x,y), lst) ,其中func必须有两个参数,每次func计算的结果继续和序列的下一个元素做累积计算。
lst = [a1,a2,a3,...,an]
reduce(func(x,y),lst) = func(func(func(a1,a2),a3),......,an)
实例一:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 13:15
  5. # @file :reducefun.py


  6. str_lst = map(str,range(5))
  7. print str_lst

  8. def make_num(str1, str2):
  9.     return int(str1) + int(str2)

  10. result = reduce(make_num, str_lst)
  11. print result
运行结果如下:
['0', '1', '2', '3', '4']
10
实例二:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 13:15
  5. # @file :reducefun.py


  6. def prod(x, y):
  7.     return x*y;

  8. result = reduce(prod, [2, 4, 5, 7, 12])

  9. print result
运行结果如下:
3360
由此可见:reduce函数也有两个参数,一个是函数,另一个是列表,返回值为对list的每一个元素反复调用函数f,得到最终结果。

filter()函数
filter函数接受函数参数f和列表参数lst,f对lst元素进行判断,返回lst的元素中调用f函数结果为true的元素组成的列表(将不满足f函数条件的元素过滤掉)
实例如下:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 13:30
  5. # @file :filterfun.py


  6. number_lst = range(-10,10)

  7. def is_negative(x):
  8.     return x < 0

  9. filtered_lst = filter(is_negative,number_lst)
  10. print number_lst
  11. print filtered_lst
运行结果如下:
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[-10, -9, -8, -7, -6, -5, -4, -3, -2, -1]

sorted()函数
sorted函数接受一个列表lst和一个函数参数f,f为自定义的比较lst元素大小的函数,返回值为lst中元素按f函数排列的列表
实例一:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 13:36
  5. # @file :sortedfunc.py


  6. L = [('b',2),('a',1),('c',3),('d',4)]
  7. # 利用cmp函数
  8. print sorted(L, cmp=lambda x,y:cmp(x[1],y[1]))
  9. # 利用key
  10. print sorted(L, key=lambda x:x[1])


  11. students = [('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]
  12. # 按年龄排序
  13. print sorted(students, key=lambda s: s[2])
  14. # 按降序
  15. print sorted(students, key=lambda s: s[2], reverse=True)
运行结果:
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
[('john', 'A', 15), ('jane', 'B', 12), ('dave', 'B', 10)]

实例二:

点击(此处)折叠或打开

  1. #!/usr/bin/env python
  2. # -*- coding:utf-8 -*-
  3. # Author :Alvin.xie
  4. # @Time :2017-11-02 13:36
  5. # @file :sortedfunc.py

  6. # 列表排序
  7. result = sorted([35, 8, 12, 9, 23])
  8. print result

  9. # 自定义排序
  10. def reversed_cmp(x,y):
  11.     if x>y:
  12.         return -1
  13.     if x<y:
  14.         return 1
  15.     return 0

  16. alist = [35, 8, 12, 9, 23,8,15]

  17. result1 = sorted(alist,reversed_cmp)
  18. result2 = sorted(alist,reversed_cmp,reverse=False)
  19. result3 = sorted(alist,reversed_cmp,reverse=True)

  20. print result1
  21. print result2
  22. print result3

  23. def cmp_ignore_case(s1, s2):
  24.     return cmp(s1.lower(),s2.lower())

  25. print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
[8, 9, 12, 23, 35]
[35, 23, 15, 12, 9, 8, 8]
[35, 23, 15, 12, 9, 8, 8]
[8, 8, 9, 12, 15, 23, 35]
['about', 'bob', 'Credit', 'Zoo']

匿名函数 lambda

lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数

匿名函数有个限制,就是只能有一个表达式,不用写return返回值就是该表达式的结果。
用匿名函数有个好处,因为函数没有名字,不必担心函数名冲突。此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数:

先来看个简单 lambda 函数
>>>lambda x,y : x+y

x和y是函数的两个参数,冒号后面的表达式是函数的返回值,这个函数就是在求2个变量的和,但是作为一个函数,没有名字如何使用?我们暂时给它
绑定一个名字,看看如何调用

更流行的应用如下
将一个 list 里的每个元素都平方:






阅读(1275) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~