大家怎么用Python 2.x 实现闭包?
简单的:def func(a):
def inner(b):
return a+b
return inner
c = func(5)
print c(4)
这个说明不了问题,给你个真的:def filter_scale(func):
def wrapper(**args):
if args["img_url"] == None:
return func(**args)
v = float(args["height"])/float(args["width"])
if v >=1.3 and v <= 1.6:
return func(**args)
else:
return func(img_url=None)
return wrapper
配合装饰器:@filter_size
@filter_scale
def get_img(**args):
return args
问题的主要原因在于:
在Python中string, int, float, tuple这些基本类型都是immutable的。即使是如int, float这种"基础"类型,若值不同,会赋值给另外一个PyObject,这点与lua, javascript等语言不一样。
你可以在Python REPL中测试这几行:i = 1
id(i)
i = 2 # 改变i的值
id(i) # 注意两个id不同
这就是为什么需要使用list, dict的原因(class, function本身也是dict,可以利用上来)。
就你的例子来说,也可以这样写:def counter():
i = 0
def inner():
inner.i += 1
return inner.i
inner.i = i
return inner
c1 = counter()
c2 = counter()
print c1()
print c1()
print c2()
print c2()
Python 的在网上搜了下, 感觉都不对啊.
lua版的 :function counter()
local i = 0
return function()
i = i + 1
return i
end
end> c1 = counter()
> print(c1())
1
> print(c1())
2
> c2 = counter()
> print(c2())
1
> print(c2())
2
> print(c2())
3
Python也有人用list实现.
玩蛇网文章,转载请注明出处和文章网址:https://www.iplaypy.com/wenda/wd20392.html
相关文章 Recommend