day14装饰器_模块
-
带参数的装饰器:flask框架+django缓存+写装饰器实现被装饰的函数要执行n次
-
模块
-
os
-
sys
-
time(三种类型)
-
datetime和timezone【了解】
-
内容回顾&补充
1.函数
写代码的方式:面向过程-->函数式编程-->面向对象编程
1.1函数基础
def func(a1,a2):
pass
result = func(1,2)
1.2参数
补充:对于函数的默认值慎用可变类型。
#如果要想给value设置默认值是空列表
#不推荐
def func(data,value=[]):
pass
#推荐
def func(data,value=None):
if not value:
value = []
def func(a,b=[]):
b.append(a)
return b
l1 = func(1)
l2 = func(2,[11,22])
l3 = func(3)
# [1,3] [11,22,2] [1,3]
print(l1,l2,l3)
?
def func(a,b=[]):
b.append(a)
print(b)
func(1)
func(2,[11,22])
func(3)
# [1] [11,22,2] [1,3]
?
1.3返回值
分析函数执行的内存
def func(name):
def inner():
print(name)
return 123
return inner
?
v1 = func("alex")
v2 = func("eric")
?
v1()
v2()
闭包
#不是闭包
def func1(name):
def inner1():
return 123
return inner
#是闭包:封装值+内层函数需要使用。
def func1(name):
def inner2():
print(name)
return 123
return inner
1.4作用域
1.5递归
函数自己调用自己。(效率低)
def func():
print(1)
func()
func()
#递归次数最大1000
#怎么查看此时
#在cmd里打开python解释器,调用sys模块(import sys),查看所有(dir(sys)),找到getrecursionlimit并调用(sys.getrecursionlimit())
def func(i):
print(i)
func(i+1)
func(1)
2.模块
-
hashlib
-
random
-
getpass
-
time
内容详细
1.装饰器
def x(func):
def inner():
return func()
return inner
@f
def index():
pass
# ######################################
# 然你理解没意义的一段代码
def x(func): # 2 运行x函数并创建inner函数
def inner(a1,a2):# 5 运行inner函数并传入两个值
return func()# 6调用func函数就是index函数
return inner # 3 返回inner函数并将
# inner赋给index(index = innder)
@x # 1 0调用x函数并吧index当做参数传给x
def index():# 7 运行index函数
pass
index(1,2) # 4 调用index函数index就是inner函数并传入两个实参
不管有几个参数都可以用的装饰器
def x1(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@x1(1)
def f1():
pass
@x1
def f2(a1):
pass
装饰器建议写法:
def x1(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
#如何查看一个路径是否存在?
import os
result = os.path.exists("路径地址")
# result为True,则表示路径存在。
# result为False,则表示路径不存在。
# ######################################
def wrapper(func):
def inner(*atgs,**kwargs):
#检测路径是否存在
path = args[0]
#路径不存在就执行判断下面命令
if not os.path.exists(path):
print("路径不存在")
return None
result = func(*atgs,**kwargs)
return result
return inner
@wrapper
def read_userinfo(path):
file_obj = open(path,mode="r",encoding="utf-8")
data = file_obj.read()
file_obj.close()
return data
content = read_userinfo("/usr/bin/xxx/xxx")
print(content)
练习题
def xxx(nnn):
nnn = int(nnn)
def x1(func):
vv = []
def inner(*args, **kwargs):
for i in range(nnn):
data = func(*args, **kwargs)
vv.append(data)
return vv
return inner
return x1
vvv = input(">>>")
@xxx(vvv)
def index():
return 8
v = index()
print(v)
# #################################
def xxx(nnn):
nnn = int(nnn)
def x1(func):
if counter == True:
pass
else:
vv = []
def inner(*args, **kwargs):
for i in range(nnn):
data = func(*args, **kwargs)
vv.append(data)
return vv
return inner
return x1
@xxx(False)
def index():
return 8
@xxx(True)
def index():
return 8
2.模块
-
sys
import sys
#a被调用的次数
#获取一个值的应用计数
a = [11,22,33]
B = a
print(sys.getrefcount(a))
#python默认支持的递归数量
v1 = sys.getrecursionlimit()
#输出
sys.stdout.write("sdfjl")
#\n 换行
#\t 制表符
#\r 回到当前行的起始位置
print("sdjfl\r",end="")
print("sdjflfd",end="")
# ############
import time
for i in range(1,101):
msg = "%s%%\r" %i
print(msg,end="")
time.sleep(0.05) #然程序在这多执行0.05秒进度条
#导入模块os
import os
#获取文件的总大小(字节)
file_size = os.stat("asdlkfjsldjf.mp4").st_size
# 2.一点一点的读取文件
read_size = 0
with open("asdlkfjsldjf.mp4",mode="rb") as f1:
while read_size < file_size:
chunk = f1.read(1024)
#每次最多去读取1024字节
read_size += len(chunk)
val = int(read_size / file_size * 100)
print("%s%%\r" %val,end="")模块参数
import sys
#获取用户执行脚本时,传入的参数。
#c:\sjldj\sldjf.exe d:/djks/dslkf/d.py d:/sdklf
#sys.argv = [d:/djks/dslkf/d.py ,d:/sdklf]
path = sys.argv[1]
import shutil
shutil.rmtree(path)#删除path的所有文件sys.path
2.1 os
-
os.pathl.exists(path)如果path存在,返回;如果path不存在,返回False
-
os.stat("sdlaslkjdf.mp4").st_size 获取文件大小
-
os.path.abspath() 获取一个文件的绝对路径
path = "文件名"
import os
v1 = os.path.abspath(path)
print(v1) -
os.path.dirname,获取路径的上级目录
import os
v = r"d:\code\s21sdalf\ksd.mp4"
r是转义,遇到\n\t\r当作普通的字符串处理
print(os.path.dirname(v)) -
转义
v = r"d:\code\s21sdalf\ksd.mp4"
#r是转义,遇到\n\t\r当作普通的字符串处理 -
os.path.join 路径拼接
path = "e:\sdflk\asljk\sdklfj"
v = "sdj.txt"
result = os.path.join(path,v)
print(result) -
os.listdir ,查看一个目录下所有的文件[第一层]
import os
result = os.listdir(r"e:\sdflk\asljk\sdklfj")
for path in result:
print(path) -
os.walk ,查看一个目录下所有的[所有层]
import os
result = os.walk(r"e:\sdflk\asljk\sdklfj")
for a,b,c in result:
for item in c:
path = os.path,join(a,item)
print(path)
shutil
import shutil
shutil.rmtree(path)总结
-
普通装饰器 5*
-
参数
-
返回值
-
前后
-
-
带参数4*
-
模块
-
random
-
hashlib
-
getpass
-
time
-
os
-
sys
-
shutil
-
-