1. 程式人生 > >(四)Python 函式

(四)Python 函式

func.py
abstest.py

# 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)這種資料結構實現的,
# 每當進入一個函式呼叫,棧就會加一層棧幀,每當函式返回,棧就會減一層棧幀。由於棧的大小不是無限的,
# 所以,遞迴呼叫的次數過多,會導致棧溢位。

# 能用迴圈的儘量用迴圈,遞迴深度不大的可以用遞迴