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

函数:(函数的名字,闭包)

时间:2017-11-05 23:40:33      阅读:259      评论:0      收藏:0      [点我收藏+]

标签:定义   ros   容器   log   div   直接   money   变量   cti   

函数名本质上就是函数的内存地址

1.可以被引用

def func():
    print(in func)

f = func
print(f)

输出:
<function func at 0x0000029C11C93E18>

2.可以被当作容器类型的元素

 

def f1():
    print(f1)
def f2():
    print(f2)
def f3():
    print(f3)
l = [f1,f2,f3]
d = {f1:f1,f2:f2,f3:f3}
#调用
l[0]()
d[f2]()

输出:
f1
f2

3.可以当作函数的参数和返回值

*不明白?那就记住一句话,就当普通变量用

def func():
    print(in func)
    return 10

def func2(arg):
    arg()
    return arg

f = func2(func)
f()

输出:
in func
in func

第一类对象的概念:
函数名可以赋值
可以作为一个数据结构的元素
可以作为一个函数的参数
可以作为一个函数的返回值

 

闭包

def func():
    name = eva
    def inner():
        print(name)

闭包函数:

内部函数包含对外部作用域而非全剧作用域名字的引用,该内部函数称为闭包函数

#函数内部定义的函数称为内部函数

 

由于有了作用域的关系,我们就不能拿到函数内部的变量和函数了。如果我们就是想拿怎么办呢?返回呀!

我们都知道函数内的变量我们要想在函数外部用,可以直接返回这个变量,那么如果我们想在函数外部调用函数内部的函数呢?

是不是直接就把这个函数的名字返回就好了?

这才是闭包函数最常用的用法

def func():
    name = eva
    def inner():
        print(name)
    return inner

f = func()
f()

输出:
eva

判断闭包函数的方法__closure__

 

#输出的__closure__有cell元素 :是闭包函数
def func():
    name = eva
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f = func()
f()

#输出的__closure__为None :不是闭包函数
name = egon
def func2():
    def inner():
        print(name)
    print(inner.__closure__)
    return inner

f2 = func2()
f2()

闭包嵌套:

def wrapper():
    money = 1000
    def func():
        name = eva
        def inner():
            print(name,money)
        return inner
    return func

f = wrapper()
i = f()
i()

 闭包嵌套

 

函数:(函数的名字,闭包)

标签:定义   ros   容器   log   div   直接   money   变量   cti   

原文地址:http://www.cnblogs.com/biluo/p/7789131.html

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