在python中,函数可以被嵌套定义,也就是说,函数中可以定义函数。该函数还可以将其内部定义的函数作为返回值返回。
闭包的定义:一般来说,我们可以认为,如果一个函数可以读取其他函数中的局部变量,那么它们就构成了闭包。
注意 :闭包的定义不是特别清晰,但大体上的意思是这样的。
我们知道,普通的函数是可以使用全局变量的
类似的,函数中定义的函数,也是可以使用外部函数的变量的。因此,满足了函数读取了其他函数局部变量的这一条件,他们因此构成了闭包。
在闭包的使用中,我们可以先给外部的函数赋予不同的局部变量,然后再调用其中内部的函数时,就可以读取到这些不同的局部变量了。
外部变量的使用 在普通函数中,虽然可以直接使用全局变量,但是不可以直接修改全局变量。从变量的作用域来说,一旦你尝试修改全局变量,那么就会尝试创建并使用一个同名的局部变量。因此,如果你需要在普通函数中修改全局变量,需要使用global
同样的,如果你希望通过定义在内部的函数去修改其外部函数的变量,那么必须使用nonlocal
变量的引用
变量和数据都是保存在内存中的
变量和数据是分开存储的
数据保存在内存中某个位置,通过地址来标记
变量保存的是数据的地址,通过地址可以找到数据在内存空间的位置
把变量保存数据地址的过程称为引用
变量的重新赋值修改的是变量中引用数据的内存地址
变量之间的赋值实际是引用的传递
函数参数的传递,本质也是引用的传递
函数的返回值本身也是引用的传递
可变和不可变类型
不可变类型,内存中的数据不允许被修改:数字类型(int,bool,float,complex,long(2,x)、字符串、元组(tuple)
可变类型,内存中的数据可以被修改:列表list、字典dict
无论是可变还是不可变数据类型,通过赋值语句,都会改变变量的引用
Hash函数只能接收不可变数据类型,字典的键也只能是不可变数据类型,字典的value值可以是任意数据类型
局部变量
1在函数内部定义的变量就是局部变量(作用范围只能是当前函数内部)
2在函数外部无法直接访问局部变量
3不同的函数中可以定义同名的局部变量
4局部变量的生命周期:从定义变量时开始,到函数运行结束
全局变量
1在所有函数外边定义的变量就是全局变量
2让所有函数都能访问到,可以作为函数通信的桥梁
3一般情况下,为了和普通变量的区别,需要加上g_或gl_前缀
4全局变量一般放在所有函数的最上面
5在函数内部修改全局变量,必须要加上global关键字,如果不加global只是定义了一个同名的局部变量
函数的多个返回值
好像很难实现对变量X的任何改变都调用函数f(),调用的过程通常发生在对变量X的赋值和读取之时;如果变量赋值为某种结构类型,例如list,对list内元素的处理,无法引发调用1、可以使用class的property属性实现
2、可以考虑使用yield语法实现
File file2py:
import file1
x = file1joinf()
xX = 90 或者 m = xX时都可以执行不同的程序
========================================
File file1py:
def ART(func):
return property(func())
class joinf():
def __init__(self):
self__X = None #真实保存变量的地方,不可直接访问
@ART
def X():
def fget(self): #执行m=xX时调用的函数
pass #可以在此执行任何指令和函数 - 可以在此调用函数f()
return self__X #不一定非要返回原值,此处返回什么,m得到的就是什么
def fset(self, value): #执行xX=90 *** 作时执行的函数,value就是90
pass #可以在此执行任何指令和函数 - 可以在此调用函数f()
self__X = value #不一定把原值付给self__X的,可以对value进行处理后再赋值给value
return locals()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)