zoukankan      html  css  js  c++  java
  • python notice8 函数名应用和闭包

    一、函数名的应用

      函数名是一个特殊的变量,函数名配合括号(函数名())可以执行函数。

      1.函数名的内存地址。

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

      2.函数名可以赋值给其他变量,该变量配合括号即可调用函数。

    def func():
        print("呵呵")
    a = func     
    a()  # 相当于调用func()

      3.可以作为list的元素,for循环调用。

    def func1():
        print("你好")
    def func2():
        print("我好")
    def func3():
        print("他好")
    lst = [func1,func2,func3]
    for el in lst:
        el()

      4.函数名可以作为函数的参数。

    def func1():
        print("小黑人")    
    def func2(fn):    #func1作为func2的参数
        fn() 
    func2(func1) 

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

    def func_1():
        print("函数1")
        def func_2():
            print("函数2")
        return func_2
    fn = func_1()    #func1执行完毕后返回func2,赋值给fn。
    fn()    #fn配合括号即可执行func2函数,这样就可以在函数外面调用内部函数。

    二、闭包

      闭包就是内层函数,对外层函数(非全局)变量的引用。(内存函数对外层函数局部变量的访问)

    def func1():
        name = "小黑人"
        def func2():
            print(name) # 闭包,func2引用了func1中的变量。
        func2()
    func1()
    结果:
    小黑人 

      可以使用_ _closure_ _监测函数是否为闭包,返回cell就是闭包,返回None就不是闭包。

    def func1():
        name = "小黑人"
        def func2():
            print(name) # 闭包
        func2()
        print(func2.__closure__)
    func1()
    结果:
    小黑人
    (<cell at 0x0000025B7957D798: str object at 0x0000025B7955BE10>,)  

      注:print(func2.__closure__)一定要写函数内部,即func1函数里面,如果写到外面会报错。

    闭包优点:

    1.安全,别的用户不可以更改。如定义一个全局变量,在函数中使用global即可修改这个全局变量,不安全。 

    2.外层函数中的变量常驻内存,方便函数外部调用。同时可以避免函数多次调用时的加载时间,如爬虫信息量大时。

  • 相关阅读:
    回到顶部
    angularjs 复选框 单选框
    关于angularjs的ng-repeat指令
    JS字符串对象
    JS的控制语句与异常
    JS的运算符
    JS的引入方式和基础规范
    z-index及透明度opacity,利用overflow设置头像
    css的定位
    css的float属性及清除浮动
  • 原文地址:https://www.cnblogs.com/xiaolu-fan/p/11237046.html
Copyright © 2011-2022 走看看