码迷,mamicode.com
首页 > 编程语言 > 详细

Python/函数的嵌套和闭包

时间:2017-04-24 15:33:18      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:解释器   python   foo   输出   限制   --   http   cti   传递   

Python基础--函数的嵌套和闭包

一、名称空间和作用域

    名称空间:Python所有有关命名的操作都是在操作名称空间,例如变量名,函数名
    1、内置名称空间:Python解释器提供好的功能,解释器启动跟着一起启动,是全局作用域
    2、全局名称空间:Python中顶行写的,不在函数内部定义的,都是全局名称空间,在运行的时候会产生名称空间,是全局作用域
    3、局部名称空间:在一个小范围定义,只能当前范围及其子空间内运行,例如在函数内部定义的,是局部作用域

二、函数的嵌套

1、函数的嵌套调用
2、函数的嵌套定义
x = 1111111111111111
def f1():
    #x=1
    print(‘------>f1 ‘,x)
    def f2():
        #x = 2
        print(‘---->f2 ‘,x)
        def f3():
            x=3
            print(‘-->f3 ‘,x)
        f3()     
    f2()
f1()

三、函数的使用

1、函数可以被当做变量赋值
def foo():
    print("foo")
print(foo)          #打印foo的内存地址空间,函数的名字在不带小括号时表示的是函数的内存地址
f=foo               #把foo的内存地址空间做值赋值给f变量
print(f)            #打印f,起始就是打印foo的内存地址空间
f()                 #f()事实上就是执行foo函数,等同于foo()


打印结果为
<function foo at 0x0000000000B91378>    #print(foo)的结果
<function foo at 0x0000000000B91378>    #print(f)的结果
foo                                     #执行f()的结果,实际就是执行foo()的结果

2、函数可以当做参数传递

def foo():
    print("foo")
print(foo)          #打印foo的内存地址空间
f=foo               #把foo的内存地址空间做值赋值给f变量
print(f)            #打印f,起始就是打印foo的内存地址空间
f()                 #f()事实上就是执行foo函数,等同于foo()

def bar(func):
    print(func)     #这个是打印foo()函数的内存地址
    func()          #func是foo的内存地址,加()实际就是执行foo()函数
    return func
f = bar(foo)        #这个是获取bar的返回值
print(f)            #打印f,就是打印bar()的返回值,就是foo()的内存地址,和print(func)相同
f()                 #f是bar

def bar(func):
    print(func)

bar(foo())      #这个是先执行foo()行数,执行函数里的代码,先打印foo,然后把foo()的返回值作为bar()函数的实参传递给bar,foo()没有返回值,所以是None
                #结果就是先输出一个  "foo"     然后bar(None),把none传递给bar()函数,打印No

四、闭包:内部函数的代码包含对外部作用域的引用,但一定不是对全局作用域的引用,闭包函数一定有__closure__方法

x=1
def f1():
    x=2
    y=3
    def f2():
        print(x)
        y
    return f2
f=f1()                  #f是f2的内存地址
f()                     #f()就是f2(),可以保证f2()可以在任何位置执行,而不受作用域的限制
print(f.__closure__)    #打印结果是元组,元组个数代表的是闭包所引用的上次函数的元素个数
print(f.__closure__[0]) #结果是元组,可以使用索引的方式查看
print(f.__closure__[0].cell_contents)   #查看指定元组所对应的应用上层参数的值
def init(func):
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
    
    

Python/函数的嵌套和闭包

标签:解释器   python   foo   输出   限制   --   http   cti   传递   

原文地址:http://www.cnblogs.com/guobaoyuan/p/6756763.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!