• Python知识点-lambda、闭包、函数式编程、作用域


    摘要

    闭包中内函数修改外函数局部变量:

    在基本的python语法当中,一个函数可以随意读取全局数据,但是要修改全局数据的时候有两种方法:

    1 global 声明全局变量

    2 全局变量是可变类型数据的时候可以修改

    在闭包内函数也是类似的情况。在内函数中想修改闭包变量(外函数绑定给内函数的局部变量)的时候:

    1 在python3中,可以用nonlocal 关键字声明 一个变量, 表示这个变量不是局部变量空间的变量,需要向上一层变量空间找这个变量。

    2 在python2中,没有nonlocal这个关键字,我们可以把闭包变量改成可变类型数据进行修改,比如列表。

    作用域

     python引用变量的顺序:当前作用域局部变量->外层作用域变量->当前模块中的全局变量->python内置变量

    1、没有块级作用域:代码块里的变量,外部可以调用

    2、局部作用域:例如函数内部作用域

    3、作用域链:变量会由内到外,先去自己作用域去找,没有的话再去上级,直到找不到报错

    4、记住在函数未执行之前,作用域已经形成了,作用域链也生成了

    5、声明全局变量global,如果在局部要对全局变量修改,需要在局部声明该全局变量:

    6、nonlocal关键字用来在函数或其他作用域中使用外层(非全局)变量。

    name = "lzl"
     
    def f1():
        print(name)
     
    def f2():
        name = "eric"
        f1()
     
    f2()
    #输出:lzl

    lambda

    lambda作为一个表达式,定义了一个匿名函数。一般用来创建短小的匿名函数

    lambda 并不会带来程序运行效率的提高,只会使代码更简洁。

    lambda 形式可以从外部作用域引用变量

    lambda简化了函数定义的书写形式,使代码更为简洁。对于不熟悉的人降低了代码的可读性

    匿名函数:没有名称的函数,由编译器指定名称并分配空间,通常直接作为参数传递

    例子

    >>> g = lambda x:x+1
    >>> g(1)
    2

    #上例的代码x为入口参数,x+1为函数体

    面试题:

    #新浪lambada 面试题
     
    li = [lambda :x for x in range(10)]
     
    res = li[0]()
    print(res)
     
    #输出:9

    对比上例

    >>> x = [(lambda x=x: x) for x in range(3)]
    >>> x[0]()
    0

    闭包

    “An object is data with functions. A closure is a function with data.” — John D. Cook

    ⭐️深入理解python中闭包,闭包的实质

    https://www.cnblogs.com/Lin-Yi/p/7305364.html

    到底什么是闭包

    https://zhuanlan.zhihu.com/p/21346046

    >>> def counter():
        count = 0
        def inner():
            nonlocal count
            count += 1 
            return count
        return inner
    
    >>> demo = counter()
    >>> demo()
    1
    >>> demo()
    2

    函数式编程

    函数式编程是使用一系列函数去解决问题,按照一般编程思维,面对问题时我们的思考方式是“怎么干”,而函数函数式编程的思考方式是我要“干什么”。 至于函数式

    python函数式编程

    https://www.cnblogs.com/fnng/p/3699893.html

    匿名函数:lambda x: x + 1 

    >>> list(map(lambda x: x + 1, [1, 2, 3]))
    [2, 3, 4]

    装饰器

    深入理解python中的闭包和装饰器

    装饰器的存在主要是为了不修改原函数的代码,也不修改其他调用这个函数的代码,就能实现功能的拓展。

  • 相关阅读:
    Electron dialog 对话框的使用
    Electron BrowserView 的使用
    自动化测试相关
    使用chrome开发者工具中的performance面板解决性能瓶颈
    Electron window.open 函数 和 Browser-window-proxy 对象的使用
    Electron webview 标签
    Electron File对象
    Electron 进程
    JAVA日报
    JAVA日报
  • 原文地址:https://www.cnblogs.com/liyonghua/p/7777908.html
Copyright © 2020-2023  润新知