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

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

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()

 闭包嵌套
时间: 2024-10-08 01:41:12

函数:(函数的名字,闭包)的相关文章

JavaScript函数,作用域以及闭包

JavaScript函数,作用域以及闭包 1. 函数 (1). 函数定义:函数使用function关键字定义,它可以用在函数定义表达式或者函数声明定义. a. 函数的两种定义方式: * function functionName() {} * var functionName = function(){} b. 两种函数定义不同之处 1). 声明提前问题 函数声明语句   :声明与函数体一起提前 函数定义表达式 :声明提前,但是函数体不会提前 请看下面图示:绿色线上面实在js初始加载的时候,查看

Python/函数的嵌套和闭包

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

函数对象/嵌套和闭包函数

一.函数对象 二.函数嵌套 三.闭包函数 一.函数对象 精髓:可以把函数当成变量去用 1.可以赋值 # func=内存地址 def func(): print('from func') f=func # 函数func赋值给变量f print(f,func) # 打印f和func的内存地址,完全相同 f() # 相当于调用了函数func() 输出: <function func at 0x02F434A8> <function func at 0x02F434A8> from fun

C#中的文件路径获取函数和文件名字获取函数小结

1. 获取绝对文件路径 代码如下: System.IO.Path.GetFullPath(string path) string fileName = "myfile.ext"; string path1 = @"mydir"; string path2 = @"\mydir"; string fullPath; fullPath = Path.GetFullPath(path1); fullPath = Path.GetFullPath(fil

函数装饰器和闭包(四)

上一章:函数装饰器和闭包(三) 单分派函数 假设我们现在要开发一个函数,这个函数可以传入一个元素,函数要判断元素的类型,再将其打印出来 from collections.abc import MutableSequence, MutableMapping def print_item(item): if isinstance(item, int): print("int:", item) elif isinstance(item, MutableSequence): print(&qu

print(函数.__closure__) 来判断是不是闭包, 返回cell , 是闭包, 返回None 则不是闭包

print(函数.__closure__) 来判断是不是闭包,  返回cell , 是闭包,       None 则不是闭包 原文地址:https://www.cnblogs.com/jack20181017/p/9893159.html

【Python基础】高阶函数+函数嵌套+闭包 ==装饰器

高阶函数+函数嵌套+闭包 == 装饰器 一 什么是装饰器 二 装饰器需要遵循的原则 三 实现装饰器知识储备 四 高阶函数 五 函数嵌套 六 闭包 七 无参装饰器 八 装饰器应用示例 九 超时装饰器 参考: https://www.cnblogs.com/linhaifeng/articles/6140395.html https://www.cnblogs.com/haiyan123/p/8387769.html 原文地址:https://www.cnblogs.com/XJT2018/p/11

新手,对函数,函数指针,回调函数, 函数指针作为函数的返回值和block的一些见解

很多初学者,学c语言时,看到函数都觉得难,我也是,一开始觉得函数太难了,后来慢慢就理解了 第一:函数 在c语言中最简单的函数一般有四种: 1, 无返回值, 无参数. 2, 无返回值,有参数. 3, 有返回值,无参数. 4, 有返回值,有参数 1, 无返无参  定义方式:      void 函数名(); 一般不怎么用这种形式的函数,可用来输出,打印 void functionOne() { printf("无返回值,无参数"); // 没有返回值不能写return } int main

JavaScript深入理解函数 - 函数的传值

在JavaScript中,由于函数名就是一个变量,所以函数也可以作为值来使用.我们不仅可以像传递参数一样把一个函数传递给另一个函数,还可以将一个函数作为另一个函数的返回值返回. 将函数作为参数传递 由于函数是对象,所以可以直接把函数作为参数来传递.来看下面的例子: //定义一个函数 function say(str){ return "hello "+str; } //调用函数 alert(say("JavaScript")); //返回“hello JavaScr

函数——函数的两种声明方式:函数声明&amp;函数表达式的区别(未完待续。。。)

一.函数声明中函数名是必须的:函数表达式中则是可选的 //函数声明 function sum(a, b) { return a + b; } alert(sum(1, 2)); //函数表达式 /* var s = function sum(a, b) { return a + b; } alert(s(1, 2)); */ var s = function(a, b) { return a + b; } alert(s(1, 2)); //以上两种都可以 二.用函数声明定义的函数,函数可以在函