装饰器

装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象。

先看简单例子:

def run():
time.sleep(1)
print('run....')

现有一个新的需求,希望可以记录下函数的运行时间,需要在代码中计算时间的代码:

def run():
start_time = time.time()
time.sleep(1)
print('run....')
end_time = time.time()
print('run time', end_time - start_time)

login()等多个函数也有类型的需求,怎么做?若在每个函数内都写一个开始、结束时间,然后再算差值,这样代码就冗余了,可以定义一个函数,专门计算执行时间,再执行真的业务代码,如下:

def timer(func):      #计算时间
start_time = time.time()
func()
end_time = time.time()
print('run time', end_time - start_time) def run(): #业务代码
time.sleep(1)
print('run....')
timer(run)

以上代码逻辑不能理解,但这样的话,每次都将一个函数作为参数传递给timer()函数,而且这种方式已经破坏了原有的代码逻辑结构,之前执行业务逻辑时,执行运行run(),但现在不得不运行timer()。使用装饰器,可以解决以上问题。

简单装饰器

def timer(func):      #计算时间
def deco(*args, **kwargs): #可以传参
start_time = time.time()
func(*args, **kwargs) #函数调用
end_time = time.time()
print('run time', end_time - start_time)
return deco #return 函数名,函数即变量 def run(): #业务代码
time.sleep(1)
print('run....') run = timer(run) #run相当于deco
run() #run调用相当于deco()

函数即变量,在python里面的函数就是一个变量、函数名就是一个变量,这个函数名存放的是这个函数的内存地址,它把函数体放到内存里,在调用的时候从函数名里面的这个内存地址找到函数体然后运行这个函数。函数名后面加上小括号就是调用这个函数,如果只写这个函数名的话,打印一下就是这个函数的内存地址。

函数timer就是装饰器,它把执行真正业务方法的func包裹在函数里面,看起来像run被timer装饰了。继续演变如下:

def timer(func):      #计算时间
def deco(*args, **kwargs): #可以传参
start_time = time.time()
func(*args, **kwargs) #函数调用
end_time = time.time()
print('run time', end_time - start_time)
return deco #return 函数名,函数即变量
@timer #使用 @ 形式将装饰器附加到函数上时,就会调用此方法.timer(func) 返回的是函数名deco,所以run== deco,函数名即变量,此时run的代码已更新,func() = run之前的代码
def run(): #业务代码
time.sleep(1)
print('run....')
run()

run()函数更新后代码如下:其实run的代码并没有直接改动,只是调用装饰器时,run的代码进行了更新。

def run():
start_time = time.time()
time.sleep(1)
print('run....')
end_time = time.time()
print('run time', end_time - start_time)
import time
def timmer(func):
def deco(*arg,**kwarg):
start_time=time.time()
func(*arg,**kwarg)
stop_time=time.time()
print('the func run time is %s'%(stop_time-start_time))
return deco @timmer
def test1():
time.sleep(1)
print('in the test1') @timmer
def test2(name,age) :
time.sleep(2)
print('in the test2:',name,age) test1()
test2('niuniu,18)

python 内置函数

print(all([1, 2, 3, 0, 11, -1]))   #判断可迭代对象里面的值是否都为真,有一个为假即为False,非空即真非0即真
print(any([0, 1, 2])) #判断可迭代对象里面的值是否有一个为真,即为True
print(bin(10)) #将十进制转换为二进制
print(bool('sdf')) #将一个对象转换为布尔类型
func = ''
print(callable(func)) #判断传入的对象是否可调用,func为变量不可调用,即返回False
def adf():
pass
print(callable(adf)) #判断传入的对象是否可调用,adf为方法即可调用,即返回True
print(chr(98)) #打印数字对应的ASCII码,98=b
print(ord('a')) #打印字符串对应的ASCII码, a=97
print(dict(a=1, b=2)) #转换成字典,{'b': 2, 'a': 1}
#print(eval('[a=1]'))
print(exec('def a():pass')) #执行python代码,只能执行简单的,定义数据类型和运算
def func(num):
name = ''
print(locals())
print(globals())
return num
print(list(filter(func, [0, 1, 2, 3, 4]))) #在python3里面这么用是没问题
filter(func, [1, 2, 3, 4]) #根据前面的函数处理逻辑,依次处理后面可迭代对象里面的每个元素,返回true保存
print(list(map(func, [0, 1, 2, 3, 4]))) #根据前面的函数处理逻辑,依次处理后面可迭代对象里面的每个元素,保存前面函数返回的所有结果 </span>
print(globals()) #返回程序内所有的变量,返回的是一个字典,函数里面的局部变量不会返回
print(locals()) #返回局部变量
print(hex(111)) #数字转成16进制
print(max(111, 12, 13, 14, 16, 19)) #取最大值
print(oct(111)) #把数字转换成8进制
print(round(11.1198, 2)) #取几位小数,会四舍五入
print(sorted([2, 31, 34, 6, 1, 23, 4], reverse=False))#排序
dic={1:2,3:4,5:6,7:8}
print(sorted(dic.items())) #按照字典的key排序,[(1, 2), (3, 4), (5, 6), (7, 8)]
print(sorted(dic.items(), key=lambda x:x[1])) #按照字典的value排序
import time #导入一个模块
import sys
print(sys.path) #查看系统环境变量有哪些目录
sys.path.append(r'E:\python_workspace\base-code') #将base-code下的代码添加到环境变量,允许python xxx.py就不报错
from day4.day5_test import hhh
hhh() #直接右键允许不报错,使用python model2.py允许时报错,找不到day4模块No module named 'day4'

random 模块

import random
print(random.randint(1, 20)) #在1-19之间随机生成一个整数,随机
print(random.choice('abs123')) #随机取一个元素,随机可迭代对象:字符串、字典、list、元组
print(random.sample('abcdfgrtw12', 3)) #随机取几个元素,3是长度,['2', 'a', 'b'],返回结果是list类型
print(random.uniform(1, 9)) #随机浮点数,随机取1-9之间的浮点数,可指定范围,5.8791750348305625
print(random.random()) #随机0-1的浮点数,0.9465901444615425
random.shuffle([1, 2, 3, 4, 5, 6]) #随机打乱list的值,只能是list

JSON函数

使用 JSON 函数需要导入 json 库:import json

函数 描述
json.dumps 将字典转换为json串
json.dump 将字典转换的json串写入文件
json.loads 将json串转换为字典
json.load 从文件中读取json数据,然后转换为字典

举例说明,如下:

a.json内容格式:

{"car":{"price":1100,"color":"red"},"mac":{"price":7999,"color":"black"},"abc":{"price":122,"color":"green"}}

json.load()

import json
with open('a.json') as fp:
shop_dic = json.load(fp) #从a.json文件内读取数据,返回结果为字典:{'abc': {'price': 122, 'color': 'green'}, 'mac': {'price': 7999, 'color': 'black'}, 'car': {'price': 1100, 'color': 'red'}}
print(shop_dic)

json.loads()

s_json = '{"name":"niuniu","age":20,"status":true}'
print(json.loads(s_json)) #将json串转换为字典:{'age': 20, 'status': True, 'name': 'niuniu'}

json.dump()

import json
with open('a.json', 'a+') as fp:
dic = {'name': 'niuniu', 'age': 18}
fp.seek(0)
fp.truncate()
json.dump(dic, fp) #将字典转换为json串写入文件

写入的a.json如下:

{"age": 18, "name": "niuniu"}

json.dumps()

import json
dic = {'name': 'niuniu', 'age': 18}
print(json.dumps(dic)) #将字典转换为json串:{"name": "niuniu", "age"

扩展小知识点:

将字典内容写入json文件,包含中文。

1. 中文写入json文件后显示乱码,怎么解决?                      ensure_ascii = False

2. 写入的字典内容显示为不一行,显示不美观,怎么解决? indent = 4

import json

d = {"Name": "战神","sex" : ["男","女","人妖"],"Education":{"GradeSchool" : "第一小学","MiddleSchool" : ["第一初中" , "第一高中"], "University" :{ "Name" : "哈佛大学", "Specialty" : ["一年级","二年级"]}}}

with open('a.json', 'w', encoding='utf-8') as f:
# 中文显示乱码问题, ensure_ascii = False
# json格式化问题, indent = 8
# s = json.dumps(d, ensure_ascii=False, indent=8) 字典转换为json 字符串
# f.write(s) #第二种写法
json.dump(d, f, ensure_ascii=False,indent=8)

写入的json文件,a.json:

enumerate 模块

     enymerate函数用于将一个可遍历的数据对象(列表,元组或字符串)组合为一个索引序列,同时列出数据和数据下标,一般用在for循环。

小案例:

li = ['a', 'b', 'c']

# 常规写法
count = 0
for line in li:
print('下标%s----> %s' %(count, line))
count += 1 #enumerate函数
for index, value in enumerate(li): #取下标值,默认从0开始
print('编号%s--->%s' % (index, value))

运行结果:

实际操作:

将list数据写入excel

import xlwt

book = xlwt.Workbook()
sheet = book.add_sheet('user')
stu_list = [
[1, '小明', 'beijing', '', '女'],
[2, '小花', 'beijing', '', '女'],
[4, 'apple', 'beijing', '', '女'],
[5, '橙子', 'beijing', '', '女'],
[6, '樱桃', 'beijing', '', '女'],
[7, '香蕉', 'beijing', '', '女'],
] #常规写法
row = 1
for row_line in stu_list: # [1, '小明', 'beijing', '186232424', '女']
clow = 0
for clow_line in row_line: # 1 , 小明
sheet.write(row, clow, clow_line)
clow += 1
row += 1 # enumerate 函数
for row, row_data in enumerate(stu_list, 1): # 下标从1开始取, row = 1
# row_data : [1, '小明', 'beijing', '186232424', '女']
for clo, clo_data in enumerate(row_data): # enumerate 默认取下标0,clo = 0
# clow_data = 1 / 小明
sheet.write(row, clo, clo_data) book.save('stud.xls')

python笔记5:装饰器、内置函数、json的更多相关文章

  1. python基础之 装饰器,内置函数

    1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使用外部变量(非全局变量)叫做闭包! def wrapper(): money =10 def inner(num) ...

  2. python 函数 装饰器 内置函数

    函数 装饰器 内置函数 一.命名空间和作用域 二.装饰器 1.无参数 2.函数有参数 3.函数动态参数 4.装饰器参数 三.内置函数 salaries={ 'egon':3000, 'alex':10 ...

  3. python基础 (装饰器,内置函数)

    https://docs.python.org/zh-cn/3.7/library/functions.html 1.闭包回顾 在学习装饰器之前,可以先复习一下什么是闭包? 在嵌套函数内部的函数可以使 ...

  4. python学习 day12 (3月18日)----(装饰器内置函数)

    读时间函数: # import time # def func(): # start_time = time.time() # 代码运行之前的时间 # print('这是一个func函数') # ti ...

  5. [Python笔记]第四篇:内置函数

    本篇主要内容:内置函数 函数 参考:https://docs.python.org/3.5/library/functions.html 内置函数列表 一.数学运算类 abs(x)求绝对值 >& ...

  6. Python笔记(二十一)_内置函数、内置方法

    内置函数 issubclass(class1,class2) 判断class1类是否为class2类的子类,返回True和False 注意1:类会被认为是自身的子类 >>>issub ...

  7. python基础--定义装饰器(内置装饰器)

    装饰器的定义: 装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象.它经常用于有切面需求的场景中,比如-- >插入 ...

  8. python学习之路-4 内置函数和装饰器

    本篇涉及内容 内置函数 装饰器 内置函数 callable()   判断对象是否可以被调用,返回一个布尔值 1 2 3 4 5 6 7 8 9 10 11 num = 10 print(callabl ...

  9. python装饰器内获取函数有用信息方法

    装饰器内获取函数有用信息方法 .__doc__用于得到函数注释信息 .__name_用于得到函数名 在函数引用装饰器的时候,函数名会变为装饰器内部执行该函数的名字,所有在直接执行函数名加.__doc_ ...

  10. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

随机推荐

  1. 如何使用angularjs实现表单验证

    <!DOCTYPE html> <html ng-app="myApp"> <head> <title>angularjs-vali ...

  2. python的__init__和__new__

    本文所有实例代码在python3.7下 一.__new__和__init__区别 1.__new__先于__init__执行;__new__是相当于其他OOP语言的构造方法,负责创建实例:之后,__i ...

  3. Rxjava2.0 链式请求异常处理

    使用Rxjava2.0的过程中,难免会遇到链式请求,而链式请求一般都是第一个抛异常,那么后面的请求都是不会走的.现在来讨论一下链式请求的一种异常处理方法.例如: 一个登录-->通过登录返回的to ...

  4. 算法笔记_058:蓝桥杯练习 2的次幂表示(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 问题描述 任何一个正整数都可以用2进制表示,例如:137的2进制表示为10001001. 将这种2进制表示写成2的次幂的和的形式,令次幂高的排在前面 ...

  5. 06-hibernate注解-一对多单向外键关联

    一对多单向外键 1,一方持有多方的集合,一个班级有多个学生(一对多). 2,@OneToMany(cascade={CascadeType.ALL}, fetch=FetchType.LAZY ) / ...

  6. Python-代码对象

    可调用的对象是python执行环境中最重要的部分,python语句,赋值,表达式,模块等,这些 对象只是构成可执行代码块的拼图的很少的一部分,而这些代码块被称为代码对象.   每个可调用的对象的核心都 ...

  7. 【Shiro】Apache Shiro架构之权限认证(Authorization)

    Shiro系列文章: [Shiro]Apache Shiro架构之身份认证(Authentication) [Shiro]Apache Shiro架构之集成web [Shiro]Apache Shir ...

  8. [转载]Scikit-learn介绍几种常用的特征选择方法

    #### [转载]原文地址:http://dataunion.org/14072.html 特征选择(排序)对于数据科学家.机器学习从业者来说非常重要.好的特征选择能够提升模型的性能,更能帮助我们理解 ...

  9. LAMP架构三

    PHP相关配置 1.查找php配置文件/usr/local/php/bin/php -i或者phpinfo() [root@bogon admin]# /usr/local/php/bin/php - ...

  10. 常见typedef 用法

    1.常规变量类型定义例如:typedef unsigned char uchar描述:uchar等价于unsigned char类型定义      uchar c声明等于unsigned char c ...