路飞学城Python开发21天入门
侵权删!
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(data,value=[]):
value.append(data)
return value
v1 = func(1) # [1.]
v2 = func(1,[11,22,33]) # [11,22,33,1]
面试题:
-
def func(a,b=[]) 有什么陷阱?
-
看代码写结果
def func(a,b=[]): b.append(a) return b l1 = func(1) l2 = func(2,[11,22]) l3 = func(3) print(l1,l2,l3)
1.3 返回值
闭包
1.4 作用域
1.5 递归
函数自己调用自己。
def func():
print(1)
func()
func()
def func(i):
print(i)
func(i+1)
func(1)
def func(a,b):
print(b)
func(b,a+b)
func(0,1)
def func(a):
if a == 5:
return 1000
result = func(a+1) + 10
return result
2.模块
- hashlib
- random
- getpass
- time
内容详细
1、装饰器
1.1 基本格式
def x(func):
def inner():
return func()
return inner
@x
def index():
pass
1.2 关于参数
def x(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@x
def index(a1):
pass
index()
1.3 关于返回值
# 案例1
def x(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
@x
def f1(a1):
print(123)
v1 = f1() # 返回None
# 案例2
def x(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
@x
def f1(a1):
print(123)
return 666
v1 = f1() # 返回None
# 案例3
def x(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return 666
return inner
@x
def f1(a1):
print(123)
v1 = f1() # 返回666
1.4 关于前后
def x(func):
def inner(*args,**kwargs):
# 前
data = func(*args,**kwargs) # 执行原函数
# 后
return data
return inner
@x
def index(a1):
print(123)
index()
练习题
# 让函数执行五次,每次结果追加到列表里
import random
def func():
return random.randint(1,4)
# 答案
import random
def wrapper(func):
def inner(*args,**kwargs):
value = []
for i in range(5):
data = func(*args,**kwargs)
value.append(data)
return data
return inner
@wrapper
def func():
return random.randint(1,4)
1.5 带参数的装饰器
# 第一步: 执行 ret = xxx(index)
# 第二步: 将返回值赋值给 index = ret
@xxx
def index():
pass
# 第一步: 执行 v1 = uuu(9)
# 第二步: ret = v1(index)
# 第三部: index = ret
@uuu(9)
def index():
pass
# ############ 普通修饰器 ############
def x(func):
def inner(*args,**kwargs):
# 前
data = func(*args,**kwargs) # 执行原函数
# 后
return data
return inner
@x
def index(a1):
print(123)
# ############ 带参数修饰器 ############
def y(counter):
def x(func):
def inner(*args,**kwargs):
# 前
data = func(*args,**kwargs) # 执行原函数
# 后
return data
return inner
return x
@y(9) # 先执行y(9)函数,返回值是一个函数,传的参相当于个闭包
def index(a1):
print(123)
练习题
# 写一个带参数的装饰器,实现:参数多少,被装饰的函数就执行多少次,把每次结果添加到列表中,返回列表
def y(counter):
def x(func):
def inner(*args,**kwargs):
value = []
for i in range(counter):
data = func(*args,**kwargs) # 执行原函数
value.append(data)
return value
return inner
return x
@y(9)
def index():
return 8
v = index()
print(v)
1.6 自己了解
- 元数据
- 多个装饰器
2、模块
2.1 sys
python解释器相关的数据。
-
sys.getrefcount
# 获取一个值的应用计数 import sys a = [11,22,33] b = a print(sys.getrefcount(a))
-
sys.gentrecursionlimit
# 获取python默认的递归次数 import sys v1 = sys.getrecursionlimit() print(v1)
-
sys.stdout.write
# 引出实现进度条 import time for i in range(1,101): msg = '%s%%/r' %i print(msg,end='') time.sleep(0.05)
# 通过/r 和os模块,实现读取文件进度条 import os # 1.读取文件大小(字节) file_size = os.stat('文件名').st_size # 2.一点点读取文件 read_size = 0 with open('文件名',mode='rb') as f1,open('新文件名',mode='wb') as f2: while read_size < file_size: chunk = f1.read(1024) # 每次最多读取1024字节 f2.write(chunk) read_size += len(chunk) val = int(read_size / file_size * 100) print('%s%%/r' %val ,end='')
-
sys.argv
import sys # 获取用户执行脚本时传入的参数 # C:\....\...\python36.exe D:/..../..../xxxx.py D:/test # sys.argv = ['D:/..../..../xxxx.py','D:/test'] path = sys.argv[1] # 删除目录 import shutil shutil.rmtree(path) #删除传入参数,即删除输入的路径
-
sys.path
2.2 os
和操作系统相关的数据。
-
os.path.exists(path)
如果存在返回True,否则返回False
-
os.stat(文件名).st_size
获取文件的字节大小
-
os.path.abspath(path)
# 获取绝对路径 path = '当前文件夹的文件名' import os v1 = os.path.abspath(path) print(v1)
-
os.path.dirname(path)
# 获取路径的上一级目录 import os v1 = r'D:\..1..\..2..\xxxx.py' # 前面加r 进行转义 v2 = r'D:\..1..\..2..' print(os.path.dirname(v1)) # D:/..1../..2../ print(os.path.dirname(v2)) # D:/..1../
-
os.path.join
# 路径的拼接 import os path = r'D:\..1..\..2..' v = 'n.avi' result = os.path.join(path,v) print(result) result = os.path.join(path,'n1','n2','n3') print(result)
-
os.list.dir(path)
# 查看一个目录下所有的文件,当前目录层级下的 import os result = os.list.dir(r'路径') print(result)
-
os.walk(path)
# 查看一个目录下所有层级的所有文件 import os result = os.walk(r'路径') for item in result: print(len(tiem)) for a,b,c in result: # a,正在查看的目录;b,此目录下的文件夹;c,此目录下的文件 print(a,111,b,111,c) for item in c: path = os.path.join(a,item) print(path)
-
补充:
-
转义
v1 = r'D:\..1..\..2..\xxxx.py' # 前面加r 进行转义 v2 = 'D:\\..1..\\..2..\\xxxx.py' # \\ 进行转义
-
2.3 shutil
import shutil
shutil.rmtree(path)
总结
- 普通装饰器
- 参数
- 返回值
- 前后
- 带参数的装饰器
- 模块
- random
- hashlib
- getpass
- time
- os
- sys
- shutil
转载:https://blog.csdn.net/s4cott/article/details/105984656
查看评论