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 ...
随机推荐
- ARM与FPGA通过spi通信设计1.spi基础知识
SPI(Serial Peripheral Interface--串行外设接口)总线系统是一种同步串行外设接口,它可以使MCU与各种外围设备以串行方式进行通信以交换信息.SPI总线可直接与各个厂家生产 ...
- linux学习笔记-linux主机上传下载文件至linux虚拟机的方法
我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! 1.上传文件 scp -r file 用户名@ip地址:目标目录 2.下载文件 scp -r 用户名@ip地址:文件 目标目录
- 驰骋工作流引擎JFlow与activiti的对比 -总结
共同点: 1. 嵌入式的工作流引擎,降低集群复杂性. 2. 严格而灵活的流程版本控制 3. 支持多种数据库 4. 支持多种流程设计模式 5. 成熟度高的开源工作流,具有可靠的稳定性和性能. 区别: 1 ...
- 面板JPanel,滚动面板JScrollPane,文本域JTextArea
[面板JPanel] 面板就是一个容器 每一个容器都可以有一个自己的独立的布局和组件,这些容器之间也不会互相干扰 //导入Java类 import javax.swing.*; import java ...
- 南京邮电大学 JavaA期末复习要点总结
南京邮电大学 JavaA复习要点: Chap1 入门 1. Java应用程序开发过程教材P14~P15 Chap 2 基本语法 1. 标识符的命名规则教材P19 字母下划线美元符号开头,除 ...
- angular部署到iis出现404解决方案
angular应用部署在iis上,刷新出现404 解决方案: 安装 iis URL Rewrite 模块,并在 src 目录下增加web.config,配置urlrewrite如下: <conf ...
- 一个「学渣」从零开始的Web前端自学之路
从 13 年专科毕业开始,一路跌跌撞撞走了很多弯路,做过餐厅服务员,进过工厂干过流水线,做过客服,干过电话销售可以说经历相当的“丰富”. 最后的机缘巧合下,走上了前端开发之路,作为一个非计算机专业且低 ...
- spring学习总结——高级装配学习一(profile与@Conditional)
前言: 在上一章装配Bean中,我们看到了一些最为核心的bean装配技术.你可能会发现上一章学到的知识有很大的用处.但是,bean装配所涉及的领域并不仅仅局限于上一章 所学习到的内容.Spring提供 ...
- PJSUA2开发文档--第十章 媒体质量(MEDIA QUALITY)
10 媒体质量(Media Quality) 10.1 音频质量 如果遇到音频质量问题,可尝试以下步骤: 遵循指南:使用pjsystest测试声音设备. 识别声音问题并使用以下步骤进行故障排除:检查声 ...
- Windows server 2012 R2 部署WSUS补丁服务
一.WSUS 安装要求 1.硬件要求: 对于多达 13000 个客户端的服务器,建议使用以下硬件:* 4 Core E5-2609 2.1GHz 的处理器* 8 GB 的 RAM 2.软件要求: 要使 ...