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) # 重命名文件

day11:装饰器的更多相关文章

  1. day11.装饰器初识

    1.开放封闭原则 原则: 开放封闭原则,对扩展是开放的,对修改是封闭的. 封版概念:当写好一个功能以后,就不可以再修改此函数,避免下面一系列的调用产生错误. 因此产生了装饰器 2.装饰器形成过程 我们 ...

  2. day11 装饰器---函数的使用方法

    这个是一个难点,以后面试会经常出现的,要搞懂! 装饰器升级版,进阶内容1: def outer(flag): def wrapper(func): def inner(*args,**kwargs): ...

  3. python基础一 day11 装饰器复习

    # 复习# 讲作业# 装饰器的进阶 # functools.wraps # 带参数的装饰器 # 多个装饰器装饰同一个函数# 周末的作业 # 文件操作 # 字符串处理 # 输入输出 # 流程控制 # 装 ...

  4. python基础一 day11 装饰器(1)

    接收的时候是聚合,调用的时候是打散     print(*args)本来在里面用的时候是用args,是一个元祖,加上一个 * 号,把元祖解包了(打散了). from functools import ...

  5. day11 - 15(装饰器、生成器、迭代器、内置函数、推导式)

    day11:装饰器(装饰器形成.装饰器作用.@语法糖.原则.固定模式) 装饰器形成:最简单的.有返回值的.有一个参数的.万能参数 函数起的作用:装饰器用于在已经完成的函数前后增加功能 语法糖:使代码变 ...

  6. day11(python)装饰器

    def wrapper(f):#1 def inner(*args,**kwargs):#3 ret = f(*args,**kwargs)#5 return ret#8 return inner#4 ...

  7. Day11 Python基础之装饰器(高级函数)(九)

    在python中,装饰器.生成器和迭代器是特别重要的高级函数   https://www.cnblogs.com/yuanchenqi/articles/5830025.html 装饰器 1.如果说装 ...

  8. day11 python之函数装饰器

    一,什么是装饰器? 装饰器本质上就是一个python函数,他可以让其他函数在不需要做任何代码变动的前提下,增加额外的功能,装饰器的返回值也是一个函数对象. 装饰器的应用场景:比如插入日志,性能测试,事 ...

  9. python 全栈开发,Day11(函数名应用,闭包,装饰器初识,带参数以及带返回值的装饰器)

    一.函数名应用 函数名是什么?函数名是函数的名字,本质:变量,特殊的变量. 函数名(),执行此函数. python 规范写法 1. #后面加一个空格,再写内容,就没有波浪线了. 2.一行代码写完,下面 ...

随机推荐

  1. [k8s]k8s配置nfs做后端存储&配置多nginx共享存储&&statefulset配置

    所有节点安装nfs yum install nfs-utils rpcbind -y mkdir -p /ifs/kubernetes echo "/ifs/kubernetes 192.1 ...

  2. 9-9-B+树-查找-第9章-《数据结构》课本源码-严蔚敏吴伟民版

    课本源码部分 第9章  查找 - B+树 ——<数据结构>-严蔚敏.吴伟民版        源码使用说明  链接☛☛☛ <数据结构-C语言版>(严蔚敏,吴伟民版)课本源码+习题 ...

  3. lua -- 所有UI组件的基类

    -- 组件行为基础 local Behavior = class("Behavior"); function Behavior:ctor(name) self.owner = ni ...

  4. Mac下软件包管理器-homebrew

    类似于redhat系统的yum,ubuntu的apt-get,mac系统下也有相应的包管理容器:homebrew.用法与apt-get.yum大同小异,都是对安装软件做一些安装删除类的命令行操作,以下 ...

  5. 本地搭建Wooyun漏洞库环境

    众所周知,wooyun上有太多含金量的漏洞了,虽然互联网上也有相关的漏洞资源分享,但是万一有朝一日也被和谐了就又麻烦了,最放心的方式就是漏洞库放在本地,在本地搭建一套环境最好不过了,以下操作演示了如何 ...

  6. 【iCore4 双核心板_ARM】例程二十三:LWIP_HTTP实验——网页服务器

    实验现象: 核心代码: int main(void) { system_clock.initialize(); led.initialize(); adc.initialize(); delay.in ...

  7. Java ThreadPool的正确打开方式花钱的年华 | 江南白衣(5星推荐)

    线程池应对于突然增大.来不及处理的请求,无非两种应对方式: 将未完成的请求放在队列里等待 临时增加处理线程,等高峰回落后再结束临时线程 JDK的Executors.newFixedPool() 和ne ...

  8. 【转】在xcode5中修改整个项目名

    本文转载自:http://www.cnblogs.com/tbfirstone/p/3601541.html 总会遇到几个项目,在做到一半的时候被要求改项目名,网上找了下相关的资料,大多数是xcode ...

  9. 织梦中在线显示pdf文件的方法

    如何在织梦中添加pdf文件并显示呢?下面这个教程将带领大家来操作.(注:手机版无法查看) 第一步:在系统-系统基本参数-附件设置中添加pdf格式 并且将大小调大 第二步:在核心-内容模型-普通文章中添 ...

  10. Win10系统中VirtualBox桥接时找不到网卡的问题

    1.主机中 点网络连接 ,点 本地网络,右键属性 2.安装 服务 磁盘安装 选择 VirtualBox 安装目录, 找到 目录文件 D:\Users\Oracle\VirtualBox\drivers ...