Python 2.X版本中闭包是怎么实现的?,python2.x,大家怎么用Python
Python 2.X版本中闭包是怎么实现的?,python2.x,大家怎么用Python
大家怎么用Python 2.x 实现闭包?
简单的:
def func(a): def inner(b): return a+b return innerc = 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_scaledef get_img(**args): return args
问题的主要原因在于:
在Python中string, int, float, tuple这些基本类型都是immutable的。即使是如int, float这种"基础"类型,若值不同,会赋值给另外一个PyObject,这点与lua, javascript等语言不一样。
你可以在Python REPL中测试这几行:
i = 1id(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 innerc1 = counter()c2 = counter()print c1()print c1()print c2()print c2()
Python 的在网上搜了下, 感觉都不对啊.
lua版的 :
function counter()local i = 0return function() i = i + 1 return i endend
> c1 = counter()> print(c1())1> print(c1())2> c2 = counter()> print(c2())1> print(c2())2> print(c2())3
Python也有人用list实现.
编橙之家文章,
相关内容
- Python遍历U盘目录转义符问题求助,python转义,用Python遍
- celery python如何解决worker和client代码同步问题,celerywo
- Sublime Text调用python原理机制是如何?,sublimepython,假设
- 如何将js代码转化成python代码求方法,jspython,// 先加载
- Python存储多面体3D模型具体方法怎么做到,python多面体
- Flask可以将渲染后模板生成HTML文件吗?怎样写,flask模板
- Python下bytearray()函数应用环境是什么,pythonbytearray,Pyt
- 怎么样来更好的学习Python前后端通信连接知识?,pytho
- Flask操作结束后,要回到触发请求页面需要怎么设置,
- 这段python源码中if语句如何理解,python源码if语句,prin
评论关闭