python基础知识

640 阅读4分钟

global与nonlocal

  • 局部名称空间直接修改全局名称空间中的数据 +image.png

  • 内层局部名称空间修改外层局部名称空间中的数据

image.png

函数名的多种用法

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

当成变量名赋值
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('功能编号不存在')

闭包函数

定义在函数内部的函数 并且用到了外部函数名称空间中的名字
1 定义在函数内部
2 用到外部函数名称空间中的名字
def index():
    name = 'jason'
    def inner():
      print(name)
  
闭包函数实际应用就是另外一种给函数体代码传参的方式
方式1 :代码缺什么变量名形参里里面就补什么变量名

image.png

方式2:闭包函数

image.png

装饰器简介

概念:在不改变被装饰对象原代码和调用方式的情况下给装饰对象添加新功能
本质:并不是一门新的技术 而是由函数参数 名称空间 函数名多种用法 闭包函数组合到一起的结果
口诀:对修改封闭 对扩展开放
 import time
print(time.time()) 时间戳(距离1970-01-01 00:00:00所经历的秒数)
time.sleep(3)
print('睡醒了 干饭')

装饰器推导流程

import time

def index():
    time.sleep(3)
    print('from index')
def home():
    time.sleep(1)
    print('from home')
  • 直接在调用index函数的前后添加代码

image.png

  • 2.index调用的地方较多 代码不可能反复拷贝>>>:相同的代码需要在不同的位置反复执行>>>:函数

image.png

  • 3.函数体代码写死了 只能统计index的执行时间 如何才能做到统计更多的函数运行时间 直接传参变换统计的函数

image.png

  • 4.虽然实现了一定的兼容性 但是并不符合装饰器的特征 第一种传参不写 只能考虑闭包

image.png

  • 5.调用方式还是不对 如何变形>>>:变量名赋值绑定

image.png

  • 6.上述装饰器只能装饰无参函数 兼容性太差

image.png

  • 7.被装饰的函数不知道有没有参数以及有几个参数 如何兼容

image.png

  • 8.如果被装饰的函数有返回值

image.png

装饰器模板

def outer(func):
    def inner(*args, **kwargs):
        # 执行被装饰对象之前可以做的额外操作
        res = func(*args, **kwargs)
        # 执行被装饰对象之后可以做的额外操作
        return res
    return inner
    

装饰器语法糖

语法糖会自动将下面紧挨着的函数名当做第一个参数自动传给@函数调用

ef outer(func_name):
    def inner(*args, **kwargs):
        print('执行被装饰对象之前可以做的额外操作')
        res = func_name(*args, **kwargs)
        print('执行被装饰对象之后可以做的额外操作')
        return res
    return inner

@outer  # func = outer(func)
def func():
    print('from func')
    return 'func'

@outer  # index = outer(index)
def index():
    print('from index')
    return 'index'

func()
index()


3.编写一个用户认证装饰器 函数:register login transfer withdraw 基本要求 执行每个函数的时候必须先校验身份 eg: jason 123 拔高练习(有点难度) 执行被装饰的函数 只要有一次认证成功 那么后续的校验都通过 提示:全局变量 记录当前用户是否认证

 2.装饰器:可以直接写模板 也可以先写核心代码
def login_auth(func_name):
    def inner(*args, **kwargs):
        username = input('username>>>:').strip()
        password = input('password>>>:').strip()
        if username == 'jason' and password == '123':
            res = func_name(*args, **kwargs)
            return res
        else:
            print('用户权限不够 无法调用函数')

    return inner
 1.定义函数
@login_auth
def register():
    print('注册功能')


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


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


@login_auth
def withdraw():
    print('提现功能')
register()
login()
transfer()
withdraw()