今日内容

  带参数的装饰器:flash框架+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)
v2 = func(1,[11,22,33,44])
v3 = func(2)
print(v1,v2,v3)
#返回值为[1,2] [1,11,22,33,44] [1,2] #看代码写结果
def func(data,value=[]):
value.append(data)
return value func(1) #返回值为[1]
func(2,[11,22,33]) #返回值[11,22,33,2]
func(3) #返回值为[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 inner():
return 123
return inner #是闭包:封装值+内层函数需要使用
def func2(name):
def inner():
print(name)
return 123
return inner

    1.4作用域

    1.5递归

      函数自己调用自己。(效率低)

#示例一 递归循环调用 最多不超过1000次
def func():
print(1)
func()
func() #示例二
def func(i):
print(i)
func(i+1)
func(1) #示例三
def func(a,b):
#func(0,1) 1
#func(1,1) 1
#func(1,2) 2
#func(2,3) 3
#fun(3,5) 5
print(b)
func(b,a+b) func(0,1) def func(a):
if a ==5:
return 100000
result = func(a+1)+10
return result
v = func(1) #返回值为100000+10+10+10+10
#递归的返回值
def func(a):
if a==5:
return 100000
result = func(a+1)+10
v1 = func(1) #返回值为None name = "alex"
def func():
def inner():
print(name)
return inner
v= func(a)

   2.模块

    random/hashlib/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(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) #示例三
def x(func):
def inner(a1):
return func(a1)
return inner
@x
def index(a1):
pass
####################################参数的同一目的就是给原来的index函数传参
def x(func):
def inner(a1,a2):
return func()
return inner
@x
def index():
pass
#func=原来的index函数
#index = inner
index(1,2) #如果给好几个函数写一个同一的装饰器,怎么办
def x(func):
def inner(*args,**kwargs):
return func(*args,**kwargs)
return inner
@x
def f1():
pass @x
def f2(a1):
pass @x
def f3(a1,a2):
pass

    1.3关于返回值

#示例一
def x1(func):
def inner(*args,**kwargs):
data= func(*args,**kwargs)
return data
return inner
@x1
def f1():
print(123) v = f1() #执行inner函数,执行func函数,打印123,返回结果为None
print(v) #输出结果为None #示例二
def x1(func):
def inner(*args,**kwargs):
data= func(*args,**kwargs)
return data
return inner
@x1
def f1():
print(123)
return 666 v = f1() #执行inner函数,执行func函数,打印123,返回结果为666
print(v) #输出结果为666 #示例三
def x1(func):
def inner(*args,**kwargs):
data= func(*args,**kwargs)
return inner
@x1
def f1():
print(123)
return 666 v = f1() #执行inner函数,执行func函数,打印123,返回值666赋值个data变量,但inner函数没有返回值
print(v) #输出结果为None #装饰器的建议写法
def x1(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner

    1.4关于前后

def x1(func):
def inner(*args,**kwargs):
print("调用原函数之前")
data = func(*args,**kwargs)
print("调用原函数之后")
return data
return inner @x1
def index():
print(123)
index()

    1.5带参数的装饰器

#第一步:执行ret = xxx(index)
#第二步:将返回值index = ret
@xxx
def index():
pass #第一步:执行v = uuu(9)
#第二步:ret = v(index)
#第三步:index = ret
@uuu(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):
print("调用原函数之前")
data = func(*args,**kwargs)
print("调用原函数之后")
return data
return inner
return wrapper @x(9)
def index():
pass

    练习题

# 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,把每次结果添加到列表中,最终返回列表。
def x(counter):
def wrapper(func):
def inner(*args,**kwargs):
user_list = []
for i in range(counter):
data = func(*args,**kwargs)
user_list.append(data)
return user_list
return inner
return wrapper @x(9)
def index():
return 8
v = index()
print(v) #输出结果为:[8, 8, 8, 8, 8, 8, 8, 8, 8] # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回最后一次执行的结果【面试题】
def x(counter):
def wrapper(func):
def inner(*args,**kwargs):
for i in range(counter):
data = func(*args,**kwargs)
return data
return inner
return wrapper @x(9)
def index():
return 8
v = index()
print(v) #输出结果为:8 # 写一个带参数的装饰器,实现:参数是多少,被装饰的函数就要执行多少次,并返回执行结果中最大的值
def x(counter):
def wrapper(func):
def inner(*args,**kwargs):
value= 0
for i in range(counter):
data = func(*args,**kwargs)
if data > value :
value = data
return value
return inner
return wrapper @x(9)
def index():
return 8
v = index()
print(v) #输出结果为:[8, 8, 8, 8, 8, 8, 8, 8, 8] def x(counter):
print('x函数')
def wrapper(func):
def inner(*args,**kwargs):
if counter:
return 123
return func(*args,**kwargs)
return inner
return wrapper #990个函数不添加装饰器,其余10个添加装饰器
@x(True)
def index990():
pass @x(False)
def index10():
pass

    1.6欠

      元数据:flash框架

      多个装饰器:flash框架

      自己了解如下内容

        @x1

        @x2

        def func():

          pass

    1.7总结    

###################基本装饰器(更重要)###############
def wrapper(func):
def inner(*args,**kwargs):
data = func(*args,**kwargs)
return data
return inner
@wrapper
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():
print(123) index()

  2.模块

    2.1sys

      python解释器相关的数据

       (1)sys.getrefcount:获取一个值的应用计数

示例:

import sys
a =[11,22]
b = a
print(sys.getrefcount(a)) #输出结果为:3

       (2)sys.getrecursionlimit:获取python中默认支持的递归次数

       (3)sys.sdout.write ----》print

示例一:

import time
for i in range(1,200):
msg = "%s%%\r" %i
print(msg,end='')
time.sleep(0.5)

示例二:

import os 
#1.读取文件的大小 单位为kb
file_size = os.stat("1582263261(1).jpg").st_size #2.一点一点的读取文件的大小:
read_size = 0
with open(file= '1582263261(1).jpg',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='')

      (4) sys.argv

示例一:

"""
#让用户执行脚本输入要删除的文件路径,在内部帮助用户删除目录
C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\venv\Scripts\python.exe C:/Users/Lenovo.LAPTOP-C8NNKEAA/PycharmProjects/learn_python/day14/rm_path.py C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14\test
C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\venv\Scripts\python.exe C:/Users/Lenovo.LAPTOP-C8NNKEAA/PycharmProjects/learn_python/day14/rm_path.py
"""
import sys
#sys.argv是获取用户执行脚本时,参入的参数
# 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)

       (5)sys.path---->欠    

    2.2 os

      和操作系统相关的数据

      (1)os.path.exists(path) 如果path存在,则返回True,否则返回False

       (2)os.stat(文件名).st_size:获取文件的大小

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

示例:        

import os
path = '1582263261(1).jpg'
result = os.path.abspath(path)
print(result) #输出的结果为:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14\1582263261(1).jpg

       (4)os.path.dirname:获取路径的上层目录

示例:

import os
path = r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14\1582263261(1).jpg'
result = os.path.dirname(path)
print(result) #输出的结果为:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14

       (5)os.path.join:路径的拼接

示例:

import os
path = r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14'
v1 = '1582263261(1).jpg' result =os.path.join(path,v1)
print(result) #输出的结果为:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14\1582263261(1).jpg print(os.path.join(path,'n1','n2','n3','n4')) #输出结果为:C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14\n1\n2\n3\n4

       (6)os.listdir:查看一个目录下所有文件【仅限第一层】

示例:

import os
result = os.listdir(r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14')
print(result) #result 是一个列表,存储当前目录下的文件及文件夹,包括隐藏文件
for item in result:
print(item)

       (7)os.walk:查看一个目录下所有的文件【所有层】

示例:

import os
result = os.walk(r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14')
print(result) #result 是<generator object walk at 0x00000251EDDE5900>
for a,b,c in result:
print(a,b,c) #a:返回的是正在查看的目录 b:当前目录下存在的文件夹 c:此目录下的文件
#如果此目录下没有文件夹,就返回一条记录;
#如果此目录下有一个文件夹,就返回两条记录;如果有两个文件夹,就返回三天记录 for item in c:
path = os.path.join(a,item)
print(path) #该段代码返回是此目录下所有文件的完整路径

       (8)补充 ---》转义:利用'\'表示转义

示例:

path = r'C:\Users\Lenovo.LAPTOP-C8NNKEAA\PycharmProjects\learn_python\day14'
print(path) #等同写法
path = 'C\\Users\\Lenovo.LAPTOP-C8NNKEAA\\PycharmProjects\\learn_python\\day14'
print(path)

    2.3 shutil

    #删除某个目录
    import shutil
    shutil.rmtree(path)

内容总结

  普通装饰器(5**)

    参数/返回值/前后

  带参数的装饰器(4**)

  模块

    random/hashlib/getpass/time/os/sys/shutil

20200221--python学习第14天的更多相关文章

  1. Python学习总结14:时间模块datetime & time & calendar (一)

    Python中的常用于处理时间主要有3个模块datetime模块.time模块和calendar模块. 一.time模块 1. 在Python中表示时间的方式 1)时间戳(timestamp):通常来 ...

  2. Python学习:14.Python面向对象(一)

    一.面向对象简介 Python设计之初,就是一门面向对象的语言,在Python中一切皆对象,而且在Python中创建一个对象也很简单,今天我们就来学习一下Python的面向对象的知识. 二.两种编程方 ...

  3. Python学习(14)模块二

    一:_name_ Python中if _name_ == '_main_'的解析 当你打开一个.py文件时,经常会在代码的最下面看到if __name__ == '__main__':,现在就来介 绍 ...

  4. Python学习(14)模块一

    目录 Python 模块 import语句 from ... import 语句 from ... import * 语句 定位模块 PYTHONPATH变量 命名空间和变量 dir()函数. glo ...

  5. python学习笔记14(多态、封装、继承)

    创建自已的对象(尤其是类型或者被称为类的对象)是python非常核心的概念. 多态: 可对不同类的对象使用同样的操作. 封装:对外部世界隐藏对象的工作细节. 继承:以普通的类为基础建立专门的类对象. ...

  6. Python学习笔记14—模块

    在python中所有的模块都被加入到了sys.path中,用下面的方法可以看见模块的位置. >>> import sys >>> import pprint > ...

  7. Python学习笔记14:标准库之信号量(signal包)

    signal包负责在Python程序内部处理信号.典型的操作包含预设信号处理函数,暂停并等待信号,以及定时发出SIGALRM等. 要注意,signal包主要是针对UNIX平台(比方Linux, MAC ...

  8. Python 学习 第14篇:数据类型(元组和集合)

    元组和集合是Python中的基本类型 一,元组 元组(tuple)由小括号.逗号和数据对象构成的集合,各个项通过逗号隔开,元组的特点是: 元组项可以是任何数据类型,也可以嵌套 元组是一个位置有序的对象 ...

  9. python学习笔记(14):可视化分析

    一.Matplotlib 1.用于创建出版质量图表的绘图工具库 2.目的的为Python构建一个Matlab式的绘图接口 3.import matplotlib.pyplot as plt:pyplo ...

  10. 从零开始的Python学习Episode 14——日志操作

    日志操作 一.logging模块 %(message)s 日志信息 %(levelno)s 日志级别 datefmt 设置时间格式 filename 设置日志保存的路径 level 设置日志记录的级别 ...

随机推荐

  1. 案例分析丨H&M用设计冲刺将App研发周期缩短为6个月

    案例背景 H&M是一家来自瑞典的时装公司,1947年成立.截至2018年6月,H&M 分店遍布全球 68 个国家和地区,分店数目为 4338 间. 作为快速服装生产商,H&M的 ...

  2. django框架中的静态文件引入

    首先在项目文件中新建文件夹static 之后在settings.py中配置路径 如下图所示: 下一步在你刚创建的static文件夹中添加app的文件夹名称,例如:teacher,如下图: 之后在tea ...

  3. 干货!直击JVM底层 —— Java Class字节码文件解析

    目录 前言 如何阅读class文件 基本概念 无符号数&表 常量池 魔数(magic number) & 版本号 常量池 访问标志 类引索&父类引索&接口引索集合 字段 ...

  4. Spring Boot2 系列教程 (七) | 使用 Spring Data JPA 访问 Mysql

    前言 如题,今天介绍 Spring Data JPA 的使用. 什么是 Spring Data JPA 在介绍 Spring Data JPA 之前,首先介绍 Hibernate . Hibernat ...

  5. aliPayPlus 科普使用

    本文出自APICloud官方论坛, 感谢论坛版主City7的分享. 首先到 https://open.alipay.com/platform/manageHome.htm 申请应用上线 支付宝网关:这 ...

  6. java 支持分词的高性能拼音转换工具,速度是 pinyin4j 的两倍

    pinyin pinyin 是 java 实现的高性能中文拼音转换工具. 变更日志 创作目的 想为 java 设计一款便捷易用的拼音工具. 如何为 java 设计一款高性能的拼音转换工具 pinyin ...

  7. C语言编译成dll

    首先c语言在开始要加上 #ifdef __cplusplus extern "C" { #endif …被导出的方法名称 #ifdef __cplusplus } #endif 不 ...

  8. dubbo配置文件解读(1)

    详细的Dubbo配置也可以参考:https://blog.csdn.net/abcde474524573/article/details/53026110 (1)<dubbo:service/& ...

  9. Activiti脚本任务(ScriptTask)

    Activiti脚本任务(ScriptTask) 作者:Jesai 你一直问为什么到不了远方,请停下数数你的脚步,是不是还没迈开腿 对于没有接触过groovy脚本语言的人来说,可能比较难使用 应用场景 ...

  10. 「 从0到1学习微服务SpringCloud 」07 RabbitMq的基本使用

    系列文章(更新ing): 「 从0到1学习微服务SpringCloud 」01 一起来学呀! 「 从0到1学习微服务SpringCloud 」02 Eureka服务注册与发现 「 从0到1学习微服务S ...