python 装饰器练习题
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 装饰器练习题的更多相关文章
- python装饰器练习题
练习题1. 请使用python, 对下面的函数进行处理, def hello(name): print "hello, %s" % name 在函数被调用时打印耗时详情 <f ...
- python 装饰器 一篇就能讲清楚
装饰器一直是我们学习python难以理解并且纠结的问题,想要弄明白装饰器,必须理解一下函数式编程概念,并且对python中函数调用语法中的特性有所了解,使用装饰器非常简单,但是写装饰器却很复杂.为了讲 ...
- 关于python装饰器
关于python装饰器,不是系统的介绍,只是说一下某些问题 1 首先了解变量作用于非常重要 2 其次要了解闭包 def logger(func): def inner(*args, **kwargs) ...
- python装饰器通俗易懂的解释!
1.python装饰器 刚刚接触python的装饰器,简直懵逼了,直接不懂什么意思啊有木有,自己都忘了走了多少遍Debug,查了多少遍资料,猜有点点开始明白了.总结了一下解释得比较好的,通俗易懂的来说 ...
- Python 装饰器学习
Python装饰器学习(九步入门) 这是在Python学习小组上介绍的内容,现学现卖.多练习是好的学习方式. 第一步:最简单的函数,准备附加额外功能 1 2 3 4 5 6 7 8 # -*- c ...
- python 装饰器修改调整函数参数
简单记录一下利用python装饰器来调整函数的方法.现在有个需求:参数line范围为1-16,要求把9-16的范围转化为1-8,即9对应1,10对应2,...,16对应8. 下面是例子: def fo ...
- python 装饰器学习(decorator)
最近看到有个装饰器的例子,没看懂, #!/usr/bin/python class decorator(object): def __init__(self,f): print "initi ...
- Python装饰器详解
python中的装饰器是一个用得非常多的东西,我们可以把一些特定的方法.通用的方法写成一个个装饰器,这就为调用这些方法提供一个非常大的便利,如此提高我们代码的可读性以及简洁性,以及可扩展性. 在学习p ...
- 关于python装饰器(Decorators)最底层理解的一句话
一个decorator只是一个带有一个函数作为参数并返回一个替换函数的闭包. http://www.xxx.com/html/2016/pythonhexinbiancheng_0718/1044.h ...
随机推荐
- MySQL优化COUNT()查询
COUNT()聚合函数,以及如何优化使用了该函数的查询,很可能是最容易被人们误解的知识点之一 COUNT()的作用 COUNT()是一个特殊的函数,有两种非常不同的作用: 统计某个列值的数量 统计行数 ...
- vue项目中vscode格式化配置和eslint配置冲突
问题描述 使用vscode开发vue项目的时候,从远端拉下一个新的项目后,安装完依赖后跑起项目时,发现直接报了一堆语法错误:包括换行.空格.单双引号.分号等各种格式问题 因为我的 vscode 安装使 ...
- Shell基础命令(二)
查看Linux的发行版 cat /etc/redhat-release cat /etc/os-release 查看系统用户的id信息 id 用户名 id root id 创建系统用户的命令 user ...
- 转载:Linux服务器Cache占用过多内存导致系统内存不足最终java应用程序崩溃解决方案
原文链接: https://blog.csdn.net/u014740338/article/details/66975550 问题描述 Linux内存使用量超过阈值,使得Java应用程序无可用内存, ...
- MongoDB 创建索引的语法
1.为普通字段添加索引,并且为索引命名 db.集合名.createIndex( {"字段名": 1 },{"name":'idx_字段名'}) 说明: (1)索 ...
- 20180831-Linux环境下Python 3.6.6 的安装说明
20180831-Linux环境下Python 3.6.6 的安装说明 摘要:Python3 安装部署,普通用户,编译安装 Author: andy_yhm@yeah.net Date: 201808 ...
- mybatis使用oracle的sequence
oracle数据库创建SEQUENCE CREATE SEQUENCE SEQ_COM_MASTER START INCREMENT MINVALUE MAXVALUE NOCYCLE CACHE ; ...
- GIL:全局解释器锁 VS 用户程序锁
既然有了GIL锁,CPython还要多线程干什么? ''' GIL:全局解释器锁的来历 四核:同一时刻真正有四个任务在运行,多核的意义在于此 单核:看上去是并发的,因为进行了上下文切换,单核永远是串行 ...
- nuxt cdn等
https://blog.csdn.net/xuelang532777032/article/details/78398960
- Kubernetes - kubectl proxy
最近在玩flink部署在k8s上,但是k8s以前没玩过,参照前几天写的文章可部署一个简单的k8shttps://www.cnblogs.com/felixzh/p/9726244.html 在参照fl ...