-
在函數內部定義的函數和外部定義的函數是一樣的,只是他們無法被外部訪問: def g(): print 'g()...' def f(): print 'f()...' return g 將 g 的定義移入函數 f 內部,防止其他代碼調用 g: def f(): print 'f()...' def g(): print 'g()...' return g 但是,考察上一小節定義的 calc_sum 函數: def calc_sum(lst): def lazy_sum(): return sum(lst) return lazy_sum 注意: 發現沒法把 lazy_sum 移到 calc_sum 的外部,因為它引用了 calc_sum 的參數 lst。 像這種內層函數引用了外層函數的變量(參數也算變量),然后返回內層函數的情況,稱為閉包(Closure)。 閉包的特點是返回的函數還引用了外層函數的局部變量,所以,要正確使用閉包,就要確保引用的局部變量在函數返回后不能變。舉例如下: # 希望一次返回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 因此,返回函數不要引用任何循環變量,或者后續會發生變化的變量。查看全部
-
這題到處充滿著函數通過一個變量傳給另一個函數的意思。查看全部
-
閉包這個思路雖然很繞,但的確是個好思路,返回函數不要引用任何循環變量,或者后續會發生變化的變量。對不變的變量引用或外部不能訪問的函數。查看全部
-
裝飾器的作用查看全部
-
def prod(x, y): return x*y print reduce(prod, [2, 4, 5, 7, 12])查看全部
-
def format_name(s): return s.lower()[0].upper()+s.lower()[1::] print map(format_name, ['adam', 'LISA', 'barT']) def format_name(s): return s.capitalize() print map(format_name, ['adam', 'LISA', 'barT'])查看全部
-
import math def add(x, y, f): return f(x) + f(y) print add(25, 9, math.sqrt)查看全部
-
.不能離線哦查看全部
-
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)查看全部
-
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查看全部
-
當新版本的一個特性與舊版本不兼容時,該特性將會在舊版本中添加到__future__中,以便舊的代碼能在舊版本中測試新特性。查看全部
-
每個包又個_init_.py 文件查看全部
-
調用類屬性的時候必須帶上類名,格式:類名.屬性,不能僅僅寫屬性?。《翌悓傩钥梢詣討B修改查看全部
-
變量可以指向函數,此時變量可以當函數使用,如下 f=abs f(-20) 函數名是指向函數的變量 abs=len #此時abs的作用變為len #例子 def add(x,y,f) return f(x,y,f) #調用并具體化f函數 add(1,-2,abs)查看全部
-
print filter(lambda s: s and len(s.strip())>0,['test', None, '', 'str', ' ', 'END'] )查看全部
舉報
0/150
提交
取消