首页 > 其他分享 >函数名的多种用法及装饰器

函数名的多种用法及装饰器

时间:2022-10-11 17:47:30浏览次数:46  
标签:index 函数 用法 func time print 装饰 def

目录

global与nonlocal

money = 666
def index():
    global money
    money = 123
index()
print(money)  # 123
"""
局部名称空间直接修改全局名称空间中的数据
"""

image

def index():
    name = 'jason'
    def inner():
        nonlocal name
        name = 'kevin'
    inner()
    print(name)
index()  # kevin
"""
内部局部名称空间修改外层局部名称空间中的数据
"""

image

函数名的多种用法

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

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

image

2. 可以当做函数的参数
def index():
    print('from index')
def func(a):
    print(a)  # 打印了a变量名绑定的数据值index函数的内存地址
    a()  #类似于执行了index()函数
func(index)

image

3. 可以当做函数的返回值

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

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

res = func()  # from func
print(res)   #打印index函数内存地址
res()   # 相当于执行index()函数的代码块 from index


def index():
    print('from index')
    def func():
        print('from func')
    return func
res = index()  # from index
print(res)  # 打印func函数的绑定内存地址
res()   # 相当于执行func()函数的代码块 from func

image

image

4. 可以当做容器类型(可以存放多个数据的数据类型)的数据
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: 代码里面缺什么变量名形参里面就补什么变量名
def register(name,age):
    print(f"""
    姓名:{name}
    年龄:{age}
    """)
register('jason', 18)

# 给函数体代码传参的方式2:闭包函数
def outer(name, age):
    def register():
        print(f"""
        姓名:{name}
        年龄:{age}
        """)

    return register


res = outer('jason', 18)
res()
res()

image

image

装饰器简介

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

count = 0
#循环之前先获取时间戳
start_time = time.time()
while count < 1000:
    print('呵呵')
    count += 1
end_time = time.time()
print('循环消耗的时间:', end_time - start_time)

装饰器推导流程

import  time
def index():
    time.sleep(3)
    print('from index')
def home():
    time.sleep(1)
    print('from home')
    
'''1.直接在调用index函数的前后添加代码'''
start_time = time.time()
index()
end_time = time.time()
print('函数index的执行时间为>>>', end_time - start_time)

image

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

'''2.index调用的地方较多 代码不可能反复拷贝>>>:相同的代码需要在不同的位置反复执行>>>:函数'''
def get_time():
    start_time = time.time()
    index()
    end_time = time.time()
    print('函数index的执行时间为>>>', end_time-start_time)
get_time()

image

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

'''3.函数体代码写死了 只能统计index的执行时间 如何才能做到统计更多的函数运行时间 直接传参变换统计的函数'''
def get_time(xxx):   #xxx为形参,接收函数名get_time实参传进来的函数
    start_time = time.time()
    xxx()  # 接收index函数名并执行index()函数体内的代码
    end_time = time.time()
    print('函数的执行时间为>>>', end_time - start_time)
get_time(index) # 接收index函数名并执行get_time函数体内代码
get_time(home)  # 接收home函数名并执行get_time函数体内代码

image

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

'''4.虽然实现了一定的兼容性 但是并不符合装饰器的特征 第一种传参不写 只能考虑闭包'''
def outer(xxx):
    # xxx = index
    def get_time():
        start_time = time.time()
        xxx()
        end_time = time.time()
        print('函数的执行时间为>>>', end_time - start_time)
    return get_time
res = outer(index)
res()
res1 = outer(home)
res1()

image

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

'''5.调用方式还是不对 如何变形>>>:变量名赋值绑定(******)'''
def outer(xxx):
    def get_time():
        start_time = time.time()
        xxx()
        end_time = time.time()
        print('函数的执行时间为>>>', end_time - start_time)
    return get_time
# res = outer(index)  #赋值符号的左边是一个变量名 可以随意包括命名
# res()
# res1 = outer(home)
# res1()
index = outer(index)
index()
home=outer(home)
home()

image

import time
'''6.上述装饰器只能装饰无参函数 兼容性太差'''
def func(a):
    time.sleep(0.1)
    print('from func', a)

def func1(a,b):
    time.sleep(0.2)
    print('from func1', a, b)

def func2():
    time.sleep(0.3)
    print('from func2')

def outer(xxx):
    def get_time(a, b):
        start_time = time.time()
        xxx(a, b)
        end_time =time.time()
        print('函数的执行时间为>>>:',end_time - start_time)
    return get_time
func1 = outer(func1)
func1(1, 2)

image

import time
'''7.被装饰的函数不知道有没有参数及有几个参数 如何兼容'''
def func(a):
    time.sleep(0.1)
    print('from func', a)

def func1(a,b):
    time.sleep(0.2)
    print('from func1', a, b)

def outer(xxx):
    def get_time(*args, **kwargs):  # get_time(1,2,3)  args=(1,2,3)
        start_time = time.time()
        xxx(*args, **kwargs)   # xxx(*(1,2,3))   xxx(1,2,3)
        end_time =time.time()
        print('函数的执行时间为>>>:',end_time - start_time)
    return get_time
func = outer(func)
func(123)
func1=outer(func1)
func1(1,2)

装饰器模板

装饰器语法糖

作业

标签:index,函数,用法,func,time,print,装饰,def
From: https://www.cnblogs.com/winter-yu1989/p/16780001.html

相关文章

  • mysql 时间函数
    时间格式转换标准时间格式:2017-05-1211:41:55--字符串转换为日期函数:str_to_date(str,format)SELECTSTR_TO_DATE('06.05.201719:40:30','%m.%d.%Y%H:%i:%s');--......
  • Phoenix不支持having函数的情况(举例)
     同一sql语句,在mysql可以查询成功,查询出最大“平均值”,以及对应的sno;在Phoenix会报错,提示sno不属于聚和函数也不在groupby里面,aggregatemaynotcontainscolumnsnot......
  • golang-set包的用法及源码解析
    Set是一种基本的数据结构,它具备确定性、互异性、无序性三个特点。因此,在开发过程中我们通常用它来判断一些数据的集合与另一个数据集合或者元素的包含关系。在大部分开发......
  • 装饰器
    目录前言函数名的多种用法闭包函数补充time模块时间戳装饰器概念装饰器模板使用装饰器模板装饰器推导过程前言函数名的多种用法#1.函数名是名字defindex():p......
  • qt 容器 函数指针
    private:typedefvoid(MainWindow::*pfunc)();QHash<QString,pfunc>func_map_enter;voidMainWindow::init_qmap(void){func_map_enter.insert("page_n......
  • php中array_filter()、array_map()、array_walk()三者的用法和区别
    array_filter()重点在于过滤(而不是新增)某个元素,当你处理到一个元素时,返回过滤后的数组 array_map()重点在于遍历一个数组或多个数组的元素,返回一个新的数组 array_walk()......
  • python中items()函数作用
    参考链接:https://www.runoob.com/python3/python3-att-dictionary-items.htmlhttps://blog.csdn.net/weixin_43505418/article/details/115407835......
  • 没有窗口函数,你能很快做出这道MySQL面试题吗?
      这是另外一个面试题目,相对难说有点难度,由于MySQL8.0以前没有“窗口函数”,当你碰到了这个题目,你是否能够很快写出这个答案来呢?请使用上述数据,完成如下效果:建表语句creat......
  • vue中is的作用和用法
    is的作用<ul><li></li><li></li><li></li></ul>总所周知,ul里面嵌套li的写法是html语法的固定写法(还有如table,select等)。//code1<ul><my-component></my-componen......
  • js中 问号点(?.)和双问号(??)的用法
    当访问多层对象属性(比如res.data.list)时,如果属性res.data为空,则会报引用错误,为此我们不得不这么处理:letdataList=res&&res.data&&res.data.list//......