day11:装饰器

1,引子,计算函数的运行时间:

import time

def func():
    time.sleep(0.01)  # 为了计算运行时间差的时候有值
    print("func")

def timer(f): # 装饰器函数
    def inner():
        start_time = time.time() # 从1970年开始的毫秒数
        f() # 内部函数应用外部函数变量,闭包,被装饰的函数
        end_time = time.time()
        exec_time = start_time - end_time

    return inner()

2,装饰器的作用,不想修改函数的调用方式,但是还想在原来的函数前后添加功能,timer就是一个装饰器函数,只是对一些函数有一些装饰作用

3,语法糖,@装饰器函数名

import time  #获取当前时间

def timer(f): # 装饰器函数
    def inner():
        start_time = time.time() # 从1970年开始的毫秒数
        f() # 内部函数应用外部函数变量,闭包,被装饰的函数
        end_time = time.time()
        exec_time = start_time - end_time

    return inner()

@timer
def func():
    time.sleep(0.01)  # 为了计算运行时间差的时候有值,让程序在这儿停一会儿
    print("func")

4,开放封闭原则:对扩展是开放的,对修改是封闭的

5,前面的装饰器是装饰无参数无返回值的,如果想要装饰有参数有返回值的函数

import time  #获取当前时间


def timer(f): # 装饰器函数
    def inner(a):
        start_time = time.time()
        ret = f(a)
        end_time = time.time()
        exec_time = start_time - end_time
        return ret

    return inner  # 这儿记住一定不要加括号


@timer
def func(a):
    time.sleep(0.01)
    print("func")
    return 2


ret = func(1)
print(ret)

6,想要动态传入参数,怎么办?

import time  #获取当前时间


def timer(f): # 装饰器函数
    def inner(*args,**kwargs):
        start_time = time.time()
        ret = f(*args,**kwargs)
        end_time = time.time()
        exec_time = start_time - end_time
        return ret

    return inner


@timer
def func(a):
    time.sleep(0.01)
    print("func")
    return 2


ret = func(1)
print(ret)

7,一个标准的装饰器

def wrapper(func): # 装饰器函数
    def inner(*args,**kwargs):

        # 被装饰函数之前做的事情
        ret = func(*args,**kwargs)
        # 被装饰函数之后做的事情
        return ret

    return inner


@wrapper  # wahaha = wrapper(wahaha)
def wahaha(a):
    print("func")
    return 2


ret = wahaha(1)
print(ret)

8,作业题-:

# 写函数,接收n个数字,求这些参数数字的和

def sum_para(*args):
    sum = 0
    for i in args:
        sum = sum + i
    return sum

print(sum_para(1,2,3,4,5))

9,作业题二:

# 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么?
a = 10
b = 20
def test5(a,b):
    print(a,b)

c = test5(b,a)
print(c)

运行结果:
20 10
None

10,作业题三:

# 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么?
a = 10
b = 20
def test5(a,b):
    a = 3
    b = 5
    print(a,b)

c = test5(b,a)
print(c)

运行结果:
3 5
None

11,作业题四:

# 写函数,检查获取传入列表或者元祖对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者
def func(li):
    return li[1::2]

ret = func([1,2,3,4,5,6,7,8])
print(ret)

运行结果:
[2, 4, 6, 8]

12,作业题五:

# 写函数,判断用户输入的值(字符串,列表,元祖)长度是否大于5
def func(x):
    return len(x) > 5

ret = func((1,2,3,4,5,6,7))
print(ret)
ret = func([1,2,3])
print(ret)

运行结果:
True
False

13,作业题六:

# 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。
def func(li):
    return li[:2] # 因为小于两个会直接全部返回,所以这个地方判断也不用添加了

print(func([1,2,3,4]))
print(func([3]))

14,作业题七

# 写函数,计算传入字符串中数字,字母,空格以及其他的个数,并返回结果

str1 = input(">>>")
def func(s):

    dict1 = {"num":0,"alpha":0,"space":0,"other":0}
    for i in s:
        if i.isdigit():  # 函数调用别忘了加括号
            dict1["num"] += 1
        elif i.isalpha():
            dict1["alpha"] += 1
        elif i.isspace():
            dict1["space"] += 1
        else:
            dict1["other"] += 1

    return dict1   # 返回多个值的时候,为了让外面看清楚哪个是哪个,所以用了字典类型

ret = func(str1)
print(ret)

运算结果:
{'num': 3, 'alpha': 17, 'space': 1, 'other': 0}

15,

猜你喜欢

转载自www.cnblogs.com/lisa-blog/p/10074813.html