Maison  >  Article  >  développement back-end  >  Explication détaillée des décorateurs, des fonctions intégrées et de json en python

Explication détaillée des décorateurs, des fonctions intégrées et de json en python

零下一度
零下一度original
2017-06-25 10:24:271275parcourir

Décorateur

Un décorateur est essentiellement une fonction Python, qui permet à d'autres fonctions d'ajouter des fonctions supplémentaires sans apporter de modifications au code. La valeur de retour du décorateur est également un objet fonction.

Regardons d'abord un exemple simple :

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

Il y a une nouvelle exigence que j'espère enregistrer le temps d'exécution de la fonction et le code dont elle a besoin. pour calculer l'heure dans le code. :

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

login() et d'autres fonctions ont également des exigences de type. Comment faire ? Si vous écrivez une heure de début et de fin dans chaque fonction, puis calculez la différence, le code sera redondant. Vous pouvez définir une fonction pour calculer spécifiquement le temps d'exécution, puis exécuter le vrai code métier, comme suit :

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)

La logique du code ci-dessus ne peut pas être comprise, mais dans ce cas, une fonction est passée en paramètre à la fonction timer() à chaque fois, et cette méthode a détruit la logique du code d'origine structure. Lors de l'exécution de la logique métier auparavant, run() était exécuté, mais maintenant timer() doit être exécuté. L'utilisation de décorateurs peut résoudre les problèmes ci-dessus.

Décorateur simple

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相当于decorun()                  #run调用相当于deco()

La fonction est une variable. Une fonction en python est une variable. Le nom de la fonction est une variable. adresse de la fonction, qui met le corps de la fonction en mémoire Lors de l'appel, recherchez le corps de la fonction à partir de l'adresse mémoire dans le nom de la fonction et exécutez la fonction. Ajouter des parenthèses après le nom de la fonction signifie appeler la fonction. Si vous écrivez uniquement le nom de la fonction, imprimez l'adresse mémoire de la fonction.

La fonction timer est un décorateur. Elle enveloppe la fonction qui exécute la vraie méthode métier dans la fonction. Il semble que l'exécution soit décorée par la minuterie. L'évolution se poursuit comme suit :

 timer(func):       deco(*args, **kwargs):   start_time =*args, **kwargs)    end_time =(, end_time - deco               @timer                run():           time.sleep(1()
run()

Le code mis à jour de la fonction run() est le suivant : En fait, le code run n'a pas été directement modifié, mais lorsque le décorateur est appelé, le code d'exécution est mis à jour.

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

fonction intégrée python

print(all([1, 2, 3, 0, 11, -1]))   #判断可迭代对象里面的值是否都为真,有一个为假即为False,非空即真非0即真print(any([0, 1, 2]))              #判断可迭代对象里面的值是否有一个为真,即为Trueprint(bin(10))                    #将十进制转换为二进制print(bool('sdf'))                   #将一个对象转换为布尔类型func = ''print(callable(func))             #判断传入的对象是否可调用,func为变量不可调用,即返回Falsedef adf():passprint(callable(adf))             #判断传入的对象是否可调用,adf为方法即可调用,即返回Trueprint(chr(98))               #打印数字对应的ASCII码,98=bprint(ord('a'))              #打印字符串对应的ASCII码, a=97print(dict(a=1, b=2))        #转换成字典,{'b': 2, 'a': 1}#print(eval('[a=1]'))print(exec('def a():pass'))   #执行python代码,只能执行简单的,定义数据类型和运算def func(num):
    name = '88'print(locals())print(globals())return numprint(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 sysprint(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'

module aléatoire

import randomprint(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.8791750348305625print(random.random())                    #随机0-1的浮点数,0.9465901444615425random.shuffle([1, 2, 3, 4, 5, 6])  #随机打乱list的值,只能是list

Fonction JSON

L'utilisation de la fonction JSON nécessite d'importer la librairie json : import json.

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

Par exemple, comme suit :

format de contenu 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. charges ()

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串写入文件

Le a.json écrit est le suivant :

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

json.dumps()

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn