一、global与nonlocal关键字

global方法:用于局部名称空间修改全局名称空间中的名字绑定关系

money = 666

def index():
    global money
    money = 123

index()
print(money)

nonlocal方法:用于局部名称空间修改外层局部名称空间中的名字绑定关系

def index():
    name = 'jason'
    def inner():
        nonlocal name
        name = 'kevin'
    inner()
    print(name)

index()

二、函数名的多种用法

函数名其实绑定的也是一块内存地址 只不过该地址里面存放的不是数据值而是一段代码 函数名加括号就会找到该代码并执行

方法一:

# 可以当做变量名赋值
def index():pass
res = index
res()

'''函数名不加括号就是函数的内存地址'''

方法二:

# 函数名可以当成函数的实参
def index():
	print('from index')
def func(a):
	print(a)
	a(
func(index)

方法三:

# 函数名可以当成函数的返回值
def index():
	print('from index')

def func():
	print('from func')
	return index
res = func()
print(res)
res()

def index():
	print('from index')
def func():
	print('from func')
	return func

res = index()
print(res)
res()

方法四:

# 可以当做容器类型(可以存放多个数据的数据类型)的数据
def register():
	print('注册功能')


def login():
	print('登录功能')


def withdraw():
	print('提现功能')


def transfer():
	print('转账功能')


def shopping():
	print('购物功能')


# 定义功能编号与功能的对应关系
func_dict = {
	'1': register,
	'2': login,
	'3': withdraw,
	'4': transfer,
	'5': shopping
}

while True:
	print("""
	1.注册功能
	2.登录功能
	3.提现功能
	4.转帐功能
	5.购物功能
	""")
	choice = input('>>>:').strip()
	if choice in func_dict:
		func_name = func_dict.get(choice)
		func_name()
	else:
		print('功能编号不存在')

三、函数的嵌套调用

函数的嵌套:在函数里面还有函数,分为外函数和内函数

# 在一个函数里面调用别的函数
def print1():
    print("这是第一个函数")
def print2():
    print("这是定义的第二个函数")
    print1() #在print2()中调用print1()
print2()

四、函数的嵌套定义

在函数内部定义的函数要在函数内部调用

# 在函数内部定义函数
# 把复杂的功能隐藏起来,暴露给外界一个简单的接口

def all_func(type):
    
    def register():
        pass
    def login():
        pass
    
    def shopping():
        pass
    
    def transfer():
        pass
    
    if type == '1':
        register()
    elif type == '2':
        login()
    elif type == '3':
        shopping()
    elif type == '4':
        transfer()
    else:
        print('不存在')
        
all_func('1') # 注册功能
all_func('2') # 登录

五、闭包函数

  • :定义在函数内部的函数

  • :内部函数使用外部函数名称空间中得名字

只有同时满足以上两个条件的函数,才是闭包函数

给函数体代码传参的方式1:代码里面缺什么变量名形参里面就补什么变量名

def register(name,age):
	print(f"""
	姓名:{name}
	年龄:{age}
	""")
register('tony', 18)

给函数体代码传参的方式2:闭包函数

def outer(name, age):
	# name = 'jason'
	# age = 18
	def register():
		print(f"""
		姓名:{name}
		年龄:{age}
		""")
	return register
res = outer('tony', 18)
res()
res()
res = outer('kevin', 28)
res()
res()

六、装饰器简介

概念

在不改变被装饰对象原代码和调用方式的情况下给被装饰对象添加新的功能

本质

装饰器并不是一门新的技术 而是由函数参数、名称空间、函数名多种用法、闭包函数组合到一起的结果

def index():
	print('from index')
	index()
'''给index函数添加统计执行的时间'''

import time

def index():
    time.sleep(3)
    print('from index')

# 1. 在函数调用之前打印此时的时间
start_time = time.time()
index()

# 2. 在函数调用完毕之后的时间
end_time = time.time()

print('index函数一共执行了%s秒' % (end_time - start_time))