-
任務
請思考帶參數的@decorator,@functools.wraps應該放置在哪:
def?performance(unit): ????def?perf_decorator(f): ????????def?wrapper(*args,?**kw): ??????????????? ????????return?wrapper ????return?perf_decorator
?不會了怎么辦
注意@functools.wraps應該作用在返回的新函數上。
參考代碼:
import?time,?functools def?performance(unit): ????def?perf_decorator(f): [email protected](f) ????????def?wrapper(*args,?**kw): ????????????t1?=?time.time() ????????????r?=?f(*args,?**kw) ????????????t2?=?time.time() ????????????t?=?(t2?-?t1)?*?1000?if?unit=='ms'?else?(t2?-?t1) ????????????print?'call?%s()?in?%f?%s'?%?(f.__name__,?t,?unit) ????????????return?r ????????return?wrapper ????return?perf_decorator @performance('ms') def?factorial(n): ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1)) print?factorial.__name__
查看全部 -
導入模塊math后為何引用sqrt時還要加math: math是包含各種函數或方法的模塊,若前面是import math, 引用模塊中的函數就要用格式math.sqrt()。 若想省略前面的模塊名,在前面導入時用from math import *
記得調用數學函數時應該加入:import math
然后平方根的三種表達方法別忘記。。。
第一種調用math函數庫 ?? math.sqrt
第二種調用內置函數庫 ? ?? pow(x,0.5)
第三種直接利用** ? ? ? ? ?? x**0.5
查看全部 -
任務
上一節的@performance只能打印秒,請給?@performace?增加一個參數,允許傳入's'或'ms':
@performance('ms') def?factorial(n): ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1))
?不會了怎么辦
要實現帶參數的@performance,就需要實現:
my_func = performance('ms')(my_func)
需要3層嵌套的decorator來實現。
參考代碼:
import?time def?performance(unit): ????def?perf_decorator(f): ????????def?wrapper(*args,?**kw): ????????????t1?=?time.time() ????????????r?=?f(*args,?**kw) ????????????t2?=?time.time() ????????????t?=?(t2?-?t1)?*?1000?if?unit=='ms'?else?(t2?-?t1) ????????????print?'call?%s()?in?%f?%s'?%?(f.__name__,?t,?unit) ????????????return?r ????????return?wrapper ????return?perf_decorator @performance('ms') def?factorial(n): ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1)) print?factorial(10)
查看全部 -
任務
請編寫一個@performance,它可以打印出函數調用的時間。
?不會了怎么辦
計算函數調用的時間可以記錄調用前后的當前時間戳,然后計算兩個時間戳的差。
參考代碼:
import?time def?performance(f): ????def?fn(*args,?**kw): ????????t1?=?time.time() ????????r?=?f(*args,?**kw) ????????t2?=?time.time() ????????print?'call?%s()?in?%fs'?%?(f.__name__,?(t2?-?t1)) ????????return?r ????return?fn @performance def?factorial(n): ????return?reduce(lambda?x,y:?x*y,?range(1,?n+1)) print?factorial(10)
查看全部 -
任務
利用匿名函數簡化以下代碼:
def?is_not_empty(s): ????return?s?and?len(s.strip())?>?0 filter(is_not_empty,?['test',?None,?'',?'str',?'??',?'END'])
?不會了怎么辦
定義匿名函數時,沒有return關鍵字,且表達式的值就是函數返回值。
參考代碼:
print?filter(lambda?s:?s?and?len(s.strip())>0,?['test',?None,?'',?'str',?'??',?'END'])
查看全部 -
#?希望一次返回3個函數,分別計算1x1,2x2,3x3:def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????def?f(): ?????????????return?i*i ????????fs.append(f) ????return?fs f1,?f2,?f3?=?count()
你可能認為調用f1(),f2()和f3()結果應該是1,4,9,但實際結果全部都是?9(請自己動手驗證)。
原因就是當count()函數返回了3個函數時,這3個函數所引用的變量 i?的值已經變成了3。由于f1、f2、f3并沒有被調用,所以,此時他們并未計算 i*i,當 f1 被調用時:
>>>?f1() 9?????#?因為f1現在才計算i*i,但現在i的值已經變為3
因此,返回函數不要引用任何循環變量,或者后續會發生變化的變量。
任務
返回閉包不能引用循環變量,請改寫count()函數,讓它正確返回能計算1x1、2x2、3x3的函數。
?不會了怎么辦
考察下面的函數?f:
def?f(j): ????def?g(): ????????return?j*j ????return?g
它可以正確地返回一個閉包g,g所引用的變量j不是循環變量,因此將正常執行。
在count函數的循環內部,如果借助f函數,就可以避免引用循環變量i。
參考代碼:
def?count(): ????fs?=?[] ????for?i?in?range(1,?4): ????????def?f(j): ????????????def?g(): ????????????????return?j*j ????????????return?g ????????r?=?f(i) ????????fs.append(r) ????return?fs f1,?f2,?f3?=?count() print?f1(),?f2(),?f3()
查看全部 -
reduce()函數
可以定義一個函數,該函數為一組規則,然后通過reduce()函數來調用這個規則,去處理list
參數:reduce可以接收三個參數,第一個為處理函數 處理函數接受兩個參數 第二個參數為待處理的數據,是一個list,可以是 任意數據類型的list 第三個參數是可選的,是一個初始值
def?f(x,y)?: ???return?規則 ?print(reduce(規則函數名,list,[初始值]))
查看全部 -
這里的S[0].upper,意思不是把S這個列表里的第一個值大寫嗎?就是把['adam', 'LISA', 'barT']中的adam全部大寫? --------------------------------------------? 不是的,map函數中接受的函數是作用在list中的每一個元素上,所以map函數中接受的f的自變量是list中的每一個元素,因此def時候的format_name(s)的s指代的是list中的每一個元素,也就是字符串,而不是整個list。s[0]就是s字符串的第一個字母。
查看全部 -
關鍵字lambda?表示匿名函數,冒號前面的?x 表示函數參數。
匿名函數有個限制,就是只能有一個表達式,不寫return,返回值就是該表達式的結果。
查看全部 -
實例賦值:xiaoming.name = '';實例的屬性可以像普通變量一樣進行操作。
查看全部 -
類關鍵字:class,類名以大寫字母開頭緊接著(object)表示該類是從哪個類繼承下來的;創建實例用類名+()
eg:
class? Person(object):
????pass
查看全部 -
類(class)用于定義抽象類型,實例根據類的定義被創建出來
查看全部 -
試用某一新特性通過導入__future__模塊的某些功能來實現。
新版本與舊版本不兼容在舊版本中添加到_future_中便于舊代碼在舊版本中測試
查看全部 -
導入動態模塊:
try:
????from cStringIO? import? StringIO
except? ImportError:
????from StringIO import StringIO
try的作用是捕獲錯誤,并在捕獲到指定錯誤時執行except語句。
import...as...可以動態導入不同名稱的模塊
查看全部 -
導入模塊:import??
導入模塊中的某幾個函數: form math import pow,sin
導入函數防止沖突 給函數重命名: from math import log as logger? 此時log函數變成logger
查看全部
舉報