高階函數——————sortedpython
排序也是在程序中常常用到的算法。 不管使用冒泡排序仍是快速算法
排序,排序的核心是比較兩個元素的大小。一般規定以下:ide
x < y, return -1函數
x == y, return 0測試
x > y, return 1spa
先進入ipython模式,進行如下操做blog
1.對元組進行排序排序
In [1]: t=(1,2,5,3,43,35,34)ip
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()
測試: