函數初探
python在要寫出函數很簡單,通過關鍵字def即可寫出,簡單示例如下
def add(a, b):return a+b
以上即可以定義出一個簡單的函數:接收兩個變量a和b,返回a和b相加的結果,當然這么說也不全對,原因就是盡快python是強類型的語言,但同時也是動態類型的,示例中的函數對于入參沒有限制類型,若a和b都是數字自然返回和;若是str,則是拼接了
if __name__ == "__main__":add(1, 2) #3add('Hello', 'Python') #HelloPython
確定函數入參類型
要想在實際運行前就將函數的入參和返回類型確定下來,可以采用如下方法
def add(a:int, b:int) -> int:return a+b
但是,以上方法親測對應 add('Hello','Python')并無效果;這種情況下,就進行類型檢查吧
def add(a:int, b:int) -> int:if not isinstance(a, int) or not isinstance(b, int):raise ValueError("參數必須為整數")return a+b
裝飾器語法糖
日常開發中,做API開發的小伙伴應該都碰到過在做接口對接、聯調以及上線后故障排查時查找日志的情況,若是每個方法都進行日志打印(當然這種方法也不是不行)就過于重復了,python在很早的版本就引入了裝飾器(這里要和設計模式中的裝飾器模式區分下),具體實現如下
def logging(func):def wrapper(*args, **kwargs):print(f"調用函數{func.__name__},參數為:{args},{kwargs}")result = func(*args, **kwargs)print(f"函數{func.__name__}返回結果為:{result}")return resultreturn wrapper
這樣,在調用函數進行調試時,只需要加上@logging這個語法糖就行了
@logging
def add(a:int, b:int) -> int:if not isinstance(a, int) or not isinstance(b, int):raise ValueError("參數必須為整數")return a+b
魔法函數之__call__
class MyCall():def __init__(self, callable_obj):self.callable_obj = callable_objdef __call__(self, *args, **kwargs):print(f"調用函數{self.callable_obj.__name__},參數為:{args},{kwargs}")result = self.callable_obj(*args, **kwargs)print(f"函數{self.callable_obj.__name__}返回結果為:{result}")return resultf __name__ == "__main__":my_call = MyCall(add)my_call(4, 5)
類MyCall定義的魔法函數__call__,對于python解釋器而言,MyCall的對象就是一個可調用的對象(具有和def定義的函數同等可執行的效果了)