码迷,mamicode.com
首页 > 编程语言 > 详细

Python 闭包

时间:2017-03-18 23:55:27      阅读:310      评论:0      收藏:0      [点我收藏+]

标签:bsp   ext   代码   匿名   ora   版本   变化   ati   div   

闭包

1、注意:返回的函数内部不要使用后续会发生变化的变量。

def f():
    gs = []
    for k in range(1, 4):
        def g(i):
            return i + k
        gs.append(g)
    return gs

例如这段代码感觉上应该返回三个函数分别return i+1、return i+2、return i+3(i为新函数参数),但事实却是得到了三个return i+3。

>>> from test import f
>>> g1, g2, g3 = f()
>>> g1(0)
3
>>> g2(0)
3
>>> g3(0)
3

 

2、如果一定要得到return i+1、return i+2、return i+3这三个函数怎么办?
可以这样

def f():
    gs = []
    gs.append(lambda x : x + 1)
    gs.append(lambda x : x + 2)
    gs.append(lambda x : x + 3)
    return gs

但是要得到return i + 1 ~ return i + 100就行不通了,这时候可以

def f():
    hs = []
    def g(i):
        def h(j):
            return j + i
        return h
    for k in range(1, 3):
        hs.append(g(k))
    return hs

这段代码可以这样看:f()最终返回一个函数list->hs,那么hs需要append什么呢?append n个reuturn i+n函数。这些函数又怎么得到呢?利用内部的函数返回得到。更清晰的版本:

def f():
    # 返回函数的函数
    def g(i):
        return lambda j : i + j
    # 获取元素为函数的list
    hs = []
    for k in range(1, 5):
        hs.append(g(k))
    return hs

 

匿名函数=lambda

Python 闭包

标签:bsp   ext   代码   匿名   ora   版本   变化   ati   div   

原文地址:http://www.cnblogs.com/xkxf/p/6576379.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!