函数对象与闭包函数

一:名称空间的作用域

作用域
名称空间所能够作用的范围

内置名称空间
程序任何阶段任何位置均可使用(全局有效)
全局名称空间
程序任何阶段任何位置均可使用(全局有效)
局部名称空间
一般情况下只在各自的局部名称空间中有效
image
二:global与nonlocal关键字使用

x = 111
def index():
	局部修改全局变量 需要使用关键字声明
	global x
	x = 222
index()
print()


name_list = ['jason', 'kevin']
def index():
	name_list.append('heiheihei')
index()
print(name_list)

如果想在修改全局数据
	如果数据为不可变类型则需要关键字global声明
	如果数据为可变类型则无需关键字global声明
	
	
可变类型:
def index():
      x = 111
    l1 = [11,22]
     def func():
          内部局部修改外部局部
        l1.append(333)
    func()
    print(l1)
index()

不可变类型:
def index():
	x = 111
	def func():
		nonlocal x
		x = 222
	func()
	print(x)
index()

如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明

image

二:global与nonlocal关键字使用

x = 111
def index():
	局部修改全局变量 需要使用关键字声明
	global x
	x = 222
index()
print()


name_list = ['jason', 'kevin']
def index():
	name_list.append('heiheihei')
index()
print(name_list)

如果想在修改全局数据
	如果数据为不可变类型则需要关键字global声明
	如果数据为可变类型则无需关键字global声明
	
	
可变类型:
def index():
      x = 111
    l1 = [11,22]
     def func():
          内部局部修改外部局部
        l1.append(333)
    func()
    print(l1)
index()

不可变类型:
def index():
	x = 111
	def func():
		nonlocal x
		x = 222
	func()
	print(x)
index()

如果想要在内部的局部修改外部局部的不可变类型数据
需要关键字nonlocal声明

三:函数对象(函数名)

	函数名遇到括号就会调用
用法1:函数名可以当作变量名赋值
def index()
	print('form index')
a = index
a()  # 本质就是在调用index函数

用法2:函数名还可以当做函数的实参
 def index():
     print('from index')
 def func(a):
     print(a)
     a()
     print('from func')
 func(index)

用法3:函数名还可以当做函数返回值
 def index():
     print('from index')
 def func():
     print('from func')
     return index
 res = func()  # 调用func并接受func的返回值
 res()
 

用法4:函数名可以当做容器类型(内部可以存放多个数据)的元素
def index():
	print('from index')
l = [111, 222, 333, index()]
print(l)



def register():
	print('注册功能')
def login():
	print('登录功能')
def shopping():
	print('购物功能')
def transfer():
	print('转账功能')
def withdraw():
	print('提现功能')
def check_order():
	print('查看订单')

func_dic = {
            '1':['注册功能', register],
            '2':['登录功能', login],
            '3':['购物功能', shopping],
            '4':['转账功能', transfer],
            '5':['提现功能', withdraw],
            '6':['查看订单', check_order],
}

# 循环
while True:

    print('欢迎进入ATM购物车')
    # 退出选项
    print('0 退出功能')
    # 循环将字典给i 字典暴露外界的值只有k
    for i in func_dic:
        # 打印输出 字典暴露外界只要k,i取k值,字典里面通过k 索引列表内的值0
        print(i, func_dic[i][0])

        # 获取用户输入选项
        choicn = input('请输入您的功能选项:')
        # 判断用户选项是否为退出
        if choicn == '0':
            print('已退出系统')
            break
        # # 判断用户输入的 在字典里进入
        if choicn in func_dic:
        # 用户输入的对应着字典内的k值 索引取1,小括号代表调用函数
            func_dic[choicn][1]()
        else:
            print('抱歉暂无该功能')

image

四:函数的嵌套调用

嵌套调用:函数内部调用其他函数
def index():
	print('from inde')
def func(
	index()
	print('from func')
func()

嵌套函数比大小
def my_max(a, b):
	if a > b:
		return:
	return b
	
def many_max(x,y,z,m):
	res = my_max(x,y)
	res1 = my_max(re1,z)
	res2 = my_max(res2,m)
	teturn res2
ret = many_max(1,2,3,4)
print(ret)

image

五:函数的嵌套定义

函数体内部定义其他函数
将复杂的功能全部隐藏起来 暴露一个简单的接口
def all_func(type):
    def register():
        print('注册功能')
    def login():
        print('登录功能')
    def transfer():
        print('转账功能')
    def shopping():
        print('购物功能')
    # 这里仅仅是延时嵌套定义的现象 暂不考虑优化
    if type == '1':
        register()
    elif type == '2':
        login()
    elif type == '3':
        transfer()
    elif type == '4':
        shopping()
    else:
        print('不知道啥功能')

all_func('3')

六:闭包函数

 闭包函数
    闭: 定义在函数内部的函数         		函数的嵌套定义
    包: 内部函数使用了外部函数名称空间中的名字

 只有符合上述两个特征的函数才可以称之为'闭包函数'
 
 
 def outer():
    x = 222
    def index():
         闭包函数的作用:现在的index,以后在调用的时候,里面所用到的数据永远不会受外		  界所干扰,永远用的是222
          不受外界干扰,永远用的固定的,
        print('from index', x)
    return index
res = outer()
x = 444
res()
闭包函数其实是给函数传参的第二种方式
方式1:函数体代码需要用到数据 直接在括号内定义形参即可
def index(username):
     print(username)
 def my_max(a, b):
     if a > b:
         return a
     return b
 方式2:利用闭包函数
 def outer(x,y):
     # x = 2
     # y = 40
     def my_max():
         if x > y:
             return x
         return y
     return my_max
 res = outer(2,40)
 print(res())
 print(res())

image

posted @ 2021-11-16 23:11  AlexEvans  阅读(51)  评论(0编辑  收藏  举报