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())