一.函数对象
函数时第一类对象:函数名指向的值可以被当作参数传递
1.函数名可以被传递
2.函数名可以被当作参数传递给其他函数
3.函数名可以当作函数的返回值
4.函数名可以当作容器类型的参数
1.函数名可以被传递
def func(): print('from func') f=func f() # from func func() # from func print(id(f)) # 2562541772872 print(id(func)) # 2562541772872
def index(args): print(args) # <function func at 0x0000022348E58C80> args() print('from index') # form func def func(): print('form func') # from index index(func)
3.函数名可以当作函数的返回值
def index(): print('index') def func(): print('func') return index res = func() # 将函数func的返回值index赋值给res print(res) # <function index at 0x0000021073B96048> print(index) # <function index at 0x0000021073B96048> res() # index
4.函数名可以当作容器类型的参数
sg = """ 1 注册 2 登陆 3 购物 4 支付 5 转账 """ def register(): pass def login(): pass def shopping(): pass def pay(): pass def transfer(): pass msg_info = { '1':register, '2':login, '3':shopping, '4':pay, '5':transfer, } while True: print(msg) choice = input('请选择功能').strip() if choice in msg_info: # msg_info.get(choice)() msg_info[choice]() else: print('请输入正确功能编号')
二.函数的嵌套调用和定义
2.1函数的嵌套调用
作用:可以将复杂的功能简单化,分成若干小功能
def max2(x,y): if x > y: return x return y def max4(a,b,c,d): res=max2(a,b) res1=max2(res,c) res2=max2(res1,d) return res2 print(max4(1,2,3,4)) # 4
2.2函数的嵌套定义
def func(): def func1(): deffunc2(): print('today is a beautiful day') func2() func1() func()
三.名称空间
定义:存放的是变量名与变量值的内存地址得绑定关系得地方
名称空间得分类:
1.内置名称空间
2.全局名称空间
3.局部名称空间
1.内置名称空间:python解释器提前给你定义好的名字(已经存放在内置名称空间中了)
eg:len, print ,max,min
2.全局名称空间:文件级别得代码(顶头写的)
x = 1 if x>p: y = 2 print(y) while True: z = 3
上述中得x,y,z都是全局名称空间。
3.局部名称空间:函数体内创建得名字都属于局部空间
4.名称空间得生命周期:
4.1内置名称空间:只要python解释器已启动立马创建 关闭python解释器的时候内置名称空间自动销毁
4.2全局名称空间:只要你右键运行py文件会自动创建 py文件程序运行结束自动销毁
4.3局部名称空间:函数被调用的时候自动创建 函数指向结束立即销毁(动态创建动态销毁)
5.名字得查找顺序:首先确定当前位置
1.站在全局:全局---->内置
2.站在局部:局部---->全局---->内置
len = '我是全局名称空间的len' def func(): len = '我是局部名称空间的len' print(len) func() # 我是局部名称空间的len len = '我是全局名称空间的len' def func(): # len = '我是局部名称空间的len' print(len) func() # 我是全局名称空间的len # len = '我是全局名称空间的len' def func(): # len = '我是局部名称空间的len' print(len) func() # <built-in function len>
ps:函数在定义阶段查找名字的顺序就已经固定了,不会因为函数调用位置变化而变化(*******)
x = 111 #若此行没有会去内置空间中查找,若内置名称空间没有会报错 def f1(): x = 222 # 若此行没有输出为111 def f2(): x = 333 # 若此行没有输出为222 def f3(): x = 444 # 若此行没有输出为333 def f4(): x = 555 # 若此行没有输出为444 print(x) # 输出为555 f4() f3() f2() f1()
练习题:
x=111 def outer(): def inner(): print('from inner',x) return inner f=outer() x = 222 f() # from inner 222 x=111 def outer(): def inner(): print('from inner',x) return inner f=outer() def func(): x=333 f() func() # from inner 111 x=111 def outer(): def inner(): print('from inner',x) x = 66666666 return inner f=outer() f() # 报错 因为在索要寻找的名字在本层有不必去外层寻找,但是在输出之前x还未定义
四.作用域
作用域的分类:
1.全局作用域:全局有效(包含内置名称空间和全局名称空间)
2.局部作用域:局部有效(局部名称空间)
2个修改指令globa和nonlocal
global:可以在局部修改全局不可变的变量
x = 1 # 不可变类型 def func(): global x,username # 修改全局变量 而不是创建局部名称空间 x = 999 func() print(x) # 999
ps:若要修改可变类型可直接修改,如果想修改多个可以在global后添加多个,中间用逗号隔开
nonlocal:在局部修改局部变量
def func(): x = 1 def index(): nonlocal x # 若想修改多个在nonlocal后添加中间用逗号隔开 x = 2 index() print(x) func() # 2