Python全栈学习Day11-装饰器 语法糖

昨日作业讲解

写函数,接收N个数字,求这些数字的和

def sum_func(*args):
    total = 0
    for i in args:
        total += i
    return total


a = sum_func(1, 2, 3, 4, 5, 6, 7, 8, 9)
print(a)

读代码,猜测abc分别是什么

a = 10
b = 20


def func(a, b):
    print(a, b)


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

在这里插入图片描述

读代码,回答代码打印出来的abc分别是什么?

a = 10
b = 20


def func(a, b):
    print(a, b)
    a = 3
    b = 5
    return a,b


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

在这里插入图片描述
写函数,检查获取传入列表或元祖对象的所有奇数位素引(不是奇数)对应的元素,并将其作为新列表返回给调用者

def func(l):
   return l[1::2] #切片,有规律的取值


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

写函数,判断用户传入的对象(字符串 列表 元祖)长度是否大于5

def func(x):
    return len(x) > 5


result = func('abcdef')
print(result)

写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

def func(l):
    if len(l) > 2:
        return l[:2]


result = func([1, 2, 3, 4, 5])
print(result)

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

def func(s):
    # num = 0  # 计算数字的个数
    # alpha = 0  # 计算字母的个数
    # space = 0  # 计算空格的个数
    # other = 0  # 计算其他码的个数
    dic = {'num': 0, 'alpha': 0, 'space': 0,'other': 0}
    for i in s:
        if i.isdigit():
            dic['num'] += 1
        elif i.isalpha():
            dic['alpha'] += 1
        elif i.isspace():
            dic['space'] += 1
        else:
            dic['other'] += 1
    return dic


result = func('sahjdhh17 8hqjsjh2 2hjss?sadaa_2asda 2ada2rdd  sdads ad   ')
print(result)

写函数,检查用户传入的对象(字符串,列表,元组)的每一个元素是否含有空内容,并返回结果

def func(x):
    if type(x) is str and x:  # 参数是字符串,且不为空
        for i in x:
            if i == ' ':
                return True
    elif type(x) is list or type(x) is tuple:
        for i in x:
            if not i:
                return True
    elif not x:
        return True


res = func([1, ''])
print(res)

写函数,检查传入字典的一个Value的长度,如果大于2那么仅保留两个长度的内容,并将内容返回给调用者

def func(dic):
    for k in dic:
        if len(dic[k]) > 2:
            dic[k] = dic[k][:2]
    return dic


dic = {'k1': 'abcd', 'k2': [1, 2, 3, 4]}
res = func(dic)
print(res)

写函数,接收两个数字参数,返回比较大的哪个数字
第一种:

def func(a, b):
    if a > b:
        return a
    else:
        return b


print(func(1, 5))

第二种:运用三元运算

def func(a, b):
    c = a if a > b else b
    return c


print(func(1, 5))

写函数,用户传入修改的文件名,与要修改的内容,执行函数,完成整个文件的批量修改操作(进阶

def func(filename, old, new):
    with open(filename, encoding='utf-8') as f, open('%s.bak' % filename, 'w', encoding='utf-8') as f2:
        for line in f:
            if old in line:
                line = line.replace(old,new)
                f2.write(line)
    import os
    os.remove(filename)
    os.rename('%s.bak' % filename, filename)

装饰器

意义:不修改函数的调用方式,但还可以在原函数前后添加功能

time方法

延时

   import  time
    time.sleep(5)
    print('哈哈哈')

计算运行时间

import time


def func():
    start = time.time()  # 获取当前时间
    print('计数器')
    end = time.time()
    return end-start


res = func()
print(func())

单独用函数写计时器

import time


def timer(f):
    start = time.time()  # 获取当前时间
    f()
    end = time.time()
    print(end - start)


def func():
    time.sleep(2)
    print('计数器')


timer(func)

语法糖

标准格式

def wrapper(f):
    def inner(*args, **kwargs):
        ret = f(*args, **kwargs) // 被装饰的函数
        return ret
    return inner

@wrapper
def func():
    print('hello world')
    a = 1
    return  a


result = func()
print(result)

在这里插入图片描述

在以下代码中@timer 和 func = timer(func)作用相同

import time
    
    
    def timer(f):
        def inner():
            start = time.time()  # 获取当前时间
            f()
            end = time.time()
            print(end - start)
        return inner
    
    @timer
    def func():
        time.sleep(0.05)
        print('计数器')
    
    
    # func = timer(func)

func()

返回值‘hello’

import time


def timer(f):
    def inner():
        start = time.time()  # 获取当前时间
        ret = f()
        end = time.time()
        print(end - start)
        return ret
    return inner

@timer
def func():
    time.sleep(0.05)
    print('计数器')
    return 'hello'


# func = timer(func)
res = func()
print(res)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值