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

  • 相关阅读:
    sublime开启vim模式
    git命令行界面
    搬进Github
    【POJ 2886】Who Gets the Most Candies?
    【UVA 1451】Average
    【CodeForces 625A】Guest From the Past
    【ZOJ 3480】Duck Typing
    【POJ 3320】Jessica's Reading Problemc(尺取法)
    【HDU 1445】Ride to School
    【HDU 5578】Friendship of Frog
  • 原文地址:https://www.cnblogs.com/xiaolu-fan/p/11237046.html
Copyright © 2011-2022 走看看