python之函数的对象、函数嵌套,名称空间与作用
一.函数的对象
函数是第一类对象的含义是函数可以被当做数据处理
1.引用
2.当作参数传给一个函数
3.可以当作函数的返回值
4.可以当作容器类型的元素
def pay():
print(‘支付。。’)
def withdraw():
print(‘取款。。’)
def transfer():
print(‘转账。。’)
defcheck_balance():
print(‘检查余额’)
def shopping():
print(‘购物。。’)
func_dic={ '1':pay,
'2':withdraw,
'3':transfer,
'4':check_balance,
'5':shopping
}
while True:
msg="""
1.支付
2.取款
3.转账
4.查看余额
5.购物
6.退出“”
print(msg)
choice=input(‘>>:’).strip
if choice == ‘5’:break
if choice not in func_dic:
print(‘输入的指令不存在’)
continue
func_dic[choice]()
二.函数嵌套
嵌套定义:
def f1():
def f2():
print('from f2')
f2()
f1()
嵌套调用:
# def max2(x,y):
# if x > y:
# return x
# else:
# return y
#
# def max4(a,b,c,d):
# res1=max2(a,b)
# res2=max2(res1,c)
# res3=max2(res2,d)
# return res3
#
# print(max4(1,2,3,4))
三.名称空间与作用域
1.名称空间namespaces
存放名字与值绑定关系的地方
2.名称空间分为三大类
内置名称空间:
作用:存放python解释器自带的名字
生命周期:
在解释器启动时生效,在解释器关闭时失效
全局名称空间:
作用:除了内置的与局部的名字外,其余都是全局名字
生命周期:
在文件执行时生效,在文件执行完毕失效
例如:x,func,y,l,都是
x=1
def func():
l=[1,2]
局部名称空间:
作用:用于存放函数调用期间函数体产生的名字
生命周期:
在文件执行过程
调用某个函数才会临时生效,在函数执行完毕后失效
三种名称空间的加载顺序是:
内置-》全局-》局部
名称空间就是用来存放名字与值的绑定关系,所以但凡要查找名字,一定是从三者之一找到,查找顺序
从当前所在是位置到这查找,如果当前所在的位置是局部名称空间
则查找顺序是:
局部-》全局-》内置
不能跨函数找对象
3.作用域:
域指的是区域、范围,作用域即作用的范围
全局作用范围,全局作用域(内置名称空间与全局名称空间)
全局有效,全局存活
局部作用范围,局部作用域(局部名称空间)
局部有效,临时存活
作用域关系是在函数定义阶段就固定死了,但凡调用函数都需要跑到定义阶段去找作用域关系
当前函数从里往外一层一层找,找不到就找全局
# 在局部如果想要修改全局的可变类型,不需要借助任何声明,可以直接修改
# 在局部如果想要修改全局的不可变类型,需要借助global声明,声明为全局的变量就可以直接修改了
nonlocal从当前位置就近修改局部内的的值
# x=1
# def f1():
# # x=33333
# def f2():
# # x=22222222
# def f3():
# nonlocal x
# x=20000000000
# f3()
# print(x)
# f2()
#
# f1()
# print(x)