python2 中没有nonlocal。

函数名是什么?

    函数名就是函数的名字, 本质:变量,特殊的变量。

1.单独打印函数名:

  1. def func():
  2. print(666)
  3. print(func) # <function func at 0x0000020C8C7C8F28> 函数的存储位置。

2.函数名的赋值:

  1. def func():
  2. print(666)
  3. f = func
  4. print(f) #<function func at 0x0000015710A08F28>

3.函数名可以作为参数:

  1. a = 1
  2. def f(x):
  3. print(x)
  4. f(a) #

4.函数名可以作为容器类数据的元素。

  1. def func1():
  2. print(1111)
  3. def func2():
  4. print(2222)
  5. def func3():
  6. print(3333)
  7. # func1()
  8. # func2()
  9. # func3()
  10. l = [func1,func2,func3]
  11. for i in l:
  12. i()
  13. #
  14. #
  15. #
  16.  
  17. def func1():
  18. print(1111)
  19. def func2():
  20. print(2222)
  21. def func3():
  22. print(3333)
  23. l = []
  24. for i in range(1,4):
  25. l.append('func'+str(i))
  26. for i in l:
  27. eval(i)() # i 里面是什么类型 eval(i) 就可以直接把i提出来。

5.函数名可以作为函数的返回值。

  1. def func(x):
  2. return x
  3. ret = func(5)
  4. print(ret) #

闭包:就是内层函数对外层函数(非全局)变量的引用。

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

如何判断是否为闭包:内层函数名.__closure__    如果有cell 就是闭包。

  1. def wrapper():
  2. name = '老男孩'
  3. def inner():
  4. print(name)
  5. inner()
  6. print(inner.__closure__)
  7. wrapper()
  8.  
  9. # 老男孩
  10. # (<cell at 0x000001473F9A0B58: str object at 0x000001474033A5D0>,)

    如果不是闭包就打印None.

  1. name = '顾清秋'
  2. def wraaper():
  3. def inner():
  4. print(name)
  5. inner()
  6. print(inner.__closure__)
  7. wraaper()
  8.  
  9. # 顾清秋
  10. # None

面试题:‘闭包’

闭包:当函数开始执行时,如果遇到了闭包,他有一个机制,他会永远开辟一个内存空间,将闭包中的变量等值放入其中,不会随着函数的执行完毕而消失。

  1. name = '老男孩'
  2. def wraaper(n):
  3. # 相当于 n = '老男孩'
  4. def inner():
  5. print(n) # 老男孩
  6. inner()
  7. print(inner.__closure__) # (<cell at 0x0000017B8CCD0B58: str object at 0x0000017B8D63A5D0>,)
  8. wraaper(name)

第一类对象(first - class object)指

1. 可在运行期创建。

2. 可用作函数参数或返回值。

3. 可存入变量的实体。

闭包:

  闭包函数:

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

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

闭包函数获取网络应用:

  1. from urllib.request import urlopen
  2. def index():
  3. url = "http://www.xiaohua100.cn/index.html"
  4. def get():
  5. return urlopen(url).read().decode('utf-8')
  6. return get
  7. xiaohua = index()
  8. content = xiaohua()
  9. print(content)

   

什么是装饰器?

  装饰器本质上就是一个python函数,它可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象。

  装饰器的应用场景:比如插入日志,性能测试,事务处理,缓存等等场景。

装饰器的形成过程:

  装饰器---简单版

  1. import time
  2. def func1():
  3. print('in func1')
  4. def timer(func): # func = func1
  5. def inner():
  6. start = time.time()
  7. func()
  8. time.sleep(0.3)
  9. print(time.time()-start)
  10. return inner
  11. func1 = timer(func1) #inner
  12. func1() # inner()

  装饰器---语法糖

  1. import time
  2. def timer(func):
  3. def inner():
  4. start_time = time.time()
  5. func()
  6. time.sleep(0.3)
  7. end_time = time.time()
  8. print(end_time-start_time)
  9. return inner
  10. @timer #语法糖 # func1 = timer(func1)
  11. def func1():
  12. print("in func1")
  13. func1()

  带参数的装饰器:

  1. import time
  2. def timer(func):
  3. def inner(a):
  4. start_time = time.time()
  5. func(a)
  6. time.sleep(0.3)
  7. end_time = time.time()
  8. return inner
  9. @timer
  10. def func1(a):
  11. print(a) #
  12. func1(1)

hold 住所有参数的装饰器

  1. import time
  2. def timer(func):
  3. def inner(*args,**kwargs):
  4. start_time = time.time()
  5. ret = func(*args,**kwargs)
  6. time.sleep(0.3)
  7. end_time = time.time()
  8. print(end_time-start_time)
  9. return ret
  10. return inner
  11. @timer
  12. def func1(a,b):
  13. print(a,b)
  14. @timer
  15. def func2(a,b,c):
  16. print(a,b,c)
  17. return True
  18. func1('aaa','bbb')
  19. print(func2('aaa','bbb','ccc'))

python's eleventh day for me的更多相关文章

  1. Python Celery队列

    Celery队列简介: Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 使用 ...

  2. [Spark][Python]spark 从 avro 文件获取 Dataframe 的例子

    [Spark][Python]spark 从 avro 文件获取 Dataframe 的例子 从如下地址获取文件: https://github.com/databricks/spark-avro/r ...

  3. python之celery队列模块

    一.celery队列简介 Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celery. 1 ...

  4. 【Python之路】特别篇--Celery

    Celery介绍和基本使用 Celery 是一个分布式异步消息队列,通过它可以轻松的实现任务的异步处理 举几个实例场景中可用的例子: 你想对100台机器执行一条批量命令,可能会花很长时间 ,但你不想让 ...

  5. Python中的多进程与多线程(一)

    一.背景 最近在Azkaban的测试工作中,需要在测试环境下模拟线上的调度场景进行稳定性测试.故而重操python旧业,通过python编写脚本来构造类似线上的调度场景.在脚本编写过程中,碰到这样一个 ...

  6. Python高手之路【六】python基础之字符串格式化

    Python的字符串格式化有两种方式: 百分号方式.format方式 百分号的方式相对来说比较老,而format方式则是比较先进的方式,企图替换古老的方式,目前两者并存.[PEP-3101] This ...

  7. Python 小而美的函数

    python提供了一些有趣且实用的函数,如any all zip,这些函数能够大幅简化我们得代码,可以更优雅的处理可迭代的对象,同时使用的时候也得注意一些情况   any any(iterable) ...

  8. JavaScript之父Brendan Eich,Clojure 创建者Rich Hickey,Python创建者Van Rossum等编程大牛对程序员的职业建议

    软件开发是现时很火的职业.据美国劳动局发布的一项统计数据显示,从2014年至2024年,美国就业市场对开发人员的需求量将增长17%,而这个增长率比起所有职业的平均需求量高出了7%.很多人年轻人会选择编 ...

  9. 可爱的豆子——使用Beans思想让Python代码更易维护

    title: 可爱的豆子--使用Beans思想让Python代码更易维护 toc: false comments: true date: 2016-06-19 21:43:33 tags: [Pyth ...

随机推荐

  1. C3P0使用详解

    定义: C3P0是一个开源的JDBC连接池,目前使用它的开源项目有Hibernate,Spring等. 数据库连接池的基本思想就是为数据库连接建立一个"缓冲池".预先在缓冲池中放入 ...

  2. Agilent RF fundamentals (9)-Mixer basics

    Function: change the frequency of the incident RF key parameters ----------------------------------- ...

  3. PostgreSQL upset解决在插入过程中重复数据冲突

    关于重复行问题: 在SQL Server中则可以自动排出重复行,不需要处理.在Oracle中经常遇到upsert语法,来排出冲突行.在PostgreSQL中,也需要手动排出重复行,否则会爆出错误,up ...

  4. jsp中的session

    浏览器和服务器的异常通话 常用方法 setAttribute(String key,Object value);//设置值 getAttribute(String key); //取值 Invalid ...

  5. 关于iframe和div窗口中ajax请求200状态时执行的回调问题

    上一篇说了在ajax回调里面处理iframe窗口的刷新问题,这一篇记录一下遇到的一个分别在iframe和div窗口中ajax请求200状态时执行的回调问题. 我们先来看一下ajax请求的写法(这里使用 ...

  6. 激活函数之ReLU/softplus介绍及C++实现

    softplus函数(softplus function):ζ(x)=ln(1+exp(x)). softplus函数可以用来产生正态分布的β和σ参数,因为它的范围是(0,∞).当处理包含sigmoi ...

  7. tslib: Selected device is not a touchscreen (must support ABS_X and ABS_Y events)

    /************************************************************************************ * tslib: Selec ...

  8. Django之模板继承

    为了在Django模板配置中减少代码的冗余,需使用模板继承 1. 语法 {% block classinfo %} {% endblock} 2. 步骤 (1)创建一个base.html把需要显示的页 ...

  9. eclipse导出文件上传服务器

    [1]导出     选择项目    文件导出 输入导出路径如f盘ftp文件夹下 [2]利用scr上传服务器工具 上传到 home/tomcat/app/项目名称/ 不导入upload文件 [待完善]

  10. Fillder手机抓包的使用

    1.Fillder下载地址: http://www.onlinedown.net/soft/73207.htm 2.网络设置 手机和电脑需链接网络相同 3.fillder设置 3.1打开fillder ...