python lambda表达式与闭包中的变量

阿里云双11来了!从本博客参与阿里云,服务器最低只要86元/年!

闭包

廖雪峰python教程

def count():
    fs = []
    for i in range(1, 4):
        def f():
             return i*i
        fs.append(f)
    return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已经变成了3,因此最终结果为9。

def count():
    def f(j):
        def g():
            return j*j
        return g
    fs = []
    for i in range(1, 4):
        fs.append(f(i)) # f(i)立刻被执行,因此i的当前值被传入f()
    return fs

再创建一个函数,用该函数的参数绑定循环变量当前的值,无论该循环变量后续如何更改,已绑定到函数参数的值不变

除此之外,发现还可以这样:

def count():
    fs = []
    for i in range(1, 4):
        def f(i = i):
             return i*i # 这里的i可以改成a(a=i, a*a),此时这个函数用到的是局部变量a,在for循环时值已经被定义为了等于当前的i(1,2,3)
        fs.append(f)
    return fs
f1, f2, f3 = count()
>>> f1()
9
>>> f2()
9
>>> f3()
9

lambda

输出1000内的素数
廖雪峰python教程——filter里面的一条评论



然后也可以看看上面提到的链接
最终的代码如下

def _odd_iter():
    n = 1
    while True:
        n = n + 2
        yield n
def _not_divisible(n):
    return lambda x: x % n > 0
def primes():
    yield 2
    it = _odd_iter() # 初始序列
    while True:
        n = next(it) # 返回序列的第一个数
        yield n
        it = filter(_not_divisible(n), it) # 构造新序列
        # it = filter(lambda x: x % n > 0 ,it) 错误
        # it = filter(lambda x, n=n: x % n > 0 ,it) 正确
'''
# 如果改成
def test(n, it):
    return filter(lambda x: x % n > 0 ,it)
it = test(n, it)
# 也是正确的,因为涉及到了传参,所以都是“当时”的n值,
'''
# 打印1000以内的素数:
for n in primes():
    if n < 1000:
        print(n)
    else:
        break

你或许想:《去原作者写文章的地方

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
Python
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论