zoukankan      html  css  js  c++  java
  • 8. 函数-闭包

    一、函数名

    ​ 函数名是⼀个变量, 但它是⼀个特殊的变量, 与括号配合可以执⾏函数的变量。

    1. 函数名的内存地址

    def func():
    	print("呵呵")
    	print(func)
    结果:
    <function func at 0x1101e4ea0>
    

    2. 函数名可以赋值给其他变量

    def func():
        print("呵呵")
        print(func)
    # 把函数当成⼀个变量赋值给另⼀个变量
    a = func
    # 函数调⽤ func()
    a() 
    

    3. 函数名可以当做函数的参数

    def func():
    	print("吃了么")
    def func2(fn):
    	print("我是func2")
    	fn() 
    	print("我是func2")
    # 把函数func当成参数传递给func2的参数fn.
    func2(func) 
    

    4. 函数名可以作为函数的返回值

    def func_1():
    	print("这⾥是函数1")
    def func_2():
    	print("这⾥是函数2")
    	print("这⾥是函数1")
    	return func_2
    # 执⾏函数1. 函数1返回的是函数2, 这时fn指向的就是上⾯函数2
    fn = func_1()
    # 执⾏上⾯返回的函数
    fn() 	
    

    二、闭包

    1. 定义

    ​ 如果在一个内部函数里,对在外部作用于(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包。

    ​ 闭包(Closure)是词法闭包(Lexical Closure)的简称,是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在,即使已经离开了创造它的环境也不例外。所以,闭包是由函数和与其相关的引用环境组合而成的实体。

    ​ 通俗的讲就是:如果在一个内部函数里,对在外部作用域(但不是在全局作用域)的变量进行引用,那么内部函数就被认为是闭包(closure)。它只不过是个“内层”的函数,由一个名字(变量)来指代,而这个名字(变量)对于“外层”包含它的函数而言,是本地变量。

    ​ 闭包的主要用途:实现装饰器

    2. 闭包运用

    • 闭包函数必须有内嵌函数
    • 内嵌函数需要引用该嵌套函数上一级namespace中的变量
    • 闭包函数必须返回内嵌函数
    (1) 普通闭包
    def func(a, b):
        def line(x):
            return a * x - b
        return line
    
    line = func(2, 3)
    print(line(5))
    
    (2) 修改值闭包
    def func(a, b):
        def line(x):
            nonlocal a
            a = 3
            return a * x - b
        return line
    
    line = func(2, 3)
    print(line(5))
    
  • 相关阅读:
    centos安装nginx
    Vue练习十一:02_05_函数传参改变Div任意属性的值
    Vue练习十:02_04_弹出层
    Vue练习九:02_03_求数组中所有数字的和
    Vue练习八:02_02_点击div显示内容
    Vue练习七:02_01_百度输入法
    Vue练习六:01_06_记住密码提示框
    Vue练习五:01_05_鼠标移入改变样式鼠标移出恢复
    Vue练习四:01_04_点击将DIV变成红色
    Vue练习三:01_03_函数传参
  • 原文地址:https://www.cnblogs.com/hq82/p/11483338.html
Copyright © 2011-2022 走看看