python函数微讲解(二)
python函数微讲解(二)
名称空间
1.什么是名称空间?
就是存放变量名和变量值绑定的地方。
2.名称空间的分类
(1).内置名称空间
python解释器提前给我们定义好的,比如:len(),open()......等等。
(2).全局名称空间
在py文件中编写的代码运行之后产生的名字都会存入全局名称空间。
age = 21 # age存入全局名称空间 def index(): # index存入全局名称空间 pass if True: a = 11 # a存入全局名称空间 for i in range(100): # i存入全局名称空间 print(i) while True: c = 11 # c存入全局名称空间
(3).局部名称空间
函数体代码运行产生的名字都会存入局部名称空间。
def index(): age = 18 # age存入局部名称空间
3.存活周期
(1).内置名称空间
python解释器运行就会产生,解释器停止就会销毁。
(2).全局名称空间
py文件运行就会产生,停止运行就会销毁。
(3).局部名称空间
函数调用就会产生,不调用就不会产生,函数调用运行结束后就会销毁。
名字的查找顺序
1.如果是从局部名称空间开始查找名字的,那么查找的顺序就是:局部名称空间--->全局名称空间--->内置名称空间
2.如果是从全局名称空间开始查找名字的,那么查找的顺序就是:全局名称空间--->内置名称空间
切记:只能局部然后全局然后内置,顺序不能颠倒!!!
# 因为内置空间里有“len”这个名字,所以我们就用“len”来演示一下 # len = '我是全局名称空间的' # # def index(): # len = '我是局部名称空间的' # print(len) # print(len) # 我是全局名称空间的 # # index() # 我是局部名称空间的 print(len) # 如果把上面的全注释掉,返回的就是内置名称空间的
这里来讲一道小题目:
l = 1 # 第1步 def index(): # 第2部,定义函数并检查语法 l = 2 # 第4.1步,执行函数体代码 def index1(): # 第4.2步,定义函数并检查语法 l = 3 # 第6.1步执行函数体代码 def index3(): # 第6.2步定义函数并检查语法 l = 4 # 第8.1步执行函数体代码 print(l) # 4 index3() # 第7步调用函数 index1() # 第5步调用函数 index() # 第3步,调用函数
3.如果局部名称空间之间不是嵌套关系,那么就互不干涉!!!
def index(): name = 'jason' def index1(): age = 12 print(name) # 直接报错 index() index1()
作用域
1.内置名称空间
在程序的任何阶段任何时间都可以使用。
2.全局名称空间
在程序的任何阶段任何时间都可以使用。
3.局部名称空间
一般情况下只能在各自的局部名称空间下使用。
global与nonlocal关键字
1.global关键字:在局部名称空间修改全局名称空间的值,修改的是不可类型,可变类型不用关键字也可以修改。
l = 100 l1 = [1, 2, 3] def index(): # l = 111 # 产生一个新的值 global l # 修改值,并不是产生新的值 l = 111 l1.pop(0) # 列表是可变类型,直接修改 index() print(l) # 111 print(l1) # [2, 3]
2.nonlocal关键字:在局部名称空间嵌套的时候,想要在内存修改外层的值,修改的是不可类型,可变类型不用关键字也可以修改。
def index(): l = 111 l1 = [1, 2, 3] def index1(): # l = 222 # 产生一个新的值 nonlocal l # 修改值,并不是产生新的值 l = 222 l1.pop(2) # 列表是可变类型,直接修改 index1() print(l) # 222 print(l1) # [1, 2] index()
函数名的多种用法
1.函数名可以当作变量名赋值
def index(): print('你好') l = index l() # 相当于index()
2.函数名还可以当作函数的实参
def index(a): a() def f(): print('你好') index(f) # 把函数名当作实参传递给形参
3.函数名还可以当作函数的返回值
def index(): print('不好') return f def f(): print('你好') l = index() # 把函数的返回值赋值给l,函数的返回值是函数名f l() # 相当于f()
4.函数名还可以当作容器类型的元素
容器类型就是:列表、元组、字典等等。
def index(): print('你好') l = [1, 2, 3, index] l[-1]() # 你好
函数的嵌套
这个看似很简单,跟之前的循环嵌套一样,但是函数嵌套要难一点,所以一定要死咬概念,尤其是函数的定义与调用,一定要先定义,在调用,不然就会报错,函数体代码在函数不被调用的时候时候是不会执行的,在函数定义阶段只会检查语法,不会执行函数体代码。
def max1(x,z): if x > z: return x return z def max(a,b,c,d): res = max1(a,b) res1 = max1(res,c) res2 = max1(res1,d) return res2 print(max(12, 45, 1, 10)) # 返回最大值 45
这里是IT小白陆禄绯,欢迎各位大佬的指点!!!