(四)Python 函式
阿新 • • 發佈:2018-11-25
# 1.內建函式 Built-in Function # Python內建了很多有用的函式,我們可以直接呼叫。 # 要呼叫一個函式,需要知道函式的名稱和引數,比如求絕對值的函式abs,只有一個引數。可以直接從Python的官方網站檢視文件: # http://docs.python.org/3/library/functions.html#abs # 也可以在互動式命令列通過help(abs)檢視abs函式的幫助資訊。 print(abs(100)) # 100 print(abs(-20)) # 20 print(abs(12.34)) # 12.34 print(max(2, 3, 1, -5)) # 3 print(int('123')) # 123 print(int(12.34)) # 12 print(float('12.34')) # 12.34 print(str(1.23)) # '1.23' print(str(100)) # '100' print(bool(1)) # True print(bool('')) # False # 2. 定義函式 def my_abs(x): if x >= 0: return x else: return -x # 如果你已經把my_abs()的函式定義儲存為abstest.py檔案了,那麼,可以在該檔案的當前目錄下啟動Python直譯器, # 用from abstest import my_abs來匯入my_abs()函式,注意abstest是檔名(不含.py副檔名) from abstest import my_abs print(my_abs(-9)) # 3. 空函式 def nop(): pass # pass語句什麼都不做,那有什麼用?實際上pass可以用來作為佔位符,比如現在還沒想好怎麼寫函式的程式碼, # 就可以先放一個pass,讓程式碼能執行起來。 # pass還可以用在其他語句裡,比如: num = 20 if num > 18: pass else: print('num <= 18') # 4. 返回多個值 import math def move(x, y, step, angle=0): nx = x + step * math.cos(angle) ny = y - step * math.sin(angle) return nx, ny print(move(1, 2, 1, 60)) # (0.04758701958484368, 2.3048106211022166) 返回多值其實就是返回一個tuple x, y = move(1, 2, 1, 60) print(x, y) # 0.04758701958484368, 2.3048106211022166, tuple賦值給變數時會自動展開 # 5. 預設引數 def power(x, n=2): s = 1 while n > 0: n = n - 1 s = s * x return s print(power(3)) # 9 def func(x, a=2, b=3, c=4): print(x, a, b, c) # 指定預設引數 func(1, b=1) # 1 2 1 4 # 6. 可變引數, 變長引數, 列印可以看到引數列表也是一個tuple def func(*params): print(len(params)) # 4 print(params) # (1, 2, 3, '4') func(1, 2, 3, '4') # 7. 關鍵字引數 def func(a, b, c, **params): print(params) func(1, 2, 3, i='a', j=10) # {'i': 'a', 'j': 10}, 傳入自定義引數時自動組裝成dict d={'n':'a', 'm':11} func(1, 2, 3, **d) # {'n': 'a', 'm': 11}, 也可以傳入定義好的dict,記住前面加** # 練習,組合各種型別引數 def func(a, b, c=10, *args, **kw): print(a, b, c, args, kw) func(1, 2, 3, 4, 5, 6, aa=7, bb=8) # 1 2 3 (4, 5, 6) {'aa': 7, 'bb': 8} # 8. 遞迴函式 # 在函式內部,可以呼叫其他函式。如果一個函式在內部呼叫自身本身,這個函式就是遞迴函式。 # 求和[1-5] # a. 迴圈寫法 def func(): sum = 0 for num in range(1,6): sum = sum + num return sum print(func()) #15 # b. 遞迴寫法 def func(num): if num==0: return num return num + func(num-1) print(func(1000)) # 15 # func(5) # 5 + func(4) # 5 + (4 + func(3)) # 5 + (4 + (3 + func(2))) # 5 + (4 + (3 + (2 + func(1)))) # 5 + (4 + (3 + (2 + 1))) # 注意:func(1000) 會有報錯 RuntimeError: maximum recursion depth exceeded in comparison # 使用遞迴函式需要注意防止棧溢位。在計算機中,函式呼叫是通過棧(stack)這種資料結構實現的, # 每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的, # 所以,遞迴呼叫的次數過多,會導致棧溢位。 # 能用迴圈的儘量用迴圈,遞迴深度不大的可以用遞迴