函数的运用,闭包

一,函数名的运用            二,闭包                 三,装饰器

1.函数名的内存地址

2.函数名可以赋值给其他变量

3.函数名可以当做容器类的元素

4.函数名可以当做函数的参数

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

 

函数名的运用

函数名是一个变量,但是它是一个特殊的变量,与括号配合可以执行函数的变量

1.函数名的内存地址

def a():
    print("我是a")
print(a) # a是个地址. 这个地址是个函数
b = a   # 函数可以赋值
b()
#打印结果:<function a at 0x0000000001E68B70>
#我是a

 




2.函数名可以赋值给其他变量
def func():
    print("哈哈")
a=func    #把函数func当成一个变量赋值给另一个变量a
a()       #执行a,相当于执行func."函数调用"

 





3.函数名可以当做容器类的元素
def func1():
    print("我是func1")

def func2():
    print("我是func2")

def func3():
    print("我是func3")

lst = [func1, func2, func3]     #把每个函数都放进一个列表
for e in lst:                   #循环拿出每个函数
    e() # e表示的是lst中的每一个函数. 函数()执行函数. e() 执行每一个函数

 





4.函数名可以当做函数的参数
def func():
    print("你在哪")
def func2(fu):     #(fu)就是把func拿来给(fu)了
    print ("我是func2")
    fu()     #执行传递过来的fu,函数后面跟空括号表示执行
    print ("我是func2")
func2(func)       #把函数func当成函数传递给func2 的参数fu
#结果:我是func2
    #你在哪
    #我是func2

 



 




5.函数名可以作为函数的返回值
def func1():
    print ("函数1")
    def func2():
        print("函数2")
    return func2     #把func2返回给func1
fu=func1()      #此时的func1包括func1和func2,然后赋值给fu
fu()           #运行fu()

#结果:函数1    函数2

 




闭包
什么是闭包? 闭包就是内层函数,对外层函数(非全局变量)的变量的引用,叫闭包.这个时候. 外层的这个局部变量将会常驻内存
目的: 让内存永远的记住一个变量
def func():
    a=1
    def inner():
        print (a)      #在这里内层函数引用外层函数
    return inner
fu=func()
fu()
#print (fu.__closure__)     这一段是检查闭包
#结果:1
#(<cell at 0x0000000001E28468: int object at 0x0000000077FB6C10>,)    #闭包的结果
#返回None就不是闭包

 





#以爬虫为例
from urllib.request import urlopen

def func():
    content = urlopen("http://www.xiaohua100.cn/index.html").read()
    def inner():
        print(content)     #把外部函数content引用到内层函数
    return inner

fn = func()
fn()
print(fn.__closure__)   # 检查闭包

 





装饰器
装饰器的作用:就是在不修改原有代码的基础上,给函数添加新的功能
#装饰器完整模型
def wrapper(func):
    def inner(*args,**kwargs):
        print ("xxx")   #在执行目标函数之前要执行的内容
        ret=func(*args,**kwargs)
        print ("xxx")   #在执行目标函数之后要执行的内容
        return ret
    return inner
@wrapper            #    @wrpper就是语法糖
def func():
    print ("xxx")       #这个print里面的就是,目标函数
func()          #调用目标函数

例题:


def wrapper (fn):
def inner(*args,**kwargs):
print("我们")
ret=fn(*args,**kwargs)
print("去吧")
return ret
return inner
@wrapper
def fn():
print ("一起")
fn()
#结果:我们 一起 去吧
 

 







posted @ 2018-06-14 21:49  惊世风情  阅读(159)  评论(0编辑  收藏  举报