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():
print(222)
def f3():
print(333)
def f4():
print(444)
li = []
for i in range(1,5):
li.append('f'+str(i)) for i in li:
eval(i)()

4,函数名可以作为参数。

def f1():
print(666) def f2(x):
x() f2(f1)

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

def f1():
print(666) def f2(x):
return x
f2(f1)()

函数又叫第一类对象(first-class object)指

1,可在运行期创建

2,可用作函数参数或返回值

3,可存入变量的实体。

2,闭包的使用

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

def wraaper():
def inner():
print(444)
return inner
wraaper()()
def wraaper():
def inner():
print(555)
inner()
wraaper()

判断闭包函数的方法__closure__

def wraaper():

    name = 'taibai'
def inner():
print(name)
inner()
print(inner.__closure__)
wraaper()

#taibai
(<cell at 0x0000025B34990B58: str object at 0x0000025B34E14848>,)

name = '老男孩'
def wraaper(n):
def inner():
print(n)
inner()
print(inner.__closure__)
wraaper(name)

老男孩
(<cell at 0x0000024AF7810B58: str object at 0x0000024AF8343990>,)

这个也是闭包。

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

from urllib.request import urlopen
content = urlopen('http://www.cnblogs.com/jin-xin/').read().decode('utf-8')
print(content)
from urllib.request import urlopen
def index():
ur1 ='http://www.xiaohua100.cn/index.html'
def get():
return urlopen(ur1).read()
return get() print(index()())

3,装饰器

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

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

现在我有一个需求,我想让你测试这个函数的执行时间,在不改变这个函数代码的情况下:

import time
def func1():
print('所有痛苦都会过去')
def timmer(f):
def inner():
start_time = time.time()
f()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return inner func1 = timmer(func1)
func1()

但是如果有多个函数,我都想让你测试他们的执行时间,你每次是不是都得func1 = timer(func1)?这样还是有点麻烦,因为这些函数的函数名可能是不相同,有func1,func2,graph,等等,所以更简单的方法,python给你提供了,那就是语法糖。

import time
def timmer(f):
def inner():
start_time = time.time()
f()
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return inner
@timmer
def func1():
print('继续努力加油自己') func1()
import time
def timmer(f):
def inner(*args,**kwargs):
start_time = time.time()
ret = f(*args,**kwargs)
time.sleep(0.3)
end_time = time.time()
print('此函数的执行效率%s'%(end_time - start_time))
return ret
return inner @timmer
def func1(a,b):
print('继续努力加油自己')
return 666 print(func1(1,2))

装饰器的开放关闭原则:

1.对扩展是开放的

    为什么要对扩展开放呢?

    我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。

  2.对修改是封闭的

    为什么要对修改封闭呢?

    就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对其进行了修改,很有可能影响其他已经在使用该函数的用户。

装饰器完美的遵循了这个开放封闭原则。

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

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

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

  2. Python函数篇:装饰器

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

  3. python函数与方法装饰器

    之前用python简单写了一下斐波那契数列的递归实现(如下),发现运行速度很慢. def fib_direct(n): assert n > 0, 'invalid n' if n < 3 ...

  4. python笔记3 闭包 装饰器 迭代器 生成器 内置函数 初识递归 列表推导式 字典推导式

    闭包 1, 闭包是嵌套在函数中的 2, 闭包是内层函数对外层函数的变量(非全局变量)的引用(改变) 3,闭包需要将其作为一个对象返回,而且必须逐层返回,直至最外层函数的返回值 闭包例子: def a1 ...

  5. python函数:叠加装饰器、迭代器、自定义迭代器、生成式

    一.叠加多个装饰器二.迭代器三.自定义迭代器四.xxx生成式 一.叠加多个装饰器 # 加载装饰器就是将原函数名偷梁换柱成了装饰器最内层那个wrapper函数 # 在加载完毕后,调用原函数其实就是在调用 ...

  6. python 函数基础及装饰器

    没有参数的函数及return操作 def test1(): print ("welcome") def test2(): print ("welcomt test2&qu ...

  7. python函数学习之装饰器

    装饰器 装饰器的本质是一个python函数,它的作用是在不对原函数做任何修改的同时,给函数添加一定的功能.装饰器的返回值也是一个函数对象. 分类: 1.不带参数的装饰器函数: def wrapper( ...

  8. python之嵌套 闭包 装饰器 global、nonlocal关键字

    嵌套: 在函数的内部定义函数闭包: 符合开放封闭原则:在不修改源代码与调用方式的情况下为函数添加新功能  # global 将局部变量变成全局变量 num = 100 def fn1(): globa ...

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

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

随机推荐

  1. 第二十二篇-Guideline基准线

    效果图: 前5个是button填充的,最后一个是线性布局下放置一个button在填充. layout.xml <?xml version="1.0" encoding=&qu ...

  2. c++ stl sort

    两者相等时,必须为false. 满足拟序. 群里大佬666.

  3. 第十六节、特征描述符BRIEF(附源码)

    我们已经知道SIFT算法采用128维的特征描述子,由于描述子用的是浮点数,所以它将会占用512字节的空间.类似的SUFR算法,一般采用64维的描述子,它将占用256字节的空间.如果一幅图像中有1000 ...

  4. makefile解析:一些常用函数

    #======================================================================= #指定目标文件名,makefile中的变量直接使用不用 ...

  5. aerospike数据库配置

    https://blog.csdn.net/u011344514/article/details/53082757

  6. bzoj2819 DFS序 + LCA + 线段树

    https://www.lydsy.com/JudgeOnline/problem.php?id=2819 题意:树上单点修改及区间异或和查询. 思维难度不高,但是题比较硬核. 整体思路是维护每一个结 ...

  7. ansible playbook 变量

    变量优先级 在命令中定义的变量(-e参数指定的) 在inventory中定义的变量(ansible_ssh_user等) 其他变量(role中.play中) 系统通过father_facts定义的变量 ...

  8. Linux记录-salt命令

    salt '*id*'  test.ping salt -N  组名  cmd.run '' salt -G "ipv4:0.0.0.0"  cmd.run '' salt '*i ...

  9. MarkdownPad使用

    正文: 1.标题的几种写法: 第一种:     前面带#号,后面带文字,分别表示h1-h6,上图可以看出,只到h6,而且h1下面会有一条横线,注意,#号后面有空格 第二种:      这种方式好像只能 ...

  10. HDU - 5073 Galaxy(数学)

    题目 题意:n个点,运行移动k个点到任何位置,允许多个点在同一位置上.求移动k个点后,所有点到整体中心的距离的平方和最小. 分析:这题题目真的有点迷...一开始看不懂.得知最后是选取一个中心,于是看出 ...