函数名、闭包、装饰器

1, 函数名的内存地址,print(func)
2, 函数名可以赋值给其他变量
3, 函数名可以当做容器类的元素
4, 函数名可以当做函数的参数.
5, 函数名可以当做函数的返回值.
学名:第一对象
函数名的内存地址:def func():
    print(555)
print(func)  # <function func at 0x00000000003E1E18>

结果:



def func1():
    print(111)
f = func1
f()  # func()


def func():    print(555)def func1():    print(111)def func2():    print(222)def func3():    print(444)
l1 = [func(),func1(),func2(),func3()]for i in l1:    i





 
def func2():
    print(222)
def func3(x):
    x()  # func2()
func3(func2)





def func2():
    print(222)
def func3(x):
    print(a)  # func2()
    return a
a = 3
ret = func3(a)
print(ret)


ef func2():
    print(222)
def func3(x):
    print(a)  # func2()
    return a
a = 3
ret = func3(a)
print(ret)

二 闭包
内层函数,对外层函数(非全局)的变量的引用,叫做闭包

闭包函数:

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

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

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

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

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

 判断闭包的方法
#输出的__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():
    name = ‘alex‘
    def inner():
        print(name)
    inner()
    print(inner.__closure__) # 检测是不是闭包 cell 就是b包
wrapper()

全局的name="alex"不是闭包:



name = ‘alex‘
def wrapper():
    def inner():
        print(name)
    inner()
    print(inner.__closure__)  # 检测是不是闭包 None 就不是b包
wrapper()


闭包:

def wrapper(x):
    def inner():
        print(x)
    inner()
    print(inner.__closure__)  # cell
wrapper(‘alex‘)



 
def wrapper(x):
    def inner():
        print(666)
    inner()
wrapper(‘Alex‘)



def wrapper():
    def inner():
        print(666)
    return inner
# wrapper()  # inner
wrapper()()


闭包的用处:如果说你内存函数是个闭包,python内部有一个机制,遇到闭包,他会在内存中开启一个内存空间,不会随着函数的结束而关闭.
爬虫例子:
from urllib.request import urlopen
print(urlopen(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘).read())
def index(url):
    content = urlopen(url).read()
    def get():
        with open(‘爬虫‘,‘a‘) as f1:
            f1.write(content.decode(‘utf-8‘))
    return get
index(‘http://www.cnblogs.com/jin-xin/articles/8259929.html‘)()






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

f = wrapper()  # func
i = f()   # inner
I()






原文地址:https://www.cnblogs.com/chongdongxiaoyu/p/8406830.html

时间: 2024-11-09 03:06:16

函数名、闭包、装饰器的相关文章

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

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

第四天 内置函数2 随机码 装饰器 迭代器、生成器 递归 冒泡算法 JSON

关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的是f1的return,那么在这种情况下函数f1并未定义return,所以默认返回None 因此li的值应该是none 如果是 li = [11,22,33,44] def f1(arg): arg.append(55) f1(li) print(li) 因为函数传递的参数实际是参数的引用,因此在函数

python 函数名 、闭包 装饰器 day13

1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print(func1) # <function func1 at 0x0000027B7CF1A048> 2,函数名的赋值 def func(): print(666) f = func print(f()) 3,函数名可以作为容器类数据的元素. def f1(): print(111) def f2()

python_day04 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式

本节课重要知识点内容如下: 函数嵌套 名称空间和作用域 闭包 装饰器 迭代器 生成器 列表解析 三元表达式 生成器表达式 1.函数嵌套 函数的嵌套调用:在调用一个函数的过程中,又调用了其他函数函数的嵌套定义:在一个函数的内部,又定义另外一个函数 def bar(): print('from nbar')def foo(): print('from foo') bar()foo()def max2(x,y): if x > y: return x else: return ydef max4(a,

函数嵌套与装饰器

*应用场景,位置参数中代表将多个参数存入元祖,**将关键字参数传入字典 位置参数: 位置形参:必须被传值,一一对应 位置实参:按从左到右的顺序与形参一一对应 关键字参数:按照key=value形式指名道姓的为形参传值,可以完全不按照顺序 1.关键字实参必须在位置参数的后面 2.可以混用位置实参与关键字实参,但不能为同一个形参重复传值 默认参数: 形参有默认值 可变长参数 形参:*args,**kwargs将多余的参数分别封装成元祖与字典 实参:将args kwargs分别打散 什么是命名关键字参

Django视图函数函数之视图装饰器

FBV模式装饰器: 普通函数的装饰器(语法糖@) views.py 1 from django.shortcuts import render 2 3 def wrapper(f): 4 def inner(*args,**kwargs): 5 print("before") 6 ret=f(*args,**kwargs) 7 print("after") 8 return ret 9 return inner 10 11 @wrapper 12 def index

函数名的应用(第一对象) 闭包 装饰器

函数名的应用(第一对象). # 1,直接打印函数名得到的是函数的内存地址 <function func1 at 0x0000000002876B70> # print(func1) #2,函数名可以赋值运算. # def func1(): # print(666) # f1 = func1 # f1() # 3, 函数名可以作为函数的参数. # def func1(): # print(666) # # def func2(x): # x() # print(555) # func2(func

5.初识python装饰器 高阶函数+闭包+函数嵌套=装饰器

一.什么是装饰器? 实际上装饰器就是个函数,这个函数可以为其他函数提供附加的功能. 装饰器在给其他函数添加功能时,不会修改原函数的源代码,不会修改原函数的调用方式. 高阶函数+函数嵌套+闭包 = 装饰器 1.1什么是高阶函数? 1.1.1函数接收的参数,包涵一个函数名. 1.1.2 函数的返回值是一个函数名. 其实这两个条件都很好满足,下面就是一个高阶函数的例子. def test1(): print "hamasaki ayumi" def test2(func): return t

十、闭包函数、函数对象、装饰器

函数对象: 函数是第一类对象 第一类对象: 指可以在执行期创造并作为参数传递给其他函数或存入一个变量的实体 第一类对象所特有的特性为: 可以当容器被存入变量或其他结构 可以被作为参数传递给其他函数 可以被作为函数的返回值 可以在执行期创造,而无需完全在设计期全部写出 即使没有被系结至某一名称,也可以存在 函数.类.模块等所有对象都是第一类的 闭包函数: 函数内定义的函数为内部函数 内部函数包含对外部作用域而非全局作用域的引用 定义闭包函数的基本形式: def 外部函数名(): 内部函数需要的变量

函数对象,函数的嵌套,名称空间与作用域,闭包,装饰器,迭代器,内置函数

一,函数对象 函数对象:函数是第一类对象,即函数可以当做数据传递 1,可以被引用 2,可以做参数的传递 3,返回值可以是函数 4,可以当作容器类型的元素 二,函数嵌套 1,函数的嵌套调用 2,函数的嵌套定义 三,名称空间与作用域 名称空间:存放名字的地方叫名称空间,存放这些值与名字的绑定关系 查看内置名称的两种方法: 三种名称空间 1,内置名称空间:随着python解释器的启动而产生 2,全局名称空间:文件的执行会产生全局名称空间,指的是文件级别定义的名字都会放入该空间 3,局部名称空间:调用函