定義函數:
1、如何定義函數?
#語法 def 函數名(參數1,參數2,參數3,...): '''註釋''' 函數體 return 返回的值 #函數名要能反映其意義
def auth(user:str,password:str)->int: ''' auth function :param user: 用戶名 :param password: 密碼 :return: 認證結果 ''' if user == 'egon' and password == '123': return 1 # print(auth.__annotations__) #{'user': <class 'str'>, 'password': <class 'str'>, 'return': <class 'int'>} user=input('用戶名>>: ').strip() pwd=input('密碼>>: ').strip() res=auth(user,pwd) print(res)
函數的使用原則:先定義後使用
函數即“變量”,“變量”必須先定義後引用。未定義而直接引用函數,就相當於在引用一個不存在的變量名 #測試一 def foo(): print('from foo') bar() foo() #報錯 #測試二 def bar(): print('from bar') def foo(): print('from foo') bar() foo() #正常 #測試三 def foo(): print('from foo') bar() def bar(): print('from bar') foo() #會報錯嗎? #結論:函數的使用,必須遵循原則:先定義,後調用 #我們在使用函數時,一定要明確地區分定義階段和調用階段 #定義階段 def foo(): print('from foo') bar() def bar(): print('from bar') #調用階段 foo()
函數定義階段都幹了什麼?
#只檢測語法,不執行代碼 也就說,語法錯誤在函數定義階段就會檢測出來,而代碼的邏輯錯誤只有在執行時纔會知道
定義函數的形式:
#1、無參:應用場景僅僅只是執行一些操作,比如與用戶交互,打印 #2、有參:需要根據外部傳進來的參數,才能執行相應的邏輯,比如統計長度,求最大值最小值 #3、空函數:設計代碼結構
#定義階段 def tell_tag(tag,n): #有參數 print(tag*n) def tell_msg(): #無參數 print('hello world') #調用階段 tell_tag('*',12) tell_msg() tell_tag('*',12) ''' ************ hello world ************ ''' #結論: #1、定義時無參,意味着調用時也無需傳入參數 #2、定義時有參,意味着調用時則必須傳入參數 無參、有參
def auth(user,password): ''' auth function :param user: 用戶名 :param password: 密碼 :return: 認證結果 ''' pass def get(filename): ''' :param filename: :return: ''' pass def put(filename): ''' :param filename: :return: ''' def ls(dirname): ''' :param dirname: :return: ''' pass #程序的體系結構立見 空函數
調用函數:
1、先找到名字
2、根據名字執行代碼
返回值:return關鍵字
什麼時候該有返回值? 調用函數,經過一系列的操作,最後要拿到一個明確的結果,則必須要有返回值 通常有參函數需要有返回值,輸入參數,經過計算,得到一個最終的結果 什麼時候不需要有返回值? 調用函數,僅僅只是執行一系列的操作,最後不需要得到什麼結果,則無需有返回值 通常無參函數不需要有返回值
調用方式:
1,語句形式:foo()
2,表達式形式:3*len('hello)
3,當做參數給另一個函數
#1、位置參數:按照從左到右的順序定義的參數 位置形參:必選參數 位置實參:按照位置給形參傳值 #2、關鍵字參數:按照key=value的形式定義的實參 無需按照位置爲形參傳值 注意的問題: 1. 關鍵字實參必須在位置實參右面 2. 對同一個形參不能重複傳值 #3、默認參數:形參在定義時就已經爲其賦值 可以傳值也可以不傳值,經常需要變得參數定義成位置形參,變化較小的參數定義成默認參數(形參) 注意的問題: 1. 只在定義時賦值一次 2. 默認參數的定義應該在位置形參右面 3. 默認參數通常應該定義成不可變類型 #4、可變長參數: 可變長指的是實參值的個數不固定 而實參有按位置和按關鍵字兩種形式定義,針對這兩種形式的可變長,形參對應有兩種解決方案來完整地存放它們,分別是*args,**kwargs ===========*args=========== def foo(x,y,*args): print(x,y) print(args) foo(1,2,3,4,5) def foo(x,y,*args): print(x,y) print(args) foo(1,2,*[3,4,5]) def foo(x,y,z): print(x,y,z) foo(*[1,2,3]) ===========**kwargs=========== def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,a=1,b=2,c=3) def foo(x,y,**kwargs): print(x,y) print(kwargs) foo(1,y=2,**{'a':1,'b':2,'c':3}) def foo(x,y,z): print(x,y,z) foo(**{'z':1,'x':2,'y':3}) ===========*args+**kwargs=========== def foo(x,y): print(x,y) def wrapper(*args,**kwargs): print('====>') foo(*args,**kwargs) #5、命名關鍵字參數:*後定義的參數,必須被傳值(有默認值的除外),且必須按照關鍵字實參的形式傳遞 可以保證,傳入的參數中一定包含某些關鍵字 def foo(x,y,*args,a=1,b,**kwargs): print(x,y) print(args) print(a) print(b) print(kwargs) foo(1,2,3,4,5,b=3,c=4,d=5) 結果: 2 (3, 4, 5) 3 {'c': 4, 'd': 5} 此乃重點知識!!!