day23 1. 函数对象 2.函数嵌套 3.名称空间与作用域 4.闭包函数

day23

函数对象

函数可以被赋值

def foo():
   print('from foo')
def func(f):
   f()
func(foo)

函数可以当做函数的返回值
函数可以当做容器的元素

# def foo():
#     print(234567,1234,2345)
# l=[foo]
# l[0]()

# def login():
#     print('登录'.center(50,'*'))
# def register():
#     print('注册'.center(50,'*'))
# def withdraw():
#     print('提现'.center(50,'*'))
# def transfer():
#     print('转账'.center(50,'*'))
#
# func_dic={'1':['登录',login],
#           '2':['注册',register],
#           '3':['提现',withdraw],
#           '4':['转账',transfer]}
#
# while True:
#     print('0 退出')
#     for i in func_dic:
#         print ('%s %s'%(i,func_dic[i][0]))
#     choice = input('输入编号:').strip()
#     if choice == '0':
#         break
#     if choice in func_dic:
#         func_dic[choice][1]()
#     else:
#         print('命令错误,请重新输入')


函数嵌套

函数的嵌套调用:在调用一个函数的过程中,该函数内部又调用了其它函数
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)
print(res3)
max4 (13123, 434252, 212141, 341414) #434252

名称空间与作用域


内置名称空间:放的是python自带的名字,print\len\input
          生命周期:解释器启动则产生,解释器关闭则销毁
全局名称空间:放的是*名字
          生命周期:运行python文件立即产生,python文件运行完毕则结束
局部名称空间:放的是函数内的名字
          生命周期:调用函数则产生,函数调用完毕则销毁

结论:            L E  G    B
名字的查找优先级  局部-全局-内置 基于自己当前所在位置向外查找 LEGB

giobal关键字

global关键字
# 在局部修改全局的名字对应的值(不可变类型)
# x=1
# def func():
#     global x   #global 修改不可变类型
#     x=222
# func()
# print(x) #222
nonlocal关键字:声明一个名字是来自于外层函数,如果外层没有不会找到全局,会报错

x=1
def f1():
   x=2        #若是没有x=2,会报错
   def f2():
       nonlocal x
       x=3
   f2()
   print(x)
f1()     #3



全局作用域:全局存活,全局有效
局部作用域:临时存活,局部有效

闭包函数

闭包函数=函数对象+函数嵌套定义+名称空间与作用域
闭函数:定义在函数内部的函数
包函数:内部函数引用了一个外层函数的名字

def foo():
x=111
def wrapper():
print(x)
return wrapper
f=foo()
print(f)
f() #111

闭包函数的作用:闭包函数是一种为函数体传参的方案

为函数体传参:
一:直接使用形参
def wrappera(x):
print(x)
wrapper(111)
wrapper(222)
wrapper(333)
二:闭包函数
def outter():
x=111
def wrapper():
print(x)
return wrapper
f=outter()
f()

def outter(x):
def wrapper():
print(x)
return wrapper
f=outter(111)
f()

上一篇:34.Python:装饰器


下一篇:css 模拟radio的样式