-
在函数内部定义的函数和外部定义的函数是一样的,只是他们无法被外部访问: 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 文件查看全部
-
调用类属性的时候必须带上类名,格式:类名.属性,不能仅仅写属性啊!而且类属性可以动态修改查看全部
-
变量可以指向函数,此时变量可以当函数使用,如下 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
提交
取消