>  기사  >  백엔드 개발  >  Python의 데코레이터, 내장 함수 및 json에 대한 자세한 설명

Python의 데코레이터, 내장 함수 및 json에 대한 자세한 설명

零下一度
零下一度원래의
2017-06-25 10:24:271331검색

Decorator

데코레이터는 본질적으로 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)

위의 코드 로직은 이해할 수 없지만, 이 경우에는 매번 타이머() 함수에 함수가 매개변수로 전달되며, 이 메서드는 이전에 비즈니스 로직을 실행할 때 원래 코드 논리 구조를 파괴했습니다. ) ), 하지만 이제 타이머()를 실행해야 합니다. 데코레이터를 사용하면 위의 문제를 해결할 수 있습니다.

간단한 데코레이터

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()

함수는 변수입니다. 파이썬에서 함수 이름은 함수의 메모리 주소를 저장합니다. 호출 시 함수명에 있는 메모리 주소에서 함수 본문을 찾아 함수를 실행합니다. 함수 이름 뒤에 괄호를 추가하면 함수를 호출한다는 뜻입니다. 함수 이름만 쓴다면 함수의 메모리 주소를 출력하세요.

함수 타이머는 실제 비즈니스 메소드를 실행하는 기능을 함수에 담는 데코레이터입니다.

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

run() 함수의 업데이트된 코드는 다음과 같습니다. 실제로 실행 코드가 직접 변경된 것은 아니지만 데코레이터를 호출하면 실행 코드가 업데이트됩니다.

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

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'

임의 모듈

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

JSON 함수

JSON 함수를 사용하려면 json 라이브러리를 가져와야 합니다: import json.

Function Description
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"

위 내용은 Python의 데코레이터, 내장 함수 및 json에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.