博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
装饰器基础知识之函数即变量
阅读量:6212 次
发布时间:2019-06-21

本文共 1969 字,大约阅读时间需要 6 分钟。

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 fooin 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

你可能感兴趣的文章
Qt 5.7 > Qt Applications
查看>>
Android 9.png图片的制作方法
查看>>
575.分糖果
查看>>
C# txt格式记录时间,时间对比,决定是否更新代码记录Demo
查看>>
python3 进行接口测试
查看>>
maven项目(多模块)
查看>>
对SQL Server属性的解读
查看>>
VC命令行编译开源代码的常用做法
查看>>
算法导论读书笔记-第十三章-红黑树
查看>>
Linux SVN server
查看>>
第三讲 多重背包问题(对背包九讲的学习)
查看>>
MAC OS X 常用命令(转载)
查看>>
一天搞懂深度学习--李宏毅教程分享
查看>>
ecshop 商品详情页显示同类别下的推荐商品
查看>>
Develop Reports Using Crystal Reports in .NET 2005
查看>>
加班对你的提升有多大?
查看>>
[转]SQL Server 存储过程的分页方案比拼
查看>>
有滚动条、固定Header的ASP.Net DataGrid实现
查看>>
服务器安全设置全攻略
查看>>
微信公众号内H5调用微信支付国内服务商模式
查看>>