一.函数对象
函数是第一类对象,第一等公民,函数对象即函数可以被当作变量去用。
具体分为四个方面:
1.可以被赋值
def func():
print('from func')
f = func
print(f is func)
f()
2.可以当作参数传给另一个函数
def func():
print('from func')
def foo(a):
print(a)
a()
foo(func)
3.可以当作函数的返回值
def func():
print('from func')
def foo(f):
return f
res = foo(func)
print(res)
res()
4.可以当作容器类型的元素
def func():
print('from func')
list = [1,2,func]
print(list)
list[2]()
#用法例子2
def login():
print('登录'.center(50,'*'))
def register():
print('注册'.center(50,'*'))
def transfer():
print('转账'.center(50,'*'))
def withdraw():
print('提现'.center(50,'*'))
func_dic = {
"1":["登录",login],
"2":["注册",register],
"3":["转账",transfer],
"4":["提现",withdraw],
}
while True:
print("0 退出")
for k in func_dic:
print(k,func_dic[k][0])
choice = input("请输入您的命令编号:").strip()
if choice == "0":
break
if choice in func_dic:
func_dic[choice][1]()
else:
print("输入命令错误")
二.函数嵌套
1.函数的嵌套定义
#例1
# def f1():
# x = 111
# def f2():
# print('from f2')
# # print(x)
# # print(f2)
# f2()
#
# f1()
#例2
# from math import pi
#
# def circle(radius,mode=0):
# def perimiter(radius):
# return 2 * pi * radius
#
# def area(radius):
# return pi * (radius ** 2)
#
# if mode == 0:
# return perimiter(radius)
# elif mode == 1:
# return area(radius)
#
# circle(3,1)
2.函数的嵌套调用
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
res = max4(1,2,3,4)
print(res)
三.名称空间与作用域
(一).名称空间(Namespaces):存放名字与其对应的内存地址的地方
名称空间分为三大类:
1.内置名称空间:存放的是Python解释器自带的名字
生命周期:解释器启动则产生,解释器关闭则销毁
print(len)
print(input)
2.全局名称空间:存放的是顶级的名字,不是函数内定义,也不是内置的
生命周期:Py程序刚开始运行则立即产生。Py程序结束销毁
# x = 10
# if True:
# y = 2
# def foo():
# z = 3
3.局部名称空间 :存放的是函数内的名字
生命周期:函数调用则产生,函数调用结束则销毁
# def foo():
# len = 222
# # print(len)
#
# foo()
###总结:
1.名字的访问优先级:基于自己当期所在的位置向外一层一层查找,L-》E-》G-》B
2.名称空间的‘嵌套’关系是函数定义阶段、扫描语法时生成的,与调用位置无关
x = 0
def f1():
def f2():
# x = 2222
def f3():
# x = 3333
print(x)
f3()
x = 1111
f2()
f1()
# # 案例1:
# x = 666
# def f1():
# print(x) #赋值前引用报错
# x=111
#
# f1()
# 案例2:
x = 666
def f1():
x = 1111
def f2():
print('f2===>',x)
return f2
f = f1()
def foo():
x=77777777777777777
f()
foo() #结果: 1111
(二).作用域
1.全局作用域:内置名称空间、全局名称空间
特点:全局存活,全局有效
2.局部作用域:局部名称空间
特点:临时存活,局部有效
#global:用来在局部修改全局的不可变类型的值
# x = 100
#
# def login():
# global x
# x = 200
# login()
# print(x)
#nonlocal:可以将名字声明为来自外部嵌套函数定义的作用域(非全局)
#nonlocal x 会从当前函数的外层函数一层层去查找名字x,若是一直到最外层函数都找不到,则抛出异常
# def f1():
# x = 100
# def f2():
# # global x
# nonlocal x
# x = 200
# f2()
# print(x)
# f1()