1. 程式人生 > >第四周 day4 python學習筆記

第四周 day4 python學習筆記

spa 頁面 logs 函數 home () class ack solid

關於裝飾器的更多信息可以參考http://egon09.blog.51cto.com/9161406/1836763

1.裝飾器Decorator

技術分享裝飾器:本質上是函數,(裝飾其他函數),就是為其他函數添加附加功能
原則:不能修改被裝飾函數的源代碼;不能修改被裝飾函數的調用方式
#實現裝飾器的知識儲備:
1.函數即變量
2.高階函數,有兩種方式:
(1)把一個函數名當做實參傳遞給另一個函數(在不修改被裝飾函數源代碼的情況下為其添加功能)
(2)返回值中包含函數名(不修改函數調用的方式)
3.嵌套函數
高階函數+嵌套函數==》裝飾器
技術分享import time
#計算一個函數的運行時間的裝飾器
def timer(func): def wrapper(*kargs,**kwargs): start_time=time.time() func() end_time=time.time() print("the func runtime is %s"%(end_time-start_time)) return wrapper @timer def test1(): time.sleep(3) print("in the test1....") test1()
技術分享#高階函數
def bar():
    
print("in the bar...") def test(func): print(func)#打印出該函數變量的地址 func() test(bar)

技術分享# 把一個函數名當做實參傳遞給另一個函數
import time
def bar():
    time.sleep(2)
    print("in the bar...")

def test(func):
    start_time=time.time()
    func()  #run bar()
    end_time=time.time()
    print(" the func runtime is %s
"%(end_time-start_time)) test(bar)
技術分享# 返回值中包含函數名
import time
def bar():
    time.sleep(2)
    print("in the bar...")

def test2(func):
   print(func)
   return func

bar2=test2(bar)
bar2()
技術分享#嵌套函數
#局部作用域和全局作用域的訪問順序
x=0
def grandpa():
    x=1
    print("grandpa:",x)
    def dad():
        x=2
        print("dad:",x)
        def son():
            x=3
            print("son:",x)
        son()
    dad()
grandpa()

#匿名函數:沒有定義函數名字的函數
calc=lambda x,y:x+y
print(calc(13,15))
技術分享import time
def timer(func):
    def deco(*kargs,**kwargs):
        start_time=time.time()
        func(*kargs,**kwargs)
        end_time=time.time()
        print(" the func runtime is %s"%(end_time-start_time))
    return deco

@timer  # test1=timer(test1)
def test1():
    time.sleep(2)
    print("in the test1.....")

# test1=timer(test1)
test1()

@timer
def test2(name,age):
    time.sleep(3)
    print("in the test2:",name,age)

test2("Jean_V",20)

技術分享#裝飾器進階版
#對各個頁面添加用戶認證
username,password="admin","123"
def auth(auth_type):
    print("auth_type:",auth_type)
    def out_wrapper(func):
        def wrapper(*args,**kwargs):
            if auth_type=="local":
                uname=input("請輸入用戶名:").strip()
                passwd=input("請輸入密碼:").strip()
                if uname==username and passwd==password:
                    print("\033[32;1m User has passed authentication\033[0m")
                    res=func(*args,**kwargs)
                    print("************after authentication")
                    print(res)
                else:
                    exit("\033[31;1m Invalid username or password\033[0m")
            elif auth_type=="LADP":
                print("我不會LADP認證,咋辦?。。。")
        return wrapper
    return out_wrapper

def index():
    print("index page......")

@auth(auth_type="local")#home 頁采用本地驗證
def home():
    print("home page.....")
    return "from home page....."

@auth(auth_type="LADP")#bbs 頁采用LADP驗證
def bbs():
    print("bbs page....")

index()
print(home())
home()
bbs()










第四周 day4 python學習筆記