美文网首页
函数(2)--闭包

函数(2)--闭包

作者: 小懒额 | 来源:发表于2018-05-02 22:36 被阅读0次
第15条:了解如何在闭包里使用外围作用域中的变量

闭包在 python 中不是很好理解的内容,还是通过简单的例子逐步认识。

1.闭包

如果有一份列表,其中的元素都是数字,现在要对其排序,但排序时,要把出现在某个群组内的数字,放在群组外的那些数字之前。

def sort_priority(values, group):
    def helper(x):
        if x in group:
            return (0, x)
        return (1, x)
    values.sort(key=helper)


numbers = [1, 5, 2, 7, 6, 4, 8, 3, 9]
group = {2, 3, 5, 7}
sort_priority(numbers, group)
print(numbers)
>>>
[2, 3, 5, 7, 1, 4, 6, 8, 9]

这里我们使用闭包实现了对列表的排序。之所以这里可以这样去实现,原因如下:

  • Python支持闭包:闭包时一种定义在某个作用域中的函数,这种函数引用了那个作用域里面的变量。
    这里 helper之所以能够访问 group 参数,是因为它是闭包。
  • Python 的函数是一级对象,我们可以直接引用函数,把函数赋给变量或者当成参数传递给其他函数。
    这里把 helper 函数,传给 sort 方法的 key 参数。
  • Python 使用特殊的规则来比较两个元组(也可以比较两个列表)。首先比较各元组中下标为 0 的对应的元素,如果相等,再比较下标为 1 对应的元素,如果还是相等,就比较下标为 2 对应的元素,以此类推。
2.作用域

在表达式中引用变量时,Python 解释器按如下顺序遍历各作用域,
1)当前函数的作用域。
2)任何外围作用域。
3)包含当前代码的外围的作用域。
4)内置作用域。
如果这些地方都没有变量的定义,就会抛出 NameError 异常。

3.获取闭包内的数据

类似于在局部作用域获取全局变量,我们也可以在闭包中修改上一层作用域的变量。在 Python3 中,可以使用 nonlocal 关键字来完成。但是在 Python2 中没有这个关键字,只能使用闭包中使变量未定义的手段来实现到上一层作用域中查找该变量,这还是利用了 python 的作用域遍历顺序。

相关文章

  • JS-闭包

    一、闭包简介1、函数内部的函数可以生成闭包2、闭包的应用:需要多个内部变量值3、闭包弊端闭包:会倒致函数运行结束后...

  • 复习四

    1,什么是闭包? 解:函数的嵌套就是闭包 内部函数可以引用外部函数的变量. 2,用闭包做什么? 解:用闭包存循...

  • 2019-08-05

    闭包 函数 A 返回了一个函数 B,并且函数 B 中使用了函数 A 的变量,函数 B 就被称为闭包。 闭包 2.使...

  • 2019-02-22js_06

    函数2 闭包

  • PHP新特性之闭包、匿名函数

    闭包 闭包是什么? 1).闭包和匿名函数在PHP5.3中被引入。2).闭包是指在创建时封装函数周围状态的函数,即使...

  • 闭包

    闭包 闭包就是函数里面有函数,也可以叫函数的嵌套 闭包的用途 1.存索引 2.私有计数器

  • 封闭函数和闭包

    闭包 闭包就是函数里面由函数,也可以交函数的嵌套 闭包的用途 1.存索引 2.私有计数器

  • JS高级学习:函数

    案例 函数作为返回值 案例2: 闭包 闭包的优缺点:缓存数据 函数模式的闭包:在一个函数中有一个函数 对象模式的闭...

  • js 闭包 字符串 定时器

    js闭包 闭包的三大特点为: 1、函数嵌套函数2、内部函数可以访问外部函数的变量3、参数和变量不会被回收。闭包的作...

  • js 闭包 字符串 定时器

    js闭包 闭包的三大特点为: 1、函数嵌套函数2、内部函数可以访问外部函数的变量3、参数和变量不会被回收。闭包的作...

网友评论

      本文标题:函数(2)--闭包

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