python筆記5:裝飾器、內置函數、json

来源:http://www.cnblogs.com/lhly/archive/2017/06/17/7040336.html
-Advertisement-
Play Games

裝飾器 裝飾器本質上是一個Python函數,它可以讓其他函數在不需要做任何代碼變動的前提下增加額外功能,裝飾器的返回值也是一個函數對象。 先看簡單例子: 現有一個新的需求,希望可以記錄下函數的運行時間,需要在代碼中計算時間的代碼: login()等多個函數也有類型的需求,怎麼做?若在每個函數內都寫一 ...


裝飾器

裝飾器本質上是一個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)

 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 = '88'
    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"

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • extract images from video, than save them to disk from moviepy.editor import VideoFileClip clip1 = VideoFileClip('./project_video.mp4') i = 1 for fram ...
  • 一、預設裝配方式 代碼通過getBean();方式從容器中獲取指定的Bean實例,容器首先會調用Bean類的無參構造器,創建空值的實例對象。 舉例: 首先我在applicationContext.xml配置文件中配置了一個bean: 創建SomeServiceImpl對象,但需要註意的是該類的只具有 ...
  • 前 言 PHP 學習了好久的PHP,今天做一個可以後臺交互的登錄頁和註冊頁,沒做什麼判斷,簡單的瞭解一下。 具體的內容分析如下: ① PHP中的數據傳輸-->>由註冊頁傳輸給註冊頁後臺-->>註冊頁後臺經過轉碼保存實例化的文件 ② 在登錄頁輸入賬戶密碼,點擊登錄時,獲得觸發函數:獲得由後臺傳輸過來的 ...
  • 1.==,is的使用 總結 ·is是比較兩個引用是否指向了同一個對象(引用比較)。 ·==是比較兩個對象是否相等。 2.深拷貝、淺拷貝 1.淺拷貝 淺拷貝是對於一個對象的頂層拷貝 通俗的理解是:拷貝了引用,並沒有拷貝內容 2.深拷貝 深拷貝是對於一個對象所有層次的拷貝(遞歸) 進一步理解拷貝 進一步 ...
  • 題目背景 蕾米莉亞的紅霧異變失敗後,很不甘心。 題目描述 經過上次失敗後,蕾米莉亞決定再次發動紅霧異變,但為了防止被靈夢退治,她決定將紅霧以奇怪的陣勢釋放。 我們將幻想鄉看做是一個n*m的方格地區,一開始沒有任何一個地區被紅霧遮蓋。蕾米莉亞每次站在某一個地區上,向東南西北四個方向各發出一條無限長的紅 ...
  • 一、線性表 原理:零個或多個同類數據元素的有限序列 原理圖: 特點 : 1、有序性 2、有限性 3、同類型元素 4、第一個元素無前驅,最後一個元素無後繼,中間的元素有一個前驅並且有一個後繼 線性表是一種邏輯上的數據結構,在物理上一般有兩種實現 順序實現和鏈表實現 二、基於數組的 線性表順序實現 原理 ...
  • 文件上傳 配置伺服器虛擬地址: 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 文件獲取與存儲 獲取伺服器虛擬目錄上的文件 獲取伺服器虛擬目錄上的文件 ...
  • 文件編碼: ①gbk編碼:中文占用2個位元組,英文占用1個位元組 File類常用API的使用: file類的遍歷目錄 RomdonAccessFile基本操作 五、位元組流 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...