Python3.5——裝飾器及應用詳解(上)
1、裝飾器:
(1)本質:裝飾器的本質是函式,其基本語法都是用關鍵字def去定義的。
(2)功能:裝飾其他函式,即:為其他函式新增附加功能。
(3)原則:不能修改被裝飾的函式的原始碼,不能修改被裝飾的函式的呼叫方式。即:裝飾器對待被修飾的函式是完全透明的。
(4)簡單應用:統計函式執行時間的裝飾器
import time #統計函式執行時間的磚裝飾器 def timmer(func): def warpper(*args,**kwargs): strat_time = time.time() func() stop_time = time.time() print("the func run time is %s" %(stop_time-strat_time)) return warpper @timmer def test1(): time.sleep(3) print("in the test1") test1() #執行結果: #in the test1 #the func run time is 3.000171661376953
(5)實現裝飾器知識儲備:
a、函式即“變數”
b、高階函式
c、函式巢狀
d、高階函式+巢狀函式==》裝飾器
2、裝飾器知識儲備——函式即“變數”
定義一個函式,相當於把函式體賦值給這個函式名。
Python直譯器如何回收變數:採用引用計數。當引用有沒有了時(門牌號不存在),變數就被回收了。
函式的定義也有記憶體回收機制,與變量回收機制一樣。匿名函式沒有函式名,就會被回收。
變數的使用:先定義再呼叫,只要在呼叫之前已經存在(定義)即可;函式即“變數”,函式的使用是一樣的。
函式呼叫順序:其他的高階語言類似,Python 不允許在函式未宣告之前,對其進行引用或者呼叫
下面的兩段程式碼執行效果一樣:
def bar():
print("in the bar")
def foo():
print("in the foo")
bar()
foo()
#python為解釋執行,函式foo在呼叫前已經聲明瞭bar和foo,所以bar和foo無順序之分
def foo():
print("in the foo")
bar()
def bar():
print("in the bar")
foo()
#執行結果:
#in the foo
#in the bar
#in the foo
#in the bar
注意:python為解釋執行,函式foo在呼叫前已經聲明瞭bar和foo,所以bar和foo無順序之分
原理圖為:
3、裝飾器知識儲備——高階函式
滿足下列其中一種即可稱之為高階函式:
a、把一個函式名當做實參傳遞給另一個函式(在不修改被裝飾函式的情況下為其新增附加功能)
b、返回值中包含函式名(不修改函式的呼叫方式)
(1)高階函式示例:
def bar():
print("in the bar")
def test1(func):
print(func) #列印門牌號,即記憶體地址
func()
test1(bar) #門牌號func=bar
#執行結果:
#<function bar at 0x00BCDFA8>
#in the bar
(2)高階函式的妙處——把一個函式名當做實參傳遞給另一個函式(在不修改被裝飾函式的情況下為其新增附加功能)
import time
def bar():
time.sleep(3)
print("in the bar")
#test2在不修改被修飾函式bar的程式碼時添加了附加的及時功能
def test2(func):
start_time = time.time()
func() #run bar
stop_time = time.time()
print("the func run time is %s " %(stop_time-start_time))
#呼叫方式發生改變,不能像原來的方法去呼叫被修飾的函式(所以不能實現裝飾器的功能)
test2(bar)
#bar()
#執行結果:
#in the bar
#the func run time is 3.000171661376953
(3)高階函式的妙處——返回值中包含函式名(不修改函式的呼叫方式)import time
def bar():
time.sleep(3)
print("in the bar")
def test3(func):
print(func)
return func
bar = test3(bar)
bar() #run bar
#執行結果:
#<function bar at 0x00BADFA8>
#in the bar
4、裝飾器知識儲備——巢狀函式
#函式巢狀
def foo():
print("in the foo")
def bar(): #bar函式具有區域性變數的特性,不能在外部呼叫,只能在內部呼叫
print("in the bar")
bar()
foo()
#執行結果:
#in the foo
#in the bar
相關推薦
Python3.5——裝飾器及應用詳解(上)
1、裝飾器: (1)本質:裝飾器的本質是函式,其基本語法都是用關鍵字def去定義的。 (2)功能:裝飾其他函式,即:為其他函式新增附加功能。 (3)原則:不能修改被裝飾的函式的原始碼,不能修改被裝飾的函式的呼叫方式。即:裝飾器對待被修飾的函式是完全透明的。 (4)簡單應用:
Python3.5——裝飾器及應用詳解(下)
1、裝飾器應用——模擬網站登入頁面,訪問需要認證登入頁面 #!/usr/bin/env python # -*- coding:utf-8 -*- # Author:ZhengzhengLiu #模
TCP/IP協議族——IP工作原理及例項詳解(上)
IP協議詳解 本文主要介紹了IP服務特點,頭部結構,IP分片知識,並用tcpdump抓取資料包,來觀察IP資料報傳送過程中IP的格式,以及分片的過程。 IP頭部資訊:IP頭部資訊出現在每個IP資料報中,用於指定IP通訊的源端IP地址、目的端IP地址
Java程式設計師從笨鳥到菜鳥之(九十三)深入java虛擬機器(二)——類載入器詳解(上)
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!  
Intellij IDEA 安裝lombok及使用詳解(轉載)
最近專案中用到了 IDEA 的 Lombok 外掛,這裡做一個記錄。 Lombok 官方說明文件:http://plugins.jetbrains.com/plugin/6317-lombok-plugin 轉載原文地址:
FTS資料庫優化(Android)原理與應用詳解(1)
在Android的官方開發文件上,有建議在使用文字類的資料庫全文搜尋(full-text search)時,使用FTS優化查詢速度。有關FTS的介紹文章不多,本文調研整理一下有關知識,供在Android上使用FTS之前參考。 1.什麼是FTS? FTS,即full te
python3爬蟲——正則表示式re詳解(1)
(一)什麼是正則表示式 還早呢過這表示式是對字串操作的一種邏輯公式,就是用實現定義好的一些特定的字元,及這些特定的字元的組合,組成一個“規則字串”,這個“規則字串”用來表達對字串的一種過濾邏輯 ps:正則表示式非python獨有,使用re模組即可實現 (二
Android之內容提供器Content Provider詳解(二)
上一篇 Android之內容提供器Content Provider詳解(一)講解了Content Provider之訪問其他程式中的資料,本篇繼續講解創如何建自己的內容提供器 本博文是《第一行程式碼 Android》的讀書筆記/摘錄。 三、建立自己的內容提供
JS跨域(ajax跨域、iframe跨域)解決方法及原理詳解(jsonp)
這裡說的js跨域是指通過js在不同的域之間進行資料傳輸或通訊,比如用ajax向一個不同的域請求資料,或者通過js獲取頁面中不同域的框架中(iframe)的資料。只要協議、域名、埠有任何一個不同,都被當作是不同的域。 下表給出了相對http://store.company.com/dir/page.htm
tcp/iP協議族——IP工作原理及例項詳解(下)
IP協議詳解 上一篇文章文章主要介紹了IP服務的特點,IPv4頭部結構IP分片,並用tcpdump抓取資料包,來觀察IP資料報傳送過程中IP的格式,以及分片的過程。本文主要介紹IP路由,IP轉發,重定向和IPv6頭部結構。 IP路由 IP協議的一個核心任務是資料
(八)Java日期工具類DateUtils日期轉Calendar及TimeZone 詳解(三)
public static Calendar toCalendar(Date date) 說明:將一個日期Date型別轉換為Calendar型別; 引數:date-轉換為Calendar的日期; 返回值:建立的Calendar物件; 丟擲異常:NullPoi
Tomcat安裝及配置詳解(一)
導讀 Tomcat 伺服器是一個免費的開放原始碼的Web 應用伺服器,Tomcat是Apache
Tomcat詳解(上)
tomcat Tomcat是Apache軟件基金會(Apache Software Foundation)的Jakarta項目中的一個核心項目,由Apache、Sun和其他一些公司及個人共同開發而成。java程序寫的網站用tomcat+jdk來運行。tomcat是一個中間件,真正起作用的,解析java腳
heartbeat高可用原理詳解(上)
heartbeat linux 1.heartbeat的作用 通過heartbeat,可以將資源(IP及程序服務等資源)從一臺已經故障的計算機快速轉移到另一臺正常運轉的機器上繼續提供服務,一般稱之為高可用服務。在實際生產中mkeepalived有很多相同之處。在生產實際的業務應用也是有區別的
大型網站架構系列:負載均衡詳解(上)
//轉載自:http://blog.jobbole.com/97957/ 面對大量使用者訪問、高併發請求,海量資料,可以使用高效能的伺服器、大型資料庫,儲存裝置,高效能Web伺服器,採用高效率的程式語言比如(Go,Scala)等,當單機容量達到極限時,我們需要考慮業務
jvm垃圾收集機制詳解(上)
在我們學習java之前,經常聽到的一個關於java的優點就是,相對於像C語言這種語言,省去了程式設計師手動回收垃圾的步驟,那麼,java虛擬機器到底是怎麼實現自動垃圾回收機制的呢? 一、如何判斷物件需要被回收 什麼時候需要回收物件?經常寫別的語言的人可能會說,當我們對一個東西使用完成
Java 的 IO 四大基類詳解(上)
1、概述 Java 的IO通過java.io 包下的類和介面來支援,java.io包下主要包括輸入、輸出兩種流。每種輸入輸出流又可分為位元組流和字元流兩大類。 位元組流以位元組為單位處理輸入、輸出操作; 字元流以字元來處理輸入
Yii2.0 使用者登入詳解(上)
一、準備 在開始編寫程式碼之前,我們需要思考一下:使用者登陸模組,實現的是什麼功能?很明顯,是登陸功能,那麼,登陸需要使用者名稱和密碼,我們在資料庫的一張表中就應該準備好使用者名稱和密碼的欄位,再思考一下,如果要實現自動登陸的功能,那麼還需要什麼?Cookie,是專門用
NIO元件Selector工作機制詳解(上)
在使用Java進行相關網路程式的的設計時,出身C/C++的人,首先想到的框架就是多路複用,想到多路複用,Unix/Linux下馬上就能讓從想到select, poll, epoll系統呼叫。於是,在看到Java的NIO中的Selector類時必然會倍感親切。稍加查閱一下SDK手冊以及相關例程,不一會兒,一個
51微控制器中斷詳解(上)
一.中斷的概念 中斷髮生 CPU在處理某一事件A時,發生了另一事件B請求CPU迅速去處理 中斷響應和中斷服務 CPU暫時中斷當前的工作,轉去處理事件B 中斷返回 待CPU將事件B處理完畢後,再