Day 11 函数基础part2
函数基础part2
函数对象的四大功能
- 引用
- 当做参数传给一个函数
def f1():
print('from f1')
def f2(m)
return m
f=f2(f1)
f() # from f1
- 可以当做函数的返回值
def f2():
print('from f2')
def f1():
return f2
f=f1() #f2
f() #from f2
- 可以当做容器类型的元素
def f1():
print('from f1')
l=['l',1,'f1']
l[2]() # from f1
函数的嵌套
函数内部定义的函数,无法在函数外部使用内部定义的函数
def f1():
def f2():
print('from f2')
f2()
f2()# 报错 即无法在函数外部使用函数内部的函数
f1() #from f2
注意:在函数内部定义函数是没有意义的.应该在外部定义函数,然后使用函数的嵌套调用
def f1():
print('from f1')
def f2():
f1()
f2() #from f1
名称空间
名称空间就是存放名字的空间(变量名,函数名)
-
内置名称空间
内置名称空间存放的是python解释器自带的名字
python自带的内置方法其实就是一个个函数,这些函数被封装后具有了某种功能
生命周期:在解释器起送是生效,在解释器关闭时失效 -
全局名称空间
除了内置名称和局部的名称之外,其余的都放在全局名称空间
生命周期:程序\文件运行的时候才会生效,运行完毕就失效 -
局部名称空间
函数内部的都叫局部名称空间,也就是说函数内部定义的名字都放入了局部名称空间
生命周期:函数运行的时候生效,运行完就失效 -
执行顺序
由于python程序是有python解释器打开的的,因此一定是在python解释器中的内置名称空间加载结束后,文件才开始打开,这个时候才会产生全局名称空间,当文件内有某一个函数被调用的时候,才会开始产生局部名称空间,因此名称空间的加载顺序为:内置->全局->局部 -
查找顺序
由于名称空间是用来存放变量名与之之间的绑定关系,但凡需要查找名字,必然是从当前的位置开始查找,查找顺序为: 局部->全局->内置
作用域
作用域关系在函数定义阶段就已经确定了,与函数的调用么有关系
函数与函数之间可能会有相同名字的变量,但是这两个变量毫无关系,作用域不同
x=1
def f1(): #定义阶段x=1
print(x)
def f2():
x=2
f1()
f2() # 1
- 全局作用域
适用于全局+内置,即全局可以修改内置的,内置可以修改全局的
x=1
def f1():
print x
f1() #1
- 局部作用域
只能适用于局部范围,在局部定义的名字只能在局部获取
def f1():
def f2():
def f3():
print(x)
x=2
f3()
f2()
f1() # 2
浙公网安备 33010602011771号