写代码的方式:面向过程 --> 函数式编程(多) --> 面向对象编程。python
def func(a1,a2): pass result = func(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]
面试题:django
def func(a,b=[]) 有什么陷阱?#若是使用b=[]默认参数,传递参数默认都是都是用同一个地址。编程
看代码写结果flask
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) #函数默认参数,已经在函数建立的时候在内部已经占用内存。若是调用函数时候,没有指定默认参数值的时候,函数会主动调用默认参数的内存,不断的调用函数,不断的向默认参数内存中填充数据。因此会出现打印l1和l3结果相同。
看代码写结果缓存
def func(a,b=[]): b.append(a) print(b) func(1) func(2,[11,22,33]) func(3) #这题区别上题,直接执行函数。执行func(1)时候,func(3)尚未向默认内存空间中存数据。 # [1] [11,22,33,2] [1,3]
1.3 返回值闭包
分析函数执行的内存app
def func(name): def inner(): print(name)#使用分配的内存 return 123 return inner v1 = func('alex') v2 = func('eric') v1() v2()
闭包#经过函数嵌套,将值保存起来,方便后期调用。框架
# 不是闭包 def func1(name):#封装值,可是没用 def inner(): return 123 return inner # 是闭包:封装值 + 内层函数须要使用。 def func2(name):#封住了值,在嵌套函数中被使用了。 def inner(): print(name) return 123 return inner
函数本身调用本身。(效率低),尽可能使用while循环。dom
限制递归次数:作多递归1000次。
def func(): print(1) func() func()
def func(i): print(i) func(i+1) func(1)
#取出斐波那契数 def func(a,b): # 1 # 1 # 2 # 3 # 5 print(b) func(b,a+b) func(0,1)
def func(a): if a == 5: return 100000#100000+4*10 result = func(a+1) + 10 return result v = func(1)
# 递归的返回值 def func(a): if a == 5: return 100000 result = func(a+1) + 10 v = func(1) name = 'alex' def func(): def inner(): print(name) return inner v =func()
def x(func): def inner(): return func() return inner @x def index(): pass
def x(func): def inner(a1): return func(a1) return inner @x def index(a1): pass
def x(func): def inner(a1,a2): return func(a1,a2) return inner @x def index(a1,a2): pass # index = inner index(1,2) # ################################### 参数统一的目的是为了给原来的index函数传参 def x(func): def inner(a1,a2): return func() return inner @x def index(): pass # func = 原来的index函数u # index = inner index(1,2)
若是给好几个函数写一个统一的装饰器,怎么办?
def x1(func): def inner(*args,**kwargs): return func(*args,**kwargs) return inner @x1 def f1(): pass @x1 def f2(a1): pass @x1 def f3(a1,a2): pass
def x1(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return data return inner @x1 def f1(): print(123) v1 = f1() print(v1)
def x1(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return data return inner @x1 def f1(): print(123) return 666 v1 = f1() print(v1)
def x1(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return inner @x1 def f1(): print(123) return 666 v1 = f1() print(v1)
装饰器建议写法:
def x1(func): def inner(*args,**kwargs): data = func(*args,**kwargs) return data return inner
def x1(func): def inner(*args,**kwargs): print('调用原函数以前') data = func(*args,**kwargs) # 执行原函数并获取返回值 print('调用员函数以后') return data return inner @x1 def index(): print(123) index()
# 第一步:执行 ret = xxx(index) # 第二步:将返回值赋值给 index = ret @xxx def index(): pass # 第一步:执行 v1 = uuu(9) # 第二步:ret = v1(index) # 第三步:index = ret @uuu(9)#先执行带参数9的外层函数。 def index(): pass
# ################## 普通装饰器 ##################### def wrapper(func): def inner(*args,**kwargs): print('调用原函数以前') data = func(*args,**kwargs) # 执行原函数并获取返回值 print('调用员函数以后') return data return inner @wrapper def index(): pass # ################## 带参数装饰器 ##################### def x(counter): def wrapper(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @x(9)#至关于在外层套了一个函数,函数的内部参数counter便于内部函数调用。 #如,能够带参数n,使得下面被装饰的函数执行n次。 def index(): pass
练习题
# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。 def xxx(counter): print('x函数') def wrapper(func): print('wrapper函数') def inner(*args,**kwargs): v = [] for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 v.append(data) return v return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v) [8,8,8,8,8] # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】 def xxx(counter): print('x函数') def wrapper(func): print('wrapper函数') def inner(*args,**kwargs): for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v) # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回执行结果中最大的值。 def xxx(counter): print('x函数') def wrapper(func): print('wrapper函数') def inner(*args,**kwargs): value = 0 for i in range(counter): data = func(*args,**kwargs) # 执行原函数并获取返回值 if data > value: value = data #也能够造成列表,max(list) return value return inner return wrapper @xxx(5) def index(): return 8 v = index() print(v)
def x(counter): print('x函数') def wrapper(func): print('wrapper函数') def inner(*args,**kwargs): if counter: return 123 return func(*args,**kwargs) return inner return wrapper #通一个装饰器实现两个不一样的功能,在装饰器使用if语句,分别实现不一样的功能。 @x(True) def fun990(): pass @x(False) def func10(): pass
元数据:flask框架
多个装饰器::Flask框架
@x1 @x2 def func(): pass
基本装饰器(更重要)
def x1(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner @x1 def index(): print(123) index()
带参数的装饰器
def x(counter): def wrapper(func): def inner(*args,**kwargs): data = func(*args,**kwargs) # 执行原函数并获取返回值 return data return inner return wrapper @x(9) def index(): pass
python解释器相关的数据。
sys.getrefcount , 获取一个值的应用计数
a = [11,22,33] b = a print(sys.getrefcount(a))
sys.getrecursionlimit , python默认支持的递归数量
sys.stdout.write --> print (进度)。pint打印最后自动换行。sys.stdout.write('xxx')最后不自动换行。
\n换行
\t制表符==tap键
\r,回到当前的起始位置。
print('xxx',end=' '),print中end=‘ ’表示不换行。
import time for i in range(1,101): msg = "%s%%\r" %i print(msg,end='') time.sleep(0.05)
import os # 1. 读取文件大小(字节) file_size = os.stat('20190409_192149.mp4').st_size#获取文件字节大小 # 2.一点一点的读取文件 read_size = 0 with open('20190409_192149.mp4',mode='rb') as f1,open('a.mp4',mode='wb') as f2: while read_size < file_size: chunk = f1.read(1024) # (每次读取1024个字节)每次最多去读取1024字节 f2.write(chunk) read_size += len(chunk) val = int(read_size / file_size * 100) print('%s%%\r' %val ,end='')
sys.argv
#!/usr/bin/env python # -*- coding:utf-8 -*- """ 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。 C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py """ import sys # 获取用户执行脚本时,传入的参数。 # C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test # sys.argv = [D:/code/s21day14/7.模块传参.py, D:/test] path = sys.argv[1] # 删除目录 import shutil shutil.rmtree(path) #在py里执行这个脚本,以后后面带要删除的目录,便可实现删除该目录。
sys.path --- 欠
和操做系统相关的数据。
os.path.exists(path) , 若是path存在,返回True;若是path不存在,返回False
os.stat('20190409_192149.mp4').st_size , 获取文件大小
os.path.abspath() , 获取一个文件的绝对路径
path = '20190409_192149.mp4' # D:\code\s21day14\20190409_192149.mp4 import os v1 = os.path.abspath(path) print(v1)
os.path.dirname ,获取路径的上级目录
import os v = r"D:\code\s21day14\20190409_192149.mp4" #r,取消注意注意。其中出现转义符,取消转义。至关于在\,前加一个\。 #v2 = "D:\\code\\s21day14\\n1.mp4" print(v2) print(os.path.dirname(v))
os.path.join ,路径的拼接
import os path = "D:\code\s21day14" # user/index/inx/fasd/,os能够根据不一样的系统目录格式进行拼接。 v = 'n.txt' result = os.path.join(path,v) print(result) result = os.path.join(path,'n1','n2','n3') print(result)
os.listdir , 查看一个目录下全部的文件【第一层】
import os result = os.listdir(r'D:\code\s21day14') for path in result: print(path)
os.walk , 查看一个目录下全部的文件【全部层】
import os result = os.walk(r'D:\code\s21day14') for a,b,c in result: # a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件 for item in c: path = os.path.join(a,item) print(path)
补充:
转义
v1 = r"D:\code\s21day14\n1.mp4" (推荐) print(v1) v2 = "D:\\code\\s21day14\\n1.mp4" print(v2)
import shutil shutil.rmtree(path) #还能够压缩,解压文件。