一:楔子
1:从python解释器开始执行之后,就在内存中开辟了一个空间
2:每当遇到一个变量的时候,就把变量名和值之间的对应关系记录下来。
3:但是当遇到函数定义的时候解释器只是象征性的将函数名读入内存,表示知道这个函数的存在了,至于函数内部的变量和逻辑解释器根本不关心。
4:等执行到函数调用的时候,python解释器会再开辟一块内存来存储这个函数里的内容,这个时候,才关注函数里面有哪些变量,而函数中的变量会存储在新开辟出来的内存中。 5:函数中的变量只能在函数的内部使用,并且会随着函数执行完毕,这块内存中的所有内容也会被清空。
二:命名空间和作用域
命名空间:存放名字与值的绑定关系。
全局命名空间:创建的存储变量名与值得关系
局部命名空间
内置命名空间:存放python解释器为我们提供的名字:input,print,str,list,tuple......是拿过来 就可以用的方法。
三种命名方空间的加载与取值顺序:
加载顺序:内置命名空间(程序运行前加载)------>全局命名空间(程序运行中:从上到下加载)------->局部命名空间(程序运行中:调用时才加载)
取值:
局部调用:局部命名空间---------->全局命名空间------------>内置命名空间
局部使用变量取值
x=1 def f(x): print(x) print(20)
20
全局调用:全局命名空间
全局使用变量取值
x = 1 def f(x): print(x) f(10) print(x)
10
1
作用域:就是作用范围,按照生效范围可以分为全局作用域和局部作用域。
全局作用域:包含内置命名空间,全局名称空间,在整个文件的任意位置都能被引用,全局生效。
局部作用域:局部名称空间,只能在局部范围生效。
global关键字:在局部指定一个变量改变全局的相同变量
a=10 c=52 def anckan(): global c c=100 anckan() print(c) print(a) 100 10
nonlocal关键字:外部必须有这个变量2,在内部函数声明nonlocal变量之前不能再出现同名变量内部修改这个变量如果想在外部有这个变量的第一层函数中生效
def f1(): a = 1 def f2(): nonlocal a a = 2 f2() print(a) f1()
2
三:函数的嵌套与作用域链
函数的嵌套调用
嵌套定义:定义在内部的函数无法直接在全局调用。
四:函数名的本质:函数名的本质就是函数的内存地址。
可以被引用,可以被当作容器类型的元素,可以被当作函数的参数和返回值。---------->当变量使用
五:闭包:内部函数包含对外部作用域而(非全局作用域)名字的引用。
函数内部定义的数称为内部函数。
函数内部的变量,要在函数外部用,直接返回这个变量。
函数外部的调用函数内部的,返回函数的名字。
作业:
2、写函数,,用户传入修改的文件名,与要修改的内容, # 执行函数,完成整个文件的批量修改操作 # def my_max(a,b): # c = a if a > b else b # return c # m = my_max(5,8) #3、写函数,检查用户传入的对象(字符串、列表、元组)的每一个元素是否含有空内容。 # count=0 # def my_ment(w): # for i in w: # if i.isspace(): # return True # else: # return False # w=(['wang','wang ','lo ng']) # l=my_ment(w) # print(l) #4、写函数,检查传入字典的每一个value的长度,如果大于2,那么仅保留前两个长度的内容, # 并将新内容返回给调用者。dic = {"k1": "v1v1", "k2": [11,22,33,44]} def my_duk(dic): if len(dic) > 2: return dic.values()[0:2] else: return dic dic = {"k1": "v1v1", "k2": [11,22,33,44]} w=my_duk(dic) print(w)