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
![](https://img-blog.csdn.net/20170714215342835?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
函数名其实就是指向函数的变量!
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
![](https://img-blog.csdn.net/20170714215413551?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
上述操作发现: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
![](https://img-blog.csdn.net/20170714215447579?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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']
![](https://img-blog.csdn.net/20170714215509521?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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'))
![](https://img-blog.csdn.net/20170714215555627?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
map/reduce练习题
•利用 map() 函数,把用户输入的不规范的英文名字,变为首字母大写,其他小写的规范名字。输入: ['adam', 'LISA', 'barT'] ,输出: ['Adam', 'Lisa','Bart'] 。
def fun (x):
return x.capitalize()
print map(fun,['adam', 'LISA', 'barT'])
![](https://img-blog.csdn.net/20170714215615013?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
•Python 提供的 sum() 函数可以接受一个 list 并求和,请编写一个 prod()函数,可以接受一个 list 并利用 reduce() 求积。
def prod(x,y):
re
4000
turn x*y
print reduce(prod,[1,2,3,4])
![](https://img-blog.csdn.net/20170714215700214?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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]
![](https://img-blog.csdn.net/20170714215722592?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
• 把一个序列中的空字符串删请尝试用 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]
![](https://img-blog.csdn.net/20170714215826655?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
如果要对字符串进行排序呢?(根据字符串对应的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
![](https://img-blog.csdn.net/20170714220005527?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
高阶函数的抽象能力非常强大,而且核心代码可以保持得非常简洁。
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 #返回求和函数地址
![](https://img-blog.csdn.net/20170714220057182?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
调用f时,每次调用都会返回一个新的函数,即使传入相同的参数
![](https://img-blog.csdn.net/20170714220202384?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170714220248602?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20170714220227703?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
8.匿名函数
•当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
•关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数匿名函数,冒号后面表示输出
eg
要求输入[1,2,3..10],输出[1,4,9..100]
print map(lambda x:x*x, range(1,11))
![](https://img-blog.csdn.net/20170714220403187?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
eg
可传多个参数
f = lambda x,y=2:x**y #可以传多个参数,y的默认值为2
print f(2,3) #x=2,y=3
print f(2) #当没有给y赋值时,默认2
![](https://img-blog.csdn.net/20170714220452924?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
eg
f = lambda *x:map(lambda x:x*x,x) #*x可变参数
print f(1,2,3,4)
![](https://img-blog.csdn.net/20170714220516427?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
eg
f = lambda **kwargs:kwargs.items() #**kwargs关键字参数传字典
print f(name='lee',age=5)
![](https://img-blog.csdn.net/20170714220548626?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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)
![](https://img-blog.csdn.net/20170714220617535?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
• 匿名函数只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
• 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数;
•也可以把匿名函数作为返回值返回
9.装饰器
基础铺垫
调用函数
def hello1():
print 'hello1...'
def hello():
print 'hello........'
hello1()
hello()
![](https://img-blog.csdn.net/20170714220645045?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
•装饰器就是用来装饰函数。
• 想要增强原有函数的功能;
• 但不希望修改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()
![](https://img-blog.csdn.net/20170714220806176?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvY3NkbjA2Ng==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
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()
相关文章推荐
- 【Python学习笔记】函数和抽象
- caffe的python接口学习(12):查看属性、方法以及函数参数
- python学习笔记(二)之函数
- Python学习入门基础教程(learning Python)--2.3.4Python函数返回值
- python的函数---python入门学习(三)
- Python学习笔记 - 3.函数
- Python学习笔记摘要(一)类型 字符串 函数 列表 深浅拷贝
- python3.4学习笔记(二十) python strip()函数 去空格\n\r\t函数的用法
- Python修炼--常用字符串、数学函数 分类: python基础学习 2013-06-16 13:23 205人阅读 评论(0) 收藏
- Python学习19:函数和变量 Function and variables
- python学习——Python join()函数
- Python学习-函数、作用域
- 王亟亟的Python学习之路(10)-函数对象的作用域,函数作为返回值,闭包
- python函数缺省值与引用学习笔记分享
- python学习系列之python装饰器基础(2)---装饰含返回值的函数
- Python新手学习基础之函数-关键字参数
- Python学习笔记3:函数function
- python 函数-lambda 学习
- Python学习笔记(七)函数的使用
- Python3学习笔记(5)——函数和函数式编程