码迷,mamicode.com
首页 > 其他好文 > 详细

函数对象、函数的嵌套、名称空间、函数的作用域、闭包

时间:2017-04-23 14:26:21      阅读:182      评论:0      收藏:0      [点我收藏+]

标签:容器   参数   而不是   bar   line   delete   嵌套   域名   名称空间   

函数对象

def foo():
print(‘foo‘)
函数可以被赋值
f=foo
print(f) #结果是一个内存地址
f() #内存地址加()内运行函数
把函数当成参数传递
def bar(func):
print(func)
func()

bar(foo)
把函数当成返回值
def bar(func):
print(func)
return func

f=bar(foo)
f()
把函数当做容器类型的元素去用
def add():
print(‘=============>function add‘)
def search():
print(‘=============>function search‘)
def delete():
print(‘=============>function delete‘)
def change():
print(‘=============>function change‘)
cmd_dic={
‘search‘:search,
‘add‘:add,
‘delete‘:delete,
‘change‘:change,
}
cmd_dic[“change”]()#调用函数 

函数的嵌套

嵌套定义
def f1():
print(‘------>f1 ‘,x)
def f2():
print(‘---->f2 ‘,x)
def f3():
print(‘-->f3 ‘,x)
f3()
f2()

f1()

名称空间

内置名称空间
全局名称空间
局部名称空间
print(globals())#查看全局名称空间
print(locals())#查看局部名称空间

函数的作用域

内置名称空间、全局名称空间是全局作用域
局部名称空间是局部作用域
!!!先定义后使用
  
def foo():
    print(from foo)
    bar()

foo()   #此刻调用foo()会报错,调用时内存中还没有bar()
def bar():
    print(from bar)

闭包

闭包:首先必须是内部定义的函数,该函数包含对外部作用域而不是全局作用域名字的引用

def f1(x):
x=1000
def f2():
print(x)
return f2
f=f1() #结果是内部的f2的内存地址
f=f1(10) #f1传值也能成闭包
f()
print(f.__closure__) #闭包对外部作用域引用的数量
print(f.__closure__[0].cell_contents) #闭包对外部作用域引用的第一个值

 

函数对象、函数的嵌套、名称空间、函数的作用域、闭包

标签:容器   参数   而不是   bar   line   delete   嵌套   域名   名称空间   

原文地址:http://www.cnblogs.com/domestique/p/6752378.html

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