1. 程式人生 > 其它 >【使用分享】Hive分割槽表那些事

【使用分享】Hive分割槽表那些事

今日總結

  • 閉包函式
  • 閉包函式的應用
  • 裝飾器簡介
  • 裝飾器的使用
  • 裝飾模板
  • 裝飾器語法糖
  • 裝飾器修復技術

閉包函式

# 閉包函式就是由閉函式與包函式組合而成的。閉函式就是被封閉的函式,就是函式內部的函式,只能在函式內部用;包函式指的是某個函式訪問了一個來自外層函式作用域的變數。
eg:def outer():
       x = 999
   	   def inner():
            print(x)
# 'inner'就是一個閉函式,只能在'outer'函式內部用
# 所以閉包函式就是函式內部的函式引用了一個來自外層函式作用域中的變數

閉包函式的應用

# 閉包函式是給函式體傳參的另外一種方式
#函式體傳參的方式1:傳參
eg:def index(username):
        print(username)
   index('jason') >>>>>>>>>>函式體程式碼需要什麼就可以在形參中寫什麼
# 方式2:閉包
eg:def outer():
     username = 'jason'
     def index():
         print(username)  
     return index
 res = outer()

裝飾器簡介

# 裝飾器其實就是函式裡的名稱空間,函式名,閉包函式組合產生的一個產物
# 裝飾器的定義就是在不改變被裝飾物件原有的‘呼叫方式’和‘內部程式碼’的情況下給被裝飾物件新增新的功能。
#裝飾器的原則就是:對擴充套件開放,對修改封閉

 # 時間戳就指1970年1月1號0分0秒距離剛剛程式碼執行間隔的秒數

裝飾器的使用

eg:統一函式的執行時間
  方式1:  import time
        def index():
            time.sleep(3)>>>>>>>>>>>>>讓程式原地等待三秒
            print('from index') >>>>>>>>給index函式增加了一個統計執行時間的功能
        start_time = time.time()>>>>>>>>>>>> 函式執行之前獲取一個時間戳
        index()
        end_time = time.time() >>>>>>>>>>>> 函式執行之後獲取一個時間戳
        print(end_time - start_time)>>>>>>>>>> 兩個時間戳的差值就是函式的執行時間

 方式2:   import time
        def index():
            time.sleep(1)
            print('from index')
        def home():
            time.sleep(3)
            print('from home')
        print(home)
        def outer(func):  # 真正的index被outer區域性名稱空間儲存了
            def get_time():
                start_time = time.time()  # 函式執行之前獲取一個時間戳
                func()  # 呼叫了真正的index函式
                end_time = time.time()  # 函式執行之後獲取一個時間戳
                print(end_time - start_time)  # 兩個時間戳的差值就是函式的執行時間
            return get_time
        # res = outer(index)  # 左側的res就是一個普通的變數名
        # res()
        # a = outer(index)  # 左側的a就是一個普通的變數名
        # a()
        # b = outer(index)  # 左側的b就是一個普通的變數名
        # b()
        # index = outer(index)
        # index()  # 看似呼叫的index其實呼叫的是get_time
        # print(index)  # 全域性名稱空間中的index指向的是get_time函式體程式碼
        home = outer(home)

進階版本裝飾器

# 解決的是引數問題
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        func_name(*args, **kwargs)
        end_time = time.time()
        print(end_time - start_time)
    return get_time

完整版本裝飾器

# 解決的是返回值問題
def outer(func_name):
    def get_time(*args, **kwargs):
        start_time = time.time()
        res = func_name(*args, **kwargs)  # 執行真正的index函式
        end_time = time.time()
        print(end_time - start_time)
        # return '不要急躁' # 如何在此處返回真正index函式的返回值
        return res
    return get_time

裝飾器模板

'''編寫裝飾器其實有一套固定的程式碼 不需要做任何理解'''
def outer(func_name):  # func_name用於接收被裝飾的物件(函式)   
    def inner(*args, **kwargs):       
        print('執行被裝飾函式之前 可以做的額外操作')       
        res = func_name(*args, **kwargs)  # 執行真正的被裝飾函式        
        print('執行被裝飾函式之後 可以做的額外操作')        
        return res  # 返回真正函式的返回值   
    return inner

裝飾器語法糖

# 目的就是為了優化好看,內部原理:1.使用的時候最好緊跟在被裝飾物件的上方。2.語法糖會自動將下面緊挨著的函式名傳給@後面的函式呼叫
def outer(func_name):
    def inner(*args, **kwargs):
        print('執行函式之前的操作')
        res = func_name(*args, **kwargs)
        # 額外操作
        return res
    return inner

@outer  # 等價於 index = outer(index)
def index(*args, **kwargs):
    print('from index')
# index = outer(index)  # 總感覺這一行程式碼有點low!!!

@outer  # 等價於 home = outer(home)
def home(*args,**kwargs):
    print('from home')


print(index)
print(home)

裝飾器修復技術

from functools import wraps
def outer(func_name):
    @wraps(func_name)
    def inner(*args, **kwargs):
        print('執行被裝飾物件之前可以做的操作')
        res = func_name(*args, **kwargs)
        return res
    return inner
@outer
def index():
    print('from index')
@outer
def home():
    '''這是home函式的註釋'''
    print('from home')
# help(home)  # help可以檢視指定函式的註釋資訊
# help(len)
# index()  # 目前的以假亂真 有瑕疵
# print(index)
# help(home)
# help(index)
# print(home)
# print(index)
home()
index()