美文网首页工作生活
python lambda表达式与闭包中的变量

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

作者: 昵称不能全是数字 | 来源:发表于2019-07-04 14:57 被阅读0次

    闭包

    廖雪峰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 lambda表达式与闭包中的变量

        本文链接:https://www.haomeiwen.com/subject/jjbchctx.html