查看: 174|回复: 0

python笔记14

[复制链接]
发表于 2020-2-18 10:26:30 | 显示全部楼层 |阅读模式
本日内容


  • 带参数的装饰器: flask框架 + django缓存 + 写装饰器实现被装饰的函数要执行N次
  • 模块

    • os
    • sys
    • time(三种范例)
    • datetime 和 timezone【相识】

内容回顾 & 补充

1.函数

写代码的方式:面向过程 --> 函数式编程(多) --> 面向对象编程。
1.1 函数基础
  1. def func(a1,a2):    passresult = func(1,2)
复制代码
1.2 参数

补充:对于函数的默认值慎用可变范例。
  1. # 假如要想给value设置默认是空列表# 不推荐(坑)def func(data,value=[]):     pass # 推荐def func(data,value=None):    if not value:        value = []
复制代码
  1. 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=[]) 有什么陷阱?#假如使用b=[]默认参数,传递参数默认都是都是用同一个地址。
  • 看代码写效果
    1. def func(a,b=[]):    b.append(a)    return bl1 = func(1)l2 = func(2,[11,22])l3 = func(3)# [1,3]   [11,22,2]   [1,3]print(l1,l2,l3)#函数默认参数,已经在函数创建的时候在内部已经占用内存。假如调用函数时候,没有指定默认参数值的时候,函数会主动调用默认参数的内存,不断的调用函数,不断的向默认参数内存中添补数据。以是会出现打印l1和l3效果相同。
    复制代码
  • 看代码写效果
    1. 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 返回值
分析函数执行的内存
  1. def func(name):    def inner():        print(name)#使用分配的内存        return 123    return inner v1 = func('alex')v2 = func('eric')v1()v2()
复制代码
闭包#通过函数嵌套,将值保存起来,方便后期调用。
  1. # 不是闭包def func1(name):#封装值,但是没用    def inner():        return 123    return inner # 是闭包:封装值 + 内层函数需要使用。def func2(name):#封住了值,在嵌套函数中被使用了。    def inner():        print(name)        return 123    return inner
复制代码
1.4 作用域

1.5 递归

函数自己调用自己。(效率低),尽量使用while循环。
限制递归次数:做多递归1000次。
  1. def func():    print(1)    func()    func()
复制代码
  1. def func(i):    print(i)    func(i+1)    func(1)
复制代码
  1. #取出斐波那契数def func(a,b):    # 1    # 1    # 2    # 3     # 5     print(b)     func(b,a+b)    func(0,1)
复制代码
  1. def func(a):    if a == 5:        return 100000#100000+4*10    result = func(a+1) + 10    return result v = func(1)
复制代码
  1. # 递归的返回值def func(a):    if a == 5:        return 100000    result = func(a+1) + 10v = func(1)name = 'alex'def func():    def inner():        print(name)     return innerv =func()
复制代码
2. 模块


  • hashlib
  • random
  • getpass
  • time
内容详细

1. 装饰器

1.1 根本格式
  1. def x(func):    def inner():        return func()    return inner @xdef index():    pass
复制代码
1.2 关于参数
  1. def x(func):    def inner(a1):        return func(a1)    return inner @xdef index(a1):    pass
复制代码
  1. def x(func):    def inner(a1,a2):        return func(a1,a2)    return inner @xdef index(a1,a2):    pass# index = innerindex(1,2)# ################################### 参数统一的目的是为了给原来的index函数传参def x(func):    def inner(a1,a2):        return func()    return inner @xdef index():    pass# func = 原来的index函数u# index = innerindex(1,2)
复制代码
假如给好几个函数写一个统一的装饰器,怎么办?
  1. def x1(func):    def inner(*args,**kwargs):        return func(*args,**kwargs)    return inner @x1def f1():    [email protected] f2(a1):    [email protected] f3(a1,a2):    pass
复制代码
1.3 关于返回值
  1. def x1(func):    def inner(*args,**kwargs):        data = func(*args,**kwargs)        return data    return inner @x1def f1():    print(123)    v1 = f1()print(v1)
复制代码
  1. def x1(func):    def inner(*args,**kwargs):        data = func(*args,**kwargs)        return data    return inner @x1def f1():    print(123)    return 666v1 = f1()print(v1)
复制代码
  1. def x1(func):    def inner(*args,**kwargs):        data = func(*args,**kwargs)    return inner @x1def f1():    print(123)    return 666v1 = f1()print(v1)
复制代码
装饰器建议写法:
  1. def x1(func):    def inner(*args,**kwargs):        data = func(*args,**kwargs)        return data    return inner
复制代码
1.4 关于前后
  1. def x1(func):    def inner(*args,**kwargs):        print('调用原函数之前')        data = func(*args,**kwargs) # 执行原函数并获取返回值        print('调用员函数之后')        return data    return inner @x1def index():    print(123)    index()
复制代码
1.5 带参数的装饰器
  1. # 第一步:执行 ret = xxx(index)# 第二步:将返回值赋值给 index = ret @xxxdef index():    pass# 第一步:执行 v1 = uuu(9)# 第二步:ret = v1(index)# 第三步:index = ret @uuu(9)#先执行带参数9的外层函数。def index():    pass
复制代码
  1. # ################## 普通装饰器 #####################def wrapper(func):    def inner(*args,**kwargs):        print('调用原函数之前')        data = func(*args,**kwargs) # 执行原函数并获取返回值        print('调用员函数之后')        return data    return inner @wrapperdef 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
复制代码
练习题
  1. # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次效果添加到列表中,最终返回列表。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 [email protected](5)def index():    return 8v = 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 [email protected](5)def index():    return 8v = 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 [email protected](5)def index():    return 8v = index()print(v)
复制代码
  1. 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():    [email protected](false)def func10():    pass
复制代码
1.6 欠


  • 元数据:flask框架
  • 多个装饰器::Flask框架
    1. @[email protected] func():    pass
    复制代码
总结

根本装饰器(更重要)
  1. def x1(func):    def inner(*args,**kwargs):        data = func(*args,**kwargs) # 执行原函数并获取返回值        return data    return inner @x1def index():    print(123)    index()
复制代码
带参数的装饰器
  1. 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
复制代码
2.模块

2.1 sys

python解释器相关的数据。

  • sys.getrefcount , 获取一个值的应用计数
    1. a = [11,22,33]b = aprint(sys.getrefcount(a))
    复制代码
  • sys.getrecursionlimit , python默认支持的递归数目
  • sys.stdout.write --> print (进度)。pint打印最后自动换行。sys.stdout.write('xxx')最后不自动换行。
  • \n换行
  • \t制表符==tap键
  • \r,回到当前的起始位置。
  • print('xxx',end=' '),print中end=‘ ’体现不换行。
    1. import timefor i in range(1,101):    msg = "%s%%\r" %i    print(msg,end='')    time.sleep(0.05)
    复制代码
    1. import os# 1. 读取文件大小(字节)file_size = os.stat(&#39;20190409_192149.mp4&#39;).st_size#获取文件字节大小# 2.一点一点的读取文件read_size = 0with open(&#39;20190409_192149.mp4&#39;,mode=&#39;rb&#39;) as f1,open(&#39;a.mp4&#39;,mode=&#39;wb&#39;) 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(&#39;%s%%\r&#39; %val ,end=&#39;&#39;)
    复制代码
  • sys.argv
    1. #!/usr/bin/env python# -*- coding:utf-8 -*-"""让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/testC:\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 shutilshutil.rmtree(path)#在py里执行这个脚本,之后背面带要删除的目录,即可实现删除该目录。
    复制代码
  • sys.path --- 欠
2.2 os

和操纵系统相关的数据。

  • os.path.exists(path) , 假如path存在,返回True;假如path不存在,返回False
  • os.stat('20190409_192149.mp4').st_size , 获取文件大小
  • os.path.abspath() , 获取一个文件的绝对路径
    1. path = &#39;20190409_192149.mp4&#39; # D:\code\s21day14\20190409_192149.mp4import osv1 = os.path.abspath(path)print(v1)
    复制代码
  • os.path.dirname ,获取路径的上级目录
    1. import osv = r"D:\code\s21day14\20190409_192149.mp4"#r,取消注意注意。其中出现转义符,取消转义。相当于在\,前加一个\。#v2 = "D:\\code\\s21day14\\n1.mp4"print(v2)print(os.path.dirname(v))
    复制代码
  • os.path.join ,路径的拼接
    1. import ospath = "D:\code\s21day14" # user/index/inx/fasd/,os可以根据不同的系统目录格式举行拼接。v = &#39;n.txt&#39;result = os.path.join(path,v)print(result)result = os.path.join(path,&#39;n1&#39;,&#39;n2&#39;,&#39;n3&#39;)print(result)
    复制代码
  • os.listdir , 查看一个目录下所有的文件【第一层】
    1. import osresult = os.listdir(r&#39;D:\code\s21day14&#39;)for path in result:    print(path)
    复制代码
  • os.walk , 查看一个目录下所有的文件【所有层】
    1. import osresult = os.walk(r&#39;D:\code\s21day14&#39;)for a,b,c in result:    # a,正在查看的目录 b,此目录下的文件夹  c,此目录下的文件    for item in c:        path = os.path.join(a,item)        print(path)
    复制代码
  • 补充:

    • 转义
      1. v1 = r"D:\code\s21day14\n1.mp4"  (推荐)print(v1)v2 = "D:\\code\\s21day14\\n1.mp4"print(v2)
      复制代码

2.3 shutil
  1. import shutilshutil.rmtree(path)#还可以压缩,解压文件。
复制代码

天涯海角也要找到Ni:python笔记14

中发现Ni: python笔记14
中发现Ni: python笔记14
中发现Ni: python笔记14
中发现Ni: python笔记14
中发现Ni: python笔记14
中发现Ni: python笔记14
相关技术服务需求,请联系管理员和客服QQ:2753533861或QQ:619920289
您需要登录后才可以回帖 登录 | 用户注册

本版积分规则

帖子推荐:
客服咨询

QQ:2753533861

服务时间 9:00-22:00

快速回复 返回顶部 返回列表