美文网首页工作生活
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

相关文章

  • 高级语言特性

    闭包 闭包的概念、形式与应用 Lambda表达式 Lambda表达式让Spark编程更容易 OOP AOP 函数编...

  • Kotlin函数式编程 (3)✔️闭包与捕获变量

    闭包定义Java 与 Koltin 中 Lambda 捕获局部变量区别闭包捕获的变量可以脱离原始作用域而存在 一、...

  • Java中被阉割的闭包在Kotlin中的表现如何?

    1 闭包概述 闭包,Clousure。在Java中表现为Lambda表达式,在Koltin中表现为函数类型变量(或...

  • Kotlin学习之高阶函数和Lambda表达式:闭包

    Kotlin学习之高阶函数和Lambda表达式:闭包 一、闭包 闭包指Lambda表达式和匿名函数外部定义的局部变...

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

    闭包 廖雪峰python教程 返回的函数引用了变量i,但它并非立刻执行。等到3个函数都返回时,它们所引用的变量i已...

  • Java8 新特性快速入门

    Lambda表达式(闭包)   Lambda(λ,希腊数字中的第十一个数字,由于λ演算式的存在,它也代表闭包)表达...

  • python学习-零碎

    pickle / 函数文档 / 收集参数 / 在函数内定义全局变量 / 闭包 / lambda表达式 / filt...

  • Java8 新特性

    一、Lambda表达式 Lambda表示式也称为闭包,允许把函数作为参数传递进方法中,使用Lambda可以使表达式...

  • C++ ---- 闭包

    什么是闭包 能够读取其他函数内部变量的函数。 lambda表达式实现闭包 使用bind函数 有兴趣可看这个知乎,传...

  • Java8 简介

    Lambda表达式 Lambda表达式又称闭包,它允许把函数作为方法的参数传入方法中。语法如下:(参数)-> 表达...

网友评论

    本文标题:python lambda表达式与闭包中的变量

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