高阶函数——————sorted
排序也是在程序中经常用到的算法。 无论使用冒泡排序还是快速
排序,排序的核心是比较两个元素的大小。通常规定如下:
x < y, return -1
x == y, return 0
x > y, return 1
先进入ipython模式,进行以下操作
1.对元组进行排序
In [1]: t=(1,2,5,3,43,35,34)
In [2]: sorted(t) ##对元组内的元素进行正序排序
Out[2]: [1, 2, 3, 5, 34, 35, 43]
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, 35, 34, 5, 3, 2, 1]
2.对字符串进行排序,按照第一个字符ASCLL码进行排序
In [5]: li=[‘zhangxuemeng‘,‘westos‘,‘wangying‘,‘redhat‘,‘Redhat‘]
In [6]: sorted(li) ##如果有大写,大写在前,并且大写小于小写
Out[6]: [‘Redhat‘, ‘redhat‘, ‘wangying‘, ‘westos‘, ‘zhangxuemeng‘]
In [7]: ‘westos‘<‘zhangxuemeng‘
Out[7]: True
In [9]: 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
...: sorted(li,ignore_case_cmp)
...:
In [10]: sorted(li,ignore_case_cmp)
Out[10]: [‘redhat‘, ‘Redhat‘, ‘wangying‘, ‘westos‘, ‘zhangxuemeng‘]
3.函数作为返回值
高阶函数除了可以接受函数作为参数外,还可以把函数作为结果值返回
(1)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)
print f()
##调用 warp_sum() 时,返回的并不是求和结果,而是求和函数f()
##调用f(),运行my_sum函数进行计算求和
测试:
(2)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
f1=wrap_sum(1,2,3,6)
print f1()
f2=wrap_sum(1,2,3,6)
print f2()
if f1==f2:
print "true"
else:
print "fluse"
测试:
4.匿名函数
(1)当我们在传入函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便。
(2)关键字 lambda 表示匿名函数,冒号前面的 x 表示函数参数
(3)匿名函数有只能有一个表达式,不用写 return ,返回值就是该表达式的结果。
(4) 因为匿名函数没有名字,不必担心函数名冲突。 此外,匿名函数也是一个函数对
象,也可以把匿名函数赋值给一个变量,再利用变量来调用该函数
def pow1(x):
return x*x
print map(pow1,range(1,11))
print map(lambda x:x*x,range(1,11))
#匿名函数可以赋值给一个变量,需要变量运行时,变量名()
#f=lambda:1
#print f()
#匿名函数传递必选参数和默认参数
#f=lambda x,y=2:x**y
#print f(2,3)
#print f(2)
#匿名函数传递可变参数
#f=lambda *x:map(lambda x:x+x,x)
#print f(1,2,3,4)
#匿名函数传递关键字参数
f= lambda **kwargs:kwargs.items()
print f(name="fentiao",age=5)
练习:利用匿名函数和字典重新编辑计算器的代码
oper=raw_input("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](3,2)
测试:
##########装饰器###########
装饰器就是用来装饰函数。
想要增强原有函数的功能;
但不希望修改now()函数的定义;
在代码运行期间动态增加功能的方式;
定义的装饰器实质是返回函数的高阶函数
import time
def timmer(func):
def dec():
start_time=time.time()
func()
stop_time=time.time()
return "%s run %f s"%(func.__name__,stop_time-start_time)
return dec
@timmer ###hello1=timmer(hello1),语法糖
def hello1():
print ‘hello1.....‘
time.sleep(2)
print hello1()
测试: