ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

python notice8 函数名应用和闭包

2019-07-24 11:55:31  阅读:271  来源: 互联网

标签:闭包 func2 func1 函数 python notice8 func print def


一、函数名的应用

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

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

标签:闭包,func2,func1,函数,python,notice8,func,print,def
来源: https://www.cnblogs.com/xiaolu-fan/p/11237046.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有