-
帶參數的decorator
查看全部 -
像這種內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。
閉包的特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變
查看全部 -
filter()函數是?Python?內置的另一個有用的高階函數,filter()函數接收一個函數 f?和一個list,這個函數?f?的作用是對每個元素進行判斷,返回 True或 False,filter()根據判斷結果自動過濾掉不符合條件的元素,返回由符合條件元素組成的新list。
例如,要從一個list [1, 4, 6, 7, 9, 12, 17]中刪除偶數,保留奇數,首先,要編寫一個判斷奇數的函數:
def?is_odd(x): ????return?x?%?2?==?1
然后,利用filter()過濾掉偶數:
filter(is_odd,?[1,?4,?6,?7,?9,?12,?17])
結果:[1, 7, 9, 17]
注意:?s.strip(rm) 刪除 s 字符串中開頭、結尾處的 rm 序列的字符。
當rm為空時,默認刪除空白符(包括'\n', '\r', '\t', ' '),如下:
a?=?'?????123' a.strip()
結果:?'123'
a='\t\t123\r\n' a.strip()
查看全部 -
reduce 函數
reduce()函數也是Python內置的一個高階函數。reduce()函數接收的參數和 map()類似,一個函數 f,一個list,但行為和 map()不同,reduce()傳入的函數 f 必須接收兩個參數,reduce()對list的每個元素反復調用函數f,并返回最終結果值。
例如,編寫一個f函數,接收x和y,返回x和y的和:
def?f(x,?y): ????return?x?+?y
調用?reduce(f, [1, 3, 5, 7, 9])時,reduce函數將做如下計算:
先計算頭兩個元素:f(1,?3),結果為4; 再把結果和第3個元素計算:f(4,?5),結果為9; 再把結果和第4個元素計算:f(9,?7),結果為16; 再把結果和第5個元素計算:f(16,?9),結果為25; 由于沒有更多的元素了,計算結束,返回結果25。
查看全部 -
map()是 Python 內置的高階函數,它接收一個函數 f?和一個?list,并通過把函數 f 依次作用在 list 的每個元素上,得到一個新的 list 并返回。
def?f(x): ????return?x*x print?map(f,?[1,?2,?3,?4,?5,?6,?7,?8,?9])
[1,?4,?9,?10,?25,?36,?49,?64,?81]
查看全部 -
請編寫一個函數calc_prod(lst),它接收一個list,返回一個函數,返回函數可以計算參數的乘積。
先定義能計算乘積的函數,再將此函數返回。
參考代碼:
def?calc_prod(lst): ????def?lazy_prod(): ????????def?f(x,?y): ????????????return?x?*?y ????????return?reduce(f,?lst,?1) ????return?lazy_prod f?=?calc_prod([1,?2,?3,?4]) print?f()
查看全部 -
對字符串排序時,有時候忽略大小寫排序更符合習慣。請利用sorted()高階函數,實現忽略大小寫排序的算法。
輸入:['bob', 'about', 'Zoo', 'Credit']
輸出:['about', 'bob', 'Credit', 'Zoo']對于比較函數cmp_ignore_case(s1, s2),要忽略大小寫比較,就是先把兩個字符串都變成大寫(或者都變成小寫),再比較。
def cmp_ignore_case(s1, s2):
? ? x = s1.upper()
? ? y = s2.upper()
? ? if x > y:
? ? ? ? return 1
? ? if x < y:
? ? ? ? return -1
? ? return 0
print sorted(['bob', 'about', 'Zoo', 'Credit'], cmp_ignore_case)
查看全部 -
請利用filter()過濾出1~100中平方根是整數的數,即結果應該是:
[1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
filter()?接收的函數必須判斷出一個數的平方根是否是整數,而?math.sqrt()返回結果是浮點數。
參考代碼:
import?math def?is_sqr(x): ????r?=?int(math.sqrt(x)) ????return?r*r==x print?filter(is_sqr,?range(1,?101))
查看全部 -
Python內置了求和函數sum(),但沒有求積的函數,請利用recude()來求積:
輸入:[2, 4, 5, 7, 12]
輸出:2*4*5*7*12的結果reduce()接收的函數f需要兩個參數,并返回一個結果,以便繼續進行下一輪計算。
參考代碼:
def?prod(x,?y): ????return?x?*?y print?reduce(prod,?[2,?4,?5,?7,?12])
查看全部 -
假設用戶輸入的英文名字不規范,沒有按照首字母大寫,后續字母小寫的規則,請利用map()函數,把一個list(包含若干不規范的英文名字)變成一個包含規范英文名字的list:
輸入:['adam', 'LISA', 'barT']
輸出:['Adam', 'Lisa', 'Bart']format_name(s)函數接收一個字符串,并且要返回格式化后的字符串,利用map()函數,就可以輸出新的list。
參考代碼1:
def?format_name(s): ????return?s[0].upper()?+?s[1:].lower() print?map(format_name,?['adam',?'LISA',?'barT'])
參考代碼2:
def format_name(s):
? ? return s.title()
print map(format_name, ['adam', 'LISA', 'barT'])
upper()//把所有字符中的小寫字母轉換成大寫
lower()//把所有字符中的大寫字母轉換成小寫
capitalize()//把第一個字母轉換成大寫字母,其余小寫
title()//把每個單詞的第一個字母轉換成大寫,其余小寫
查看全部 -
利用add(x,y,f)函數,計算:
計算平方根可以用函數:
>>>?math.sqrt(2) 1.4142...
參考代碼:
import?math def?add(x,?y,?f): ????return?f(x)?+?f(y) print?add(25,?9,?math.sqrt)
查看全部 -
無參數 decorator:接收一個函數作為參數返回一個新函數
使用decoraror用@語法
log一般只能用于一個參數如果要想log用于所有參數利用py的*args和**kw
def?log(f): ????def?fn(): ????????print?'call?'?+?f.__name__?+?'()...' ????????return?f(*args,?**kw) ????return?fn
?print 'call %s() in %fs' %(f._name_,(t2 -t1))
%s指在為輸出內容占位置,輸出的內容為%后的f._name_和(t2 -t1),_name_是py中內建變量、模塊標識的名字,所以f._name_即返回f的名字
time.time()返回當前的時間戳 使用前聲明用 import time
查看全部 -
裝飾器:定義了一個函數在運行時動態增加功能又不改變原函數 @語法簡化裝飾器調用
@new_fn? ? ? ? ? ? ? ? ? ? ? ? ? ? ?def f1(x):
def f1(x):? ? ? ?--------------->?????return x*2
????return x*2? ? ? ? ? ? ? ? ? ? ? ? f1 = new_fn(f1)
原有f1被徹底隱藏
裝飾器作用:極大簡化代碼,避免每個函數編寫重復性代碼
打印日志:@log
檢測性能:@performance
數據庫事務:@transaction
URL路由:@post('/register')
查看全部 -
匿名函數:lambda? 函數參數:表達式
匿名函數只能有一個表達式,不寫return,返回值就是該表達式的結果
使用匿名函數可以不定義函數名,直接創建一個函數對象,返回函數的時候也可以返回匿名函數
查看全部 -
閉包:內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況
特點:返回的函數引用了外層函數的局部變量,所以要確保引用的局部變量在函數返回后不能變
查看全部
舉報