global与nonlocal关键字、函数名的多种用法、函数的嵌套调用、函数的嵌套定义、闭包函数、装饰器简介

一、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))
posted @   吴仁耀  阅读(29)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
  1. 1 原来你也在这里 周笔畅
  2. 2 世间美好与你环环相扣 柏松
  3. 3 起风了 吴青峰
  4. 4 极恶都市 夏日入侵企划
世间美好与你环环相扣 - 柏松
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

作词 : 尹初七

作曲 : 柏松

编曲 : 彭圣杰

偏偏秉烛夜游

偏偏秉烛夜游

午夜星辰 似奔走之友

爱你每个结痂伤口

酿成的陈年烈酒

入喉尚算可口

入喉尚算可口

怎么泪水 还偶尔失守

邀你细看心中缺口

裂缝中留存 温柔

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

让樱花偷偷 吻你额头

让世间美好 与你环环相扣

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

此时已莺飞草长 爱的人正在路上

此时已莺飞草长 爱的人正在路上

我知他风雨兼程 途经日暮不赏

穿越人海 只为与你相拥

此刻已皓月当空 爱的人手捧星光

我知他乘风破浪 去了黑暗一趟

感同身受 给你救赎热望

知道你不能 还要你感受

知道你不能 还要你感受

让星光加了一点彩虹

当樱花开的纷纷扬扬

当世间美好 与你环环相扣

特别鸣谢:槿葵,我们的海报制作妹妹。

原唱:柏松

吉他:柏松

和声:柏松

录音:柏松

混音:张强

点击右上角即可分享
微信分享提示