1,引子,计算函数的运行时间:
import time def func(): time.sleep(0.01) # 为了计算运行时间差的时候有值 print("func") def timer(f): # 装饰器函数 def inner(): start_time = time.time() # 从1970年开始的毫秒数 f() # 内部函数应用外部函数变量,闭包,被装饰的函数 end_time = time.time() exec_time = start_time - end_time return inner()
2,装饰器的作用,不想修改函数的调用方式,但是还想在原来的函数前后添加功能,timer就是一个装饰器函数,只是对一些函数有一些装饰作用
3,语法糖,@装饰器函数名
import time #获取当前时间 def timer(f): # 装饰器函数 def inner(): start_time = time.time() # 从1970年开始的毫秒数 f() # 内部函数应用外部函数变量,闭包,被装饰的函数 end_time = time.time() exec_time = start_time - end_time return inner() @timer def func(): time.sleep(0.01) # 为了计算运行时间差的时候有值,让程序在这儿停一会儿 print("func")
4,开放封闭原则:对扩展是开放的,对修改是封闭的
5,前面的装饰器是装饰无参数无返回值的,如果想要装饰有参数有返回值的函数
import time #获取当前时间 def timer(f): # 装饰器函数 def inner(a): start_time = time.time() ret = f(a) end_time = time.time() exec_time = start_time - end_time return ret return inner # 这儿记住一定不要加括号 @timer def func(a): time.sleep(0.01) print("func") return 2 ret = func(1) print(ret)
6,想要动态传入参数,怎么办?
import time #获取当前时间 def timer(f): # 装饰器函数 def inner(*args,**kwargs): start_time = time.time() ret = f(*args,**kwargs) end_time = time.time() exec_time = start_time - end_time return ret return inner @timer def func(a): time.sleep(0.01) print("func") return 2 ret = func(1) print(ret)
7,一个标准的装饰器
def wrapper(func): # 装饰器函数 def inner(*args,**kwargs): # 被装饰函数之前做的事情 ret = func(*args,**kwargs) # 被装饰函数之后做的事情 return ret return inner @wrapper # wahaha = wrapper(wahaha) def wahaha(a): print("func") return 2 ret = wahaha(1) print(ret)
8,作业题-:
# 写函数,接收n个数字,求这些参数数字的和 def sum_para(*args): sum = 0 for i in args: sum = sum + i return sum print(sum_para(1,2,3,4,5))
9,作业题二:
# 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么? a = 10 b = 20 def test5(a,b): print(a,b) c = test5(b,a) print(c) 运行结果: 20 10 None
10,作业题三:
# 读代码,回答:代码中,打印出来的a,b,c分别是什么,为什么? a = 10 b = 20 def test5(a,b): a = 3 b = 5 print(a,b) c = test5(b,a) print(c) 运行结果: 3 5 None
11,作业题四:
# 写函数,检查获取传入列表或者元祖对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者 def func(li): return li[1::2] ret = func([1,2,3,4,5,6,7,8]) print(ret) 运行结果: [2, 4, 6, 8]
12,作业题五:
# 写函数,判断用户输入的值(字符串,列表,元祖)长度是否大于5 def func(x): return len(x) > 5 ret = func((1,2,3,4,5,6,7)) print(ret) ret = func([1,2,3]) print(ret) 运行结果: True False
13,作业题六:
# 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。 def func(li): return li[:2] # 因为小于两个会直接全部返回,所以这个地方判断也不用添加了 print(func([1,2,3,4])) print(func([3]))
14,作业题七
# 写函数,计算传入字符串中数字,字母,空格以及其他的个数,并返回结果 str1 = input(">>>") def func(s): dict1 = {"num":0,"alpha":0,"space":0,"other":0} for i in s: if i.isdigit(): # 函数调用别忘了加括号 dict1["num"] += 1 elif i.isalpha(): dict1["alpha"] += 1 elif i.isspace(): dict1["space"] += 1 else: dict1["other"] += 1 return dict1 # 返回多个值的时候,为了让外面看清楚哪个是哪个,所以用了字典类型 ret = func(str1) print(ret) 运算结果: {'num': 3, 'alpha': 17, 'space': 1, 'other': 0}
15,作业题八
def func(para): if isinstance(para,str) and para: # 直接写入传入的参数就可以了,不需要加type for i in para: if i.isspace(): return True elif para and isinstance(para,list) or isinstance(para,tuple) : for i in para: if i == " ": return True elif not para: return False # 老师的版本 def func(x): if type(x) is str and x: #参数是字符串,并且非空 for i in x: if i == ' ': return True elif x and type(x) is list or type(x) is tuple: #参数是列表或者元组, for i in x: if not i: return True elif not x: # 区分空内容和本身为空 return True ret = func("str n") print(ret) ret = func([1,2,3,4," ",5]) print(ret) ret = func([1,2,3,4,"",5]) print(ret) ret = func((1,2,3,4," ",5)) print(ret) ret = func((1,2,3,4,"",5)) print(ret)
16,作业题九
#7、写函数,检查传入字典的每一个value的长度,如果大于2, # 那么仅保留前两个长度的内容,并将新内容返回给调用者。 # 自己的版本 def func(dict1): for i in dict1: if len(dict1[i]) > 2: dict1[i] = dict1[i][:2] return dict1 dict_para = {"name":"lisa","gender":"female"} ret = func(dict_para) print(ret) # 老师的版本 dic = {"k1": "v1v1", "k2": [11,22,33,44]} # PS:字典中的value只能是字符串或列表 def func(dic): for k in dic: if len(dic[k]) > 2: dic[k] = dic[k][:2] return dic dic = {"k1": "v1v1", "k2": [11,22,33,44]} print(func(dic))
17,作业题十
# 8、写函数,接收两个数字参数,返回比较大的那个数字。 # def func(num1,num2): # return num1 if num1 > num2 else num2 # # ret = func(3,5) # print(ret)
18,作业题十一
# 9、写函数,用户传入修改的文件名,与要修改的内容, # 执行函数,完成整个文件的批量修改操作(进阶)。 # 自己的版本 import os def func(filename,old,new): with open(filename,"r+",encoding="utf-8") as f1, open("lisa.txt",mode ="w",encoding = "utf-8") as f2: for line in f1: if old in line: line = line.replace(old,new) f2.write(line) os.rename("lisa.txt",filename) func("file.txt","jack","lisa") # # # 老师的版本 def func(filename,old,new): with open(filename, encoding='utf-8') as f, open('%s.bak'%filename, 'w', encoding='utf-8') as f2: for line in f: if old in line: # 班主任:星儿 line = line.replace(old,new) # 写文件 f2.write(line) # 小护士:金老板 import os os.remove(filename) # 删除文件 os.rename('%s.bak'%filename, filename) # 重命名文件