1.写出完整的装饰器(不用开了带参装饰器,就是普通装饰器)语法
2.有一个计算两个数和的方法,为其添加一个确保两个参数都是int或float类型的装饰器,保证运算不会抛异常
3.有一个一次性录入人名并返回人名的方法(人名只考虑存英文),为其添加一个装饰器,确保人名首字母大写

```
拓展题:

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':["通过", "不通过", "不通过", "通过"]}
```

  

# 1.写出完整的装饰器(不用考虑带参装饰器,就是普通装饰器)语法
def wrapper(func):
    def inner(*args, **kwargs):
        pass
        result = func(*args, **kwargs)
        pass
        return result
    return inner

# 2.有一个计算两个数和的方法,为其添加一个确保两个参数都是int或float类型的装饰器,保证运算不会抛异常
def check_num(func):
    def inner(n1, n2):
        b1 = isinstance(n1, int) or isinstance(n1, float)
        b2 = isinstance(n2, int) or isinstance(n2, float)
        if not (b1 and b2):
            print('不能求和')
            return  # 结束掉,不让其进入计算功能
        return func(n1, n2)
    return inner

@check_num
def add(n1, n2):
    return n1 + n2

print(add(1, '2'))

# 3.有一个一次性录入人名并返回人名的方法(人名只考虑存英文),为其添加一个装饰器,使得处理后人名首字母一定大写
def upper_name(func):
    def inner():
        result = func()
        return result.title()  # Owen
    return inner

@upper_name
def get_name():
    name = input('name: ')  # owen
    return name

print(get_name())

拓展题

# 选择课程装饰器
def choose_course(func):
    def inner(*args, **kwargs):
        grade_map = {}  # {'math':[math的成绩们], 'english':[english的成绩们]}
        while True:
            course = input('course: ')  # 循环录入学科
            if course == 'q':  # q代表退出录入
                break
            result = func(*args, **kwargs)  # 进入录入成绩功能可以完成该学科成绩录入
            grade_map[course] = result  # 形成 学科: [成绩们] 的k-v键值对
        return grade_map
    return inner

# 处理成绩装饰器
def deal_fail(func):
    def inner(*args, **kwargs):
        result = func(*args, **kwargs)  # 先获得成就结果
        if isinstance(result, list):  # 没有被录入学科装饰的分支
            for i, v in enumerate(result):  # enumerate可以为可迭代对象添加迭代索引
                if v < 60:
                    result[i] = '不通过'
                else:
                    result[i] = '通过'
        if isinstance(result, dict):  # 被录入学科装饰的分支
            for ls in result.values():
                for i, v in enumerate(ls):
                    if v < 60:
                        result[i] = '不通过'
                    else:
                        result[i] = '通过'
        return result
    return inner

@choose_course
@deal_fail
# 成绩录入功能
def entry_grade():
    grades = []
    while True:  # 循环录入成绩
        grade = int(input('grade: '))
        if grade == 0:  # 录入0退出录入
            break
        grades.append(grade)  # 成绩存放到list中
    return grades

grades = entry_grade()
print(grades)

  

  

python 装饰器练习题的更多相关文章

  1. python装饰器练习题

    练习题1. 请使用python, 对下面的函数进行处理, def hello(name): print "hello, %s" % name 在函数被调用时打印耗时详情 <f ...

  2. python 装饰器 一篇就能讲清楚

    装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...

  3. 关于python装饰器

    关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...

  4. python装饰器通俗易懂的解释!

    1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...

  5. Python 装饰器学习

    Python装饰器学习(九步入门)   这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...

  6. python 装饰器修改调整函数参数

    简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...

  7. python 装饰器学习(decorator)

    最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...

  8. Python装饰器详解

    python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...

  9. 关于python装饰器(Decorators)最底层理解的一句话

    一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...

随机推荐

  1. Fundebug前端JavaScript插件更新至1.6.0,新增test()方法用于测试

    摘要: 1.6.0新增fundebug.test()方法用于测试,请大家及时更新. 默认情况下,Fundebug 插件能够自动捕获未处理的错误(uncaught error).另外,开发者也可以通过使 ...

  2. SAP MM MIGO & Return Delivery 组合实现部分数量的Reversal

    SAP MM MIGO & Return Delivery 组合实现部分数量的Reversal 在笔者看来,MIGO这个事务代码里的Return Delivery主要用于采购退货场景. 先找到 ...

  3. OPC协议解析-OPC客户端与服务器通讯解析

    1      OPC服务器 OPC服务器, 是指按照OPC基金组织规定的OPC规范群开发的软件驱动.OPC服务器作为中间媒介负责从数据源读取数据再跟另外一端的客户端通信.在 OPC客户端/服务器 的结 ...

  4. mean项目的分模块开发

    全文字版: 新建maven工程在,作为父工程用于最后集合使用,该工程不需要src,只需要一个pom.xml文件,规定一下依赖版本之类的,再建一个工具类的工程,不需要放配置文件,和工程中方法接口有关的不 ...

  5. 关于Python, ftplib模块中的cwd()进入含中文目录失败的问题

    使用Python的ftplib模块连接ftp服务器时, 使用cwd()连接含中文的目录, 报错 : UnicodeEncodeError: 'latin-1' codec can't encode c ...

  6. SQL语句更新时间字段的年份、月份、天数、时、分、秒

    SQL语句更新时间字段的年份.月份.天数.时.分.秒 --修改d表日期字段的年份update dset birth=STUFF(convert(nvarchar(23),birth,120),1,4, ...

  7. mybatis配置文件说明(configuration)

    1. xml结构(可查看mybatis-3-config.dtd) <!ELEMENT configuration (properties?, settings?, typeAliases?, ...

  8. Docker资源限制

    我们在容器中运行docker镜像的时候,可以指定一些设置容器cpu和内存的相关参数来进行限制,这样子尽量把容器资源做的相对稳定一些.这些参数是在docker run/create命令使用,比如: -- ...

  9. LeetCode算法题-Island Perimeter(Java实现)

    这是悦乐书的第238次更新,第251篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Easy级别的第105题(顺位题号是463).您将获得一个二维整数网格形式的地图,其中1代表土地,0代 ...

  10. 在java web项目中实现随项目启动的额外操作

    前言 在web项目中经常会遇到在项目启动初始,会要求做一些逻辑的实现,比如实现一个消息推送服务,实现不同类型数据同步的回调操作初始化,或则通知其他客户服务器本项目即将启动,等等.对于这种要求,目前个人 ...