Pythonのデコレータ・組み込み関数・jsonについて詳しく解説

零下一度
リリース: 2017-06-25 10:24:27
オリジナル
1316 人が閲覧しました

デコレーター

デコレーターは本質的に 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( ) などの機能も利用できます。 要件の種類、方法は?各関数に開始時刻と終了時刻を記述して差分を計算すると、コードが冗長になります。次のように、実行時間を具体的に計算する関数を定義してから、実際のビジネス コードを実行できます。

上記のコードロジックは理解できませんが、この場合、毎回 timer() 関数にパラメータとして関数が渡されており、このメソッドは以前のビジネスロジックを実行するときに、元のコードロジック構造を破壊しています( ) ですが、今度は timer() を実行する必要があります。デコレータを使用すると、上記の問題を解決できます。

シンプルデコレーター

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)
ログイン後にコピー

Pythonの関数は変数であり、関数名は関数のメモリアドレスをメモリ上に格納します。呼び出し時には、関数名のメモリアドレスから関数本体を見つけて、関数を実行します。関数名の後に括弧を追加すると、関数を呼び出すことになります。関数名のみを記述する場合は、関数のメモリ アドレスを出力します。

関数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相当于decorun()                  #run调用相当于deco()
ログイン後にコピー
run() 関数の更新されたコードは次のとおりです: 実際、実行コードは直接変更されていませんが、デコレーターが呼び出されるときに実行コードが更新されます。

 timer(func):       deco(*args, **kwargs):   start_time =*args, **kwargs)    end_time =(, end_time - deco               @timer                run():           time.sleep(1()
run()
ログイン後にコピー
Python組み込み関数

def run():
    start_time = time.time()
    time.sleep(1)print('run....')
    end_time = time.time()print('run time', end_time - start_time)
ログイン後にコピー
ログイン後にコピー

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'
ログイン後にコピー

JSON関数

JSON関数を使用するには、jsonライブラリをインポートする必要があります:

import json

関数json.dumpsjson.dumpjson.loadsjson.load
説明
辞書をJSON文字列に変換
辞書に変換されたJSON文字列をファイルに書き込みます
変換json 文字列を辞書に変換します
ファイルから json データを読み取り、辞書に変換します

例は次のとおりです:

a.json コンテンツ形式:

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

{"car":{"price":1100,"color":"red"},"mac":{"price":7999,"color":"black"},"abc":{"price":122,"color":"green"}}
ログイン後にコピー
json.loads()

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

s_json = '{"name":"niuniu","age":20,"status":true}'print(json.loads(s_json))         #将json串转换为字典:{'age': 20, 'status': True, 'name': 'niuniu'}
ログイン後にコピー
書かれた a.json は次のとおりです。

import json
with open('a.json', 'a+') as fp:
    dic = {'name': 'niuniu', 'age': 18}
    fp.seek(0)
    fp.truncate()
    json.dump(dic, fp)    #将字典转换为json串写入文件
ログイン後にコピー
json.dumps()

{"age": 18, "name": "niuniu"}
ログイン後にコピー

以上がPythonのデコレータ・組み込み関数・jsonについて詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!