1. #普通装饰器基本格式
  2. def wrapper(func):
  3. def inner():
  4. pass
  5. return func()
  6. return inner
  7. def func():
  8. pass
  9. func = wrapper(func)
  10. func()
  11. #带参数装饰器基本格式
  12. def w(counter):
  13. def wrapper(func):
  14. def inner(*args,**keargs):
  15. lis = []
  16. for i in range(0,counter):
  17. a=func(*args,**keargs)
  18. lis.append(a)
  19. return lis
  20. return inner
  21. return wrapper
  22. def func(*args,**keargs):
  23. return 8

0.装饰器补充

  • 常见的模块(hashlib,random,getpass,time)

  • 默认值参数尽量是不可变数据类型!可变数据类型有坑!****

    1. def func(a,b=[]):
    2. b.append(a)
    3. return b
    4. l1 = func(1)
    5. l2 = func(2,[11,22])
    6. l3 = func(3)
    7. # [1,3] [11,22,2] [1,3]
    8. print(l1,l2,l3) #最后输出的时候l1与l3均已运行,b=[1,3]
    1. def func(a,b=[]):
    2. b.append(a)
    3. print(b) #函数执行一次输出一次
    4. func(1)
    5. func(2,[11,22,33])
    6. func(3)
    7. # [1] [11,22,33,2] [1,3]
  • 递归

    • 函数自己调用自己.效率低
  • 装饰器:

  1. #普通装饰器基本格式
  2. def x(func):
  3. def inner():
  4. return func()
  5. return inner
  6. @x
  7. def index():
  8. pass
  9. #带参数的装饰器基本格式
  10. def x(counter):
  11. def wrapper(func):
  12. def inner(*args,**kwargs):
  13. data = func(*args,**kwargs) # 执行原函数并获取返回值
  14. return data
  15. return inner
  16. return wrapper
  17. @x(counter)
  18. def index():
  19. pass
  1. #题
  2. # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【题】
  3. def xxx(counter):
  4. print('x函数')
  5. def wrapper(func):
  6. print('wrapper函数')
  7. def inner(*args,**kwargs):
  8. for i in range(counter):
  9. data = func(*args,**kwargs) # 执行原函数并获取返回值
  10. return data
  11. return inner
  12. return wrapper
  13. @xxx(5)
  14. def index():
  15. return 8
  16. v = index()
  17. print(v)

1.带参数的装饰器

  • flask框架中存在很多带参数的装饰器;

2.模块

  • \n 换行符

  • \t 制表符table

  • \r 回到当前的起始位置,再次打印时删除本行内容

    1. print('回到起始位置\r',end='')
    2. print('清空原有内容',end='')
  • r 释义,当文件路径中存在\n或者\t等字符时,当做普通字符处理

    1. v1 = r"D:\code\s21day14\n1.mp4" (推荐)
    2. print(v1)

1.os模块

和操作系统相关的数据。

  • os.path.exists(path) , 如果path存在,返回True;如果path不存在,返回False

  • os.stat('20190409_192149.mp4').st_size , 获取文件大小

  • os.path.abspath() , 获取一个文件的绝对路径

    1. path = '20190409_192149.mp4' # D:\code\s21day14\20190409_192149.mp4
    2. import os
    3. v1 = os.path.abspath(path)
    4. print(v1)
  • os.path.dirname ,获取路径的上级目录

    1. import os
    2. v = r"D:\code\s21day14\20190409_192149.mp4"
    3. print(os.path.dirname(v))
  • os.path.join ,路径的拼接

    1. import os
    2. path = "D:\code\s21day14" # user/index/inx/fasd/
    3. v = 'n.txt'
    4. result = os.path.join(path,v)
    5. print(result)
    6. result = os.path.join(path,'n1','n2','n3')
    7. print(result)
  • os.listdir , 查看一个目录下所有的文件【第一层】

    1. import os
    2. result = os.listdir(r'D:\code\s21day14')
    3. for path in result:
    4. print(path)
  • os.walk , 查看一个目录下所有的文件【所有层】

    1. import os
    2. result = os.walk(r'D:\code\s21day14')
    3. for a,b,c in result:
    4. # a,正在查看的目录 b,此目录下的文件夹 c,此目录下的文件
    5. for item in c:
    6. path = os.path.join(a,item)
    7. print(path)

2.sys模块

python解释器相关的数据。

  • sys.getrefcount , 获取一个值的应用计数

    1. a = [11,22,33]
    2. b = a
    3. print(sys.getrefcount(a))
  • sys.getrecursionlimit , python默认支持的递归数量

  • sys.stdout.write --> print (进度)

    1. import time
    2. for i in range(1,101):
    3. msg = "%s%%\r" %i
    4. print(msg,end='')
    5. time.sleep(0.05)
    1. #进度显示
    2. import os
    3. # 1. 读取文件大小(字节)
    4. file_size = os.stat('20190409_192149.mp4').st_size
    5. # 2.一点一点的读取文件
    6. read_size = 0
    7. with open('20190409_192149.mp4',mode='rb') as f1,open('a.mp4',mode='wb') as f2:
    8. while read_size < file_size:
    9. chunk = f1.read(1024) # 每次最多去读取1024字节
    10. f2.write(chunk)
    11. read_size += len(chunk)
    12. val = int(read_size / file_size * 100)
    13. print('%s%%\r' %val ,end='')
  • sys.argv

    1. #!/usr/bin/env python
    2. # -*- coding:utf-8 -*-
    3. """
    4. 让用户执行脚本传入要删除的文件路径,在内部帮助用将目录删除。
    5. C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test
    6. C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py
    7. """
    8. import sys
    9. # 获取用户执行脚本时,传入的参数。
    10. # C:\Python36\python36.exe D:/code/s21day14/7.模块传参.py D:/test
    11. # sys.argv = [D:/code/s21day14/7.模块传参.py, D:/test]
    12. path = sys.argv[1]
    13. # 删除目录
    14. import shutil
    15. shutil.rmtree(path)

3.time

  • time.time() 获取当前时间
  • time.sleep('时间') 休眠时间

4.shutil

  1. #删除
  2. import shutil
  3. shutil.rmtree(path)

模块小结

  • random
  • hashlib
  • getpass
  • time
  • os
  • sys
  • shutil

python学习day14 装饰器(二)&模块的更多相关文章

  1. python学习笔记--装饰器

    1.首先是一个很无聊的函数,实现了两个数的加法运算: def f(x,y): print x+y f(2,3) 输出结果也ok 5 2.可是这时候我们感觉输出结果太单一了点,想让代码的输出多一点看起来 ...

  2. Python学习 :装饰器

    装饰器(函数) 装饰器作为一个函数,可以为其他函数在不修改原函数代码的前提下添加新的功能 装饰器的返回值是一个函数对象.它经常用于有切面需求的场景,比如:插入日志.性能测试.事务处理.缓存.权限校验等 ...

  3. python 学习分享-装饰器篇

    本篇内容为偷窃的~哈哈,借用一下,我就是放在自己这里好看. 引用地址:http://www.cnblogs.com/rhcad/archive/2011/12/21/2295507.html 第一步: ...

  4. python学习之装饰器-

    python的装饰器 2018-02-26 在了解python的装饰器之前我们得了解python的高阶函数 python的高阶函数我们能返回一个函数名并且能将函数名作为参数传递 def outer() ...

  5. python学习 day13 装饰器(一)&推导式

    装饰器&推导式 传参位置参数在前,关键词参数在后 函数不被调用内部代码不被执行 函数在被调用的时候,每次都会开辟一个新的内存地址,互不干扰 #经典案例 def func(num): def i ...

  6. python学习之-- 装饰器

    高阶函数+嵌套函数 == 装饰器 什么是装饰器: 其实也是一个函数. 功能:为其他的函数添加附加功能 原则:不能修改被装饰的函数的源代码和调用方式 学习装饰器前首先要明白以下3条事项: 1:函数 即 ...

  7. Python学习笔记--装饰器的实验

    装饰器既然可以增加原来函数的功能,那能不能改变传给原函数的参数呢? 我们实验一下,先上代码: #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date ...

  8. 6月4日 python学习总结 装饰器复习

    1.  装饰器的原理以及为什么要使用装饰器 在代码运行期间动态增加功能的方式,称之为"装饰器"(Decorator). 在不影响原代码结构的情况下为其添加功能 2.  装饰器的基本 ...

  9. Python学习之装饰器进阶

    函数知识回顾: 函数的参数分为:实参和形参. 实参:调用函数的时候传入的参数: 形参:分为3种(位置参数.默认参数.动态传参) 位置参数:必须传值 def aaa(a,b): print(a,b) a ...

随机推荐

  1. C# 动态生成word文档

    本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-->管理NuGet程序包 ...

  2. 安卓开发:UI组件-Button和EditText

    2.3Button Button继承自TextView,除了通过属性设置按钮样式,还可以通过绑定drawable文件的方式来实现不同样式. 2.3.1按钮样式 新建Activity:ButtonAct ...

  3. 容器化系列 - Zookeeper启动和配置 on Docker

    本文简要说明了如何在Docker容器中启动和配置Zookeeper. 1 准备工作 1.1 下载zookeeper镜像 $ docker pull zookeeper:3.4 1.2 单点模式 安装D ...

  4. [翻译]:MySQL Error: Too many connections

    翻译:MySQL Error: Too many connections   前言: 本文是对Muhammad Irfan的这篇博客MySQL Error: Too many connections的 ...

  5. Linux电源管理(9)_wakelocks【转】

    1. 前言 wakelocks是一个有故事的功能. wakelocks最初出现在Android为linux kernel打的一个补丁集上,该补丁集实现了一个名称为"wakelocks&quo ...

  6. MR单元测试以及DeBug调试

    Hadoop的MapReduce程序提交到集群环境中运行,出问题时定位非常麻烦,有时需要一遍遍修改代码和打印日志来排查问题,哪怕是比较小的问题.如果数据量很大的话调试起来就相当耗费时间. 而且,Map ...

  7. Ubuntu忘记密码后强制修改密码

    环境:Ubuntu 16.04 由于很久不用我的Ubuntu系统导致密码忘记,就想着应该有什么办法可以强制修改root密码,就上百度找了一下,果然Ubuntu有办法强制修改root密码. 在这里要谢谢 ...

  8. 我的第一个python web开发框架(35)——权限数据库结构设计

    接下来要做的是权限系统的数据库结构设计,在上一章我们了解了权限系统是通过什么来管理好权限的,我们选用其中比较常用的权限系统来实现当前项目管理要求. 下面是我们选择的权限系统关系模型: 从以上关系可以看 ...

  9. sbt安裝與配置

    官方下載地址:https://www.scala-sbt.org/download.html?spm=a2c4e.11153940.blogcont238365.9.42d147e0iF8dhv 解压 ...

  10. Java连接数据库,及增删改查

    自定义连接数据库的util类 package com.shuzf.jdbc; import java.sql.Connection; import java.sql.DriverManager; im ...