1. 1, 函数名的内存地址,print(func)
  2. 2, 函数名可以赋值给其他变量
  3. 3, 函数名可以当做容器类的元素
  4. 4, 函数名可以当做函数的参数.
  5. 5, 函数名可以当做函数的返回值.
  6. 学名:第一对象
  1. 函数名的内存地址:
    def func():
  2. print(555)
  3. print(func) # <function func at 0x00000000003E1E18>
  4.  
  5. 结果:
  1.  
  1.  
  1. def func1():
  2. print(111)
  3. f = func1
  4. f() # func()
  5.  
  1. def func():
    print(555)
    def func1():
    print(111)
    def func2():
    print(222)
    def func3():
    print(444)
  1. l1 = [func(),func1(),func2(),func3()]
    for i in l1:
    i

  1.  
  1.  
  1.  
  1.  
  1. def func2():
  2. print(222)
  3. def func3(x):
  4. x() # func2()
  5. func3(func2)

  1.  
  1.  
  1. def func2():
  2. print(222)
  3. def func3(x):
  4. print(a) # func2()
  5. return a
  6. a = 3
  7. ret = func3(a)
  8. print(ret)

  1.  
  1. ef func2():
  2. print(222)
  3. def func3(x):
  4. print(a) # func2()
  5. return a
  6. a = 3
  7. ret = func3(a)
  8. print(ret)

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

闭包函数:

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

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

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

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

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

  1.  判断闭包的方法
  1. #输出的__closure__有cell元素 :是闭包函数
  2. def func():
  3. name = 'eva'
  4. def inner():
  5. print(name)
  6. print(inner.__closure__)
  7. return inner
  8.  
  9. f = func()
  10. f()
  11.  
  12. #输出的__closure__为None :不是闭包函数
  13. name = 'egon'
  14. def func2():
  15. def inner():
  16. print(name)
  17. print(inner.__closure__)
  18. return inner
  19.  
  20. f2 = func2()
  21. f2()
  1.  
  1.  
  1. def wrapper():
  2. name = 'alex'
  3. def inner():
  4. print(name)
  5. inner()
  6. print(inner.__closure__) # 检测是不是闭包 cell 就是b包
  7. wrapper()

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

  1.  
  1. name = 'alex'
  2. def wrapper():
  3. def inner():
  4. print(name)
  5. inner()
  6. print(inner.__closure__) # 检测是不是闭包 None 就不是b包
  7. wrapper()

  1.  

闭包:

  1. def wrapper(x):
  2. def inner():
  3. print(x)
  4. inner()
  5. print(inner.__closure__) # cell
  6. wrapper('alex')

  1.  
  1.  
  1. def wrapper(x):
  2. def inner():
  3. print(666)
  4. inner()
  5. wrapper('Alex')

  1.  
  1. def wrapper():
  2. def inner():
  3. print(666)
  4. return inner
  5. # wrapper() # inner
  6. wrapper()()

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

  1.  
  1.  
  1.  
  1. def wrapper():
  2. money = 1000
  3. def func():
  4. name = 'eva'
  5. def inner():
  6. print(name,money)
  7. return inner
  8. return func
  9.  
  10. f = wrapper() # func
  11. i = f() # inner
  12. I()
  13.  

  1.  
  1. 装饰器
  1. import time
  2. def func():
  3. print('嘻嘻更健康')
  4. import time
  5. start_time = time.time()
  6. time.sleep(0.1)
  7. func()
  8. end_time = time.time()
  9. print('----> 执行效率%s'%(end_time - start_time))

  1.  
  1. import time
  2. def func():
  3. print('嘻嘻更健康')
  4. # import time
  5. # start_time = time.time()
  6. # time.sleep(0.1)
  7. # func()
  8. # end_time = time.time()
  9. # print('----> 执行效率%s'%(end_time - start_time))
  10.  
  11. def timmer(f):
  12. start_time = time.time()
  13. time.sleep(0.1)
  14. f()
  15. end_time = time.time()
  16. print('----> 执行效率%s'%(end_time - start_time))
  17. func()
  18. f1 = func # func
  19. func = timmer # timmer
  20. func(f1)

  1.  
  1. import time
  2. def func():
  3. print('嘻嘻更健康')
  4. def timmer(f):
  5. def inner():
  6. start_time = time.time()
  7. time.sleep(0.1)
  8. f()
  9. end_time = time.time()
  10. print('----> 执行效率%s' % (end_time - start_time))
  11. return inner
  12. func = timmer(func) # inner
  13. func() # inner()
  14.  
  15.  
  1.  
  1. import time
  2. def func():
  3. print('嘻嘻更健康')
  4. def timmer(f):
  5. def inner():
  6. start_time = time.time()
  7. time.sleep(0.1)
  8. f()
  9. end_time = time.time()
  10. print('----> 执行效率%s' % (end_time - start_time))
  11. return inner
  12. func = timmer(func) # inner
  13. func() # inner()
  14.  
  1.  
  1. import time
  2. def timmer(f):
  3. def inner():
  4. start_time = time.time()
  5. time.sleep(0.1)
  6. f()
  7. end_time = time.time()
  8. print('----> 执行效率%s' % (end_time - start_time))
  9. return inner
  10. @timmer # func = timmer(func)
  11. def func():
  12. print('嘻嘻更健康')
  13. func() # inner()
  14.  
  1.  
  1. 带参数的装饰器
  1. import time
  2. def timmer(f):
  3. def inner(*args,**kwargs):
  4. start_time = time.time()
  5. time.sleep(0.1)
  6. f(*args,**kwargs)
  7. end_time = time.time()
  8. print('----> 执行效率%s' % (end_time - start_time))
  9. return inner
  10.  
  11. @timmer # func = timmer(func)
  12. def func(a):
  13. print('%s嘻嘻更健康'%a)
  14. @timmer # func1 = timmer(func1)
  15. def func1(a,b):
  16. print('%s和%s嘻嘻更健康' %(a,b))
  17. func('萌哥') #
  18. func1('萌哥','杀毒软件')
  19. def shouye():
  20. pass
  21. def riji():
  22. pass
  23. def wenzhang():
  24. pass
  25.  
  26.  
  1.  
  1. 带返回值的装饰器
  1. import time
  2. def timmer(f):
  3. def inner(*args,**kwargs):
  4. start_time = time.time()
  5. time.sleep(0.1)
  6. ret = f(*args,**kwargs) #
  7. end_time = time.time()
  8. print('----> 执行效率%s' % (end_time - start_time))
  9. return ret
  10. return inner
  11.  
  12. @timmer # func = timmer(func)
  13. def func(a):
  14. return 222
  15. print(func('萌哥'))
  16.  

  1.  
  1. import time
  2. def timmer(f):
  3. def inner(*args,**kwargs):
  4. start_time = time.time()
  5. time.sleep(0.1)
  6. ret = f(*args,**kwargs) #
  7. end_time = time.time()
  8. print('----> 执行效率%s' % (end_time - start_time))
  9. return ret
  10. return inner
  11.  
  12. @timmer # func = timmer(func)
  13. def func(a):
  14. return 222
  15. print(func('萌哥'))

  1.  
  1.  
  1. 通用装饰器
  2. def wrapper(func):
  3. def inner(*args,**kwargs):
  4. '''执行函数前操作'''
  5. ret = func(*args,**kwargs)
  6. '''执行函数后的操作'''
  7. return ret
  8. return inner
  9.  
  10. @wrapper
  11. def func():
  12. print(66)
  13. func()
  14.  
  1.  
  1.  
  1.  

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

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

    关于函数的return li = [11,22,33,44] def f1(arg): arg.append(55) li = f1(li) print(li) 因为li = f1(li) 实际赋值的 ...

  2. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

  3. python 函数名 、闭包 装饰器 day13

    1,函数名的使用. 函数名是函数的名字,本质就是变量,特殊的变量.函数名()加括号就是执行此函数. 1,单独打印函数名就是此函数的内存地址. def func1(): print(555) print ...

  4. 函数基础(三) 装饰器\闭包 day 12

    目录 昨日回顾 可变长参数 * ** 函数对象 函数嵌套 名称空间和作用域 今日内容 闭包函数 装饰器 语法糖 装饰器模板 迭代器 昨日回顾 可变长参数 * *形参:接受多余的位置实参 *实参(可迭代 ...

  5. 闭包&装饰器详解

    闭包 先不着急看闭包的定义,让我们从一段示例代码开始.如果将上一个示例稍微修改下: >>> def outer(): ... x = 1 ... def inner(): ... p ...

  6. 【Python】 闭包&装饰器

    python中的函数本身就是对象,所以可以作为参数拿来传递.同时其允许函数的层级嵌套定义,使得灵活性大大增加. 闭包 闭包的定义:将函数的语句块与其运行所需要的环境打包到一起,得到的就是闭包对象.比如 ...

  7. Python闭包装饰器笔记

    Python三大器有迭代器,生成器,装饰器,这三个中使用最多,最重要的就是装饰器.本篇将重要从函数嵌套开始讲起,从而引入闭包,装饰器的各种用法等. python中的一切都是一个对象(函数也是) 1.首 ...

  8. python基础之函数当中的装饰器

    在实际工作当中存在一个开放封闭原则 1.对扩展是开放的 为什么要对扩展开放呢? 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改.所以我们必须允许代码扩展.添加新 ...

  9. Python 进阶_闭包 & 装饰器

    目录 目录 闭包 函数的实质和属性 闭包有什么好处 小结 装饰器 更加深入的看看装饰器的执行过程 带参数的装饰器 装饰器的叠加 小结 装饰器能解决什么问题 小结 闭包 Closure: 如果内层函数引 ...

  10. Python函数篇:装饰器

    装饰器本质上是一个函数,该函数用来处理其他函数,它可以让其他函数在不需要修改代码的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理. ...

随机推荐

  1. 知识点4: 配置echarts折线图和饼图

    折线图 效果图 html <template> <div id="v11-charts3"></div> </template> j ...

  2. 福州大学软件工程W班-助教总结

    背景 福州大学软件工程W班,总人数46人,讲师汪老师. 前期期望 希望自己能够在课程当中起到引导作用,发挥助教最大的用处. 实际执行情况 第一个问题是自动化测试工具,该工具主要是用来测试程序WordC ...

  3. thread == 票池

    public class ThreadDemo2 { public static void main(String[] args){ TicketPool tp = new TicketPool(); ...

  4. javascript 中Array.prototype.sort 函数的用法

    来源:http://www.jb51.net/article/5769.htm JavaScript中对变量的操作都是通过引用方式,而对数组也一样. 前两天想要对一个数组进行复制,一直苦于找不到办法( ...

  5. lcd 显示屏

    1.lcd 接口信号: VSYNC : 一帧新数据的开始信号 HSYNC :一行新数据的开始信号 VCLK   :像素的同步信号 VD[0:23]  :传递数据的信号线 2. LCD  的显示原理 ( ...

  6. HTTP是用来做什么的

    (一)HTTP协议介绍 超文本传输协议(HTTP,HyperText Transfer Protocol)是互联网上应用最为广泛的一种网络协议.所有的WWW文件都必须遵守这个标准.设计HTTP最初的目 ...

  7. mongodb突然出现一些特别奇葩的事

    mongo突然出现一些奇葩的事,如数据都还在,但某个命令敲下去了.啥东西都没有返回给我们. 往往这个时候特别的郁闷,找不出问题所在. 不用太担心,看看版本,多半是mongo的版本太老了,有些命令已经过 ...

  8. Java 动态代理 两种实现方法

    AOP的拦截功能是由java中的动态代理来实现的.说白了,就是在目标类的基础上增加切面逻辑,生成增强的目标类(该切面逻辑或者在目标类函数执行之前,或者目标类函数执行之后,或者在目标类函数抛出异常时候执 ...

  9. springcloud eureka.instance

    1.在springcloud中服务的 Instance ID 默认值是: ${spring.cloud.client.hostname}:${spring.application.name}:${sp ...

  10. 如何使用eclipse创建JAVA项目并写一个简单的HelloWorld

    输入项目名称  点击完成(Finish) 原文地址:https://blog.csdn.net/qq_36798713/article/details/79530056