装饰器练习

1.写出完整的装饰器器(不用考虑带参装饰器,就是普通装饰器)语法

def outter(func):
    def inner(*args, **kwargs):
        pass
        res = func(*args, **kwargs)  # *args, **kwargs 目的为打散参数
        pass
        return res

    return inner

2.有个计算两个数和的方法,为其添加一个确保两个参数都是int或float类型的装饰器,保证运算不会抛异常

def check_numtype(func):
    def inner(*args, **kwargs):
        for i in args:
            if not isinstance(i, (int, float)):
                print("参数必须为int或float类型")
                return
        res = func(*args, **kwargs)
        return res

    return inner


@check_numtype
def sum_twonumber(num1, num2):
    return num1 + num2


#sum_twonumber('a', 2)

3.有个一次性录姓名并返回人名的方法(人名只考虑存英文),为其添加一个装饰器,使得处理后人名首字母一定大写

def judge_firstupperletter(func):
    def inner(*args, **kwargs):
        # for i in args:
        #     if not i[0].isupper():
        #         print("首字母需大写")
        #         return
        res = func(*args, **kwargs)
        return res.title()

    return inner


@judge_firstupperletter
def inputname(person_name):
    if person_name.isalpha():
        return person_name


# print(inputname('jeff'))

1.原功能:entry_grade
*) 可以完成『成绩录入功能』
– 可以重复录入成绩,默认所有输入都是合法的(1~100之间的数)
– 当录入成绩为0时,结束成绩的录入
– 将录入的成绩保存在列表中并返回给外界,eg:[90, 80, 50, 70]
2.选择课程装饰器:choose_course
*) 为『成绩录入功能』新增选择课程的拓展功能,达到可以录入不同学科的成绩
– 可以重复输入要录制的学科名,然后就可以进入该门学科的『成绩录入功能』,录入结束后,
可以进入下一门学科成绩录入
– 当输入学科名为q时,结束所有录入工作
– 将学科成绩保存在字典中并返回给外界,eg:{‘math’:[90, 80, 50, 70], ‘english’:
[70, 50, 55, 90]}
3.处理成绩装饰器:deal_fail
*) 可以将所有录入的成绩按60分为分水岭,转换为 “通过” | “不通过” 进行存储
– 如果只对原功能装饰,结果还为list返回给外界,eg:[“通过”, “通过”, “不通过”, “通
过”]
– 如果对已被选择课程装饰器装饰了的原功能再装饰,结果就为dict返回给外界,eg:
{‘math’:[“通过”, “通过”, “不通过”, “通过”], ‘english’:[“通过”, “不通过”, “不通过”,
“通过”]}
‘’’

def deal_fail(func):
    def inner():
        pass_score = 60
        res = func()
        if isinstance(res, dict):
            for v in res.values():
                for k, i in enumerate(v):
                    if int(i) < pass_score:
                        v[k] = '不通过'
                    else:
                        v[k] = '通过'

        if isinstance(res, list):
            for i, v in enumerate(res):
                if int(v) < pass_score:
                    res[i] = '不通过'
                else:
                    res[i] = '通过'
        return res

    return inner


def choose_course(func):
    def inner():
        course_dic = {}
        while True:
            course = input("course(input q to exit): ")
            if course == 'q':
                return course_dic
            res = func()
            course_dic[course] = res

        return course_dic

    return inner


@choose_course
@deal_fail
def entry_grade():
    grade_list = []
    while True:
        grade = input("grade(input 0 to exit): ")
        if grade == '0':
            break
        grade_list.append(grade)
    return grade_list


print(entry_grade())
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值