名称空间与函数知识进阶

名称空间与函数知识进阶

  • 名称空间的作用域
  • global与nonlocal关键字使用
  • 函数对象(函数名)
  • 函数的嵌套调用
  • 函数的嵌套定义
  • 必包函数
  • 装饰器的概念
    image

一、名称空间的作用域
作用域:
名称空间所能作用的范围
内置名称空间:
程序任何阶段任何位置均可使用(全局有效)
全局名称空间:
程序任何阶段任何位置均可使用(全局有效)
局部名称空间:
一般情况下只在各自的局部名称空间中有效
二、global与nonlocal关键字使用
如果想在局部修改全局数据
如果数据为不可变类型则需要关键字global声明
如果数据为可变类型则无需关键字global声明


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


点击查看代码
def index():
	# x
	x = 111
	def func():
	    #内部局部修改外部局部
		l1.append(333)
	func()
	print(11)
index()
如果想要在内部的局部修改外部局部的不可变类型数据

需要关键字nonlocal声明
三、函数对象(函数名)
函数名遇到括号就会调用
用法1:函数名可以当做变量名赋值
def index():
print('from index')
a = index
a() #本质就是在调用index函数
用法2:函数名还可以当做啊函数的实参
def index():
print('from index')
def func(a):
print('from func')
fun(index)
用法3:函数名还可以当做函数返回值
def index():
print('from index')
def func():
print('from func')
renturn index
res = func() #调用func并接受func的返回值
res()
用法4:函数名可以当作容器类型(内部可以存放多个数据)的元素
def index():
print('from index')
l = [111, 222, 333, index()]
print(1)
四、函数的嵌套定义
函数体内部定义其他函数
将复杂的功能全部隐藏起来 暴露一个简单的接口

点击查看代码
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():
#         print('from index', x)
#     return index
闭包函数其实是给函数传参的第二种方式 方式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())
六、装饰器

装饰器并不是一个新的知识
而是我们之前所学习的名称空间、函数对象、必报函数组合而来的

器:指的是工具
装饰:给被装饰对象添加额外的功能
装饰器的原则
开放封闭原则
开发:对扩展开放
封闭:对修改封闭

装饰器核心思想
 在不改变被“装饰对象内部代码”和“原有调用方式”的基础之上添加额外功能
点击查看代码
def index():
    print('from index')
index()
posted @ 2021-11-16 15:47  Roseblacko  阅读(39)  评论(0编辑  收藏  举报