python5

高階函數——————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函數進行計算求和

 

測試:

wKioL1lmVCHwqkF0AAAn_W8SRAk481.png-wh_50

 

(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"

 

測試:

wKiom1lmVDDy5SENAAAy91e1QN8033.png-wh_50 

 

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()

wKioL1lmVEagdfGiAAA5iGrEgng521.png-wh_50

 

#匿名函數傳遞必選參數和默認參數

#f=lambda x,y=2:x**y

#print f(2,3)

#print f(2)

 wKiom1lmVFiQi0GsAAA76VPwQBQ454.png-wh_50

#匿名函數傳遞可變參數

#f=lambda *x:map(lambda x:x+x,x)

#print f(1,2,3,4)

wKioL1lmVGewKUGIAAA5EZPyzu8596.png-wh_50 

#匿名函數傳遞關鍵字參數

f= lambda **kwargs:kwargs.items()

print f(name="fentiao",age=5)

wKiom1lmVHXCcwCoAAA9DLYv9oM529.png-wh_50 

 

 

練習:利用匿名函數和字典重新編輯計算器的代碼

 

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)

 

測試:


wKioL1lmVJPAZ2UQAAAmgQQDVSg700.png-wh_50

wKioL1lmVJOgJ84sAAAkkL1uK8w316.png-wh_50

wKiom1lmVJTj161XAAAn3JqO8GI204.png-wh_50

wKiom1lmVJSSQp8YAAAmY8juaYk290.png-wh_50

##########裝飾器###########

裝飾器就是用來裝飾函數。

想要增強原有函數的功能;

但不希望修改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()

 

 

測試:

wKiom1lmVX-RYbV3AAAuTqVzz-s907.png-wh_50 

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章