装饰器基础知识之函数即变量

1:首先学习一下变量的定义:可以将内存比作一栋大楼,定义变量X = 1它在内存中是以什么样的方式存在的呢?是不是在内存这栋大楼里面找一个小的房间,将1这个实实在在的变量放进去,然后这个房间会有一个门牌号,这个门牌号就是X这个变量名;

2:理解上述之后给出一个新的概念,这个新的概念即为“函数即变量”,什么意思呢?也就是说def  test(),定义了一个函数,函数名叫test,下面对应有函数体,就相当于把函数体赋值给了一个叫test的变量;

3:python内存回收机制浅谈:python解释器中有个概念叫引用计数,什么叫引用计数呢?比如X = 1,会在内存当中将1的值实实在在的存放下来,假如这个时候又做了一件事X = Y或者Y = 1,实际上是做什么事呢?实际上做的事为将内存1房间又加了一个门牌号叫Y,那引用计数是什么意思呢?X代表一次引用,Y也代表一次引用,加起来是两次引用,python何时会将1这个内存清空呢,即什么时候会回收这个1呢?很简单它会等到Y这个门牌号没有了,X这个门牌号也没有了,便会将内存1给清除,python当中的内存回收机制就是靠这种方式进行回收的。

4:综上变量有内存回收机制,函数也是一样,跟变量的内存回收机制一样(匿名函数在这里不提)

5:下面给出几段代码,分别用函数即变量这个概念来讲解。

# Author:Ju BO
#----第一段代码------------
def foo():
    print("in the foo")
    bar()
foo()
'''
#----显然这段代码会出错,为什么会出错呢?因为在调用foo()函数时,运行到bar()这一步发现没有定义bar相当于什么效果呢?
首先我们定义了foo这个函数,在内存中是怎么样存的呢?是不是会找一个房间放函数体,放进去之后会给这个房间一个门牌号foo。
在调用foo函数时,在内存中立刻执行函数体中的内容,函数体中第一句print("in the foo"),可以正常打印,第二段代码bar()
是在干什么事呢?做的事情为:找带有bar这个门牌号的房间,然而并没有,于是会报错。

'''

6:对第一段代码的图片解释如下:

 

7:第二段代码:

# Author:Ju BO
#----第二段代码:修改了第一段代码的bug,在foo的基础上给bar指定了一个房间(定义了bar这个函数)------------
def bar():
    print("in the bar")
def foo():
    print("in the foo")
    bar()
foo()
#对第二段代码的讲解:在调用foo()这个函数时,在内存中立刻执行函数体中的内容,函数体中第一句print("in the foo"),可以正常打印,第二段代码bar()
#是在干什么事呢?做的事情为:找带有bar这个门牌号的房间,找到了,因此运行正确

8:对第二段代码的图片解释如下:

9:第三段代码:

# Author:Ju BO
#----第三段代码:与第二段代码不同把bar函数的定义位置改变------------

def foo():
    print("in the foo")
    bar()
def bar():
    print("in the bar")
foo()
'''
运行代码3与代码2发现结果没有区别:均为
in the foo
in the bar
这是因为在调用之前函数已经声明 ,只是放的位置不同,对调用没有影响,也引申出一个重要概念,只要在调用前函数已经声明,就可以
正常调用。
'''

 9:对第二段代码与第一段代码深度分析:

'''
对第二段代码分析:这段代码最终是如何走到foo()这一步的呢?python解释器开始一行一行解释,先解释第一行把print("in the bar")
这个函数体放到内存当中,对应bar这个名,此时bar这个函数已经存在,紧接着又定义foo,foo这个函数也是已经存在,于是下面再调用foo这个函数
foo函数体里面引用bar,bar此刻存在,因此运行正确。
第三段代码分析:先定义foo(),foo会把自己的函数体当作字符串放到内存当中,此刻foo存在,紧接着又定义bar这个函数,同理把bar这个函数
的函数体放到内存当中,指向bar这个名,此刻bar这个函数存在,那么接下里调用foo这个函数,理所当然也是可以的。
'''

10:总结:

总结:为什么第二段代码与第三段代码没有区别:就是因为这个概念:函数即变量,变量先定义再使用,函数也是这样。

由于装饰器比较复杂,暂时写到这里,后续所有内容均会补上,需要跟读贴温馨提醒关注一下。

 

转载于:https://www.cnblogs.com/jb9527/p/10306278.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值