Python 自學第六天:定義函式和參數相關設定

函式存在的目的在於減少撰寫重覆的程式碼,當需要多次使用它的功能時,重複呼叫即可。

函式定義

定義一個函式的語法如下:

1
2
3
4
def 函式名稱(參數1, 參數2, ...):
# 程式碼
# ...
return 回傳值

參數是即將傳入函式的資料回傳值則是函式產生的結果。基本狀態為沒有參數有參數沒有回傳值 (None) 有回傳值。可以互相搭配。

沒有參數、沒有回傳值

1
2
def say_hi():
print("Hello Python~")

有參數、沒有回傳值

1
2
def say_hi_to_code_lang(code):
print(f"Hello {code}!")

如下程式碼雖然有 return,但是沒有給予明確的回傳值,會和上方的程式碼有一樣的作用。

1
2
3
def say_hi_to_code_lang(code):
print(f"Hello {code}!")
return

有回傳值

1
2
3
def add(num1, num2):
result = num1 + num2
return result

呼叫函式

函式定義完不會有任何事發生,就像一台計算機沒有人使用是不會產生計算結果的。

使用函式的方式就是呼叫它,也就是使用函式名稱加上一對小括弧,如: 函式名稱() ,再傳入零個、一個或數個資料 (參數)。

1
2
3
4
5
6
7
# 呼叫函式
say_hi()
say_hi_to_code_lang("Java")

# 輸出結果:
# Hello Python~
# Hello Java!

因為 say_hi()say_hi_to_code_lang(code) 兩個函式中,有輸出 print() 指令,因此呼叫函式會輸出 Hello Python~Hello Java!

如果函式有定義回傳值,我們就可以得到函式產生的結果,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 定義函式
def add(num1, num2):
result = num1 + num2
return result

# 呼叫函式
r1 = add(3, 4)
r2 = add(1, -10)
print(r1, r2) # 想要在單行輸出多個資料,可以用「逗號」隔開
print(add(100, 50))

# 輸出結果:
# 7 -9
# 150

如果函式沒有 returnreturn 後方沒有明確的回傳值,則回傳值默認為 None,如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
def say_hi():
print("Hello Python~")

def say_hi_to_code_lang(code):
print(f"Hello {code}!")
return

greet1 = say_hi()
greet2 = say_hi_to_code_lang("C++")
print(greet1)
print(greet2)

# 輸出結果:
# Hello Python~
# Hello C++!
# None
# None

參數

預設參數值

如果不想如上面那麼麻煩,寫兩種 say_hi 的函式,還能這樣定義

1
2
3
4
5
6
7
8
9
def say_hi_to_code_lang(code="Python"):
print(f"Hello {code}!")

say_hi_to_code_lang()
say_hi_to_code_lang("C++")

# 輸出結果:
# Hello Python!
# Hello C++!

code 這個函式中的變數一個預設值 "Python",如果今天呼叫時沒有傳入參數,函式就會直接使用預設值;如果呼叫時傳入參數,函式就會使用傳入的資料

沒有預設值有預設值的參數可以一起使用,但是有預設值的參數要記得擺在沒有預設值參數後方

1
2
3
4
5
6
7
8
9
10
11
# 定義函式
def borrow_book(title, author, num=1, borrower="guest"):
print(f"{num} book, {title} by {author}, is borrowed by {borrower}")

# 呼叫函式
borrow_book("Harry Potter", "JK Rowling")
borrow_book("Robin Hood", "David B. Coe", 2)

# 輸出結果:
# 1 book, Harry Potter by JK Rowling, is borrowed by guest
# 2 book, Robin Hood by David B. Coe, is borrowed by guest

定義函式時,如果有預設值的參數 (default argument) 沒有全部放在無預設值的參數 (non-default argument) 後方,則會報錯:

1
2
3
4
def borrow_book(title, num=1, author, borrower="guest"):
print(f"{num} book, {title} by {author}, is borrowed by {borrower}")

# SyntaxError: non-default argument follows default argument

關鍵字參數

呼叫函式時,傳入參數可以將關鍵字 (參數名稱) 指定值,即可忽略參數順序,如:

1
2
3
4
5
6
7
8
9
# 定義函式
def borrow_book(title, author, num=1, borrower="guest"):
print(f"{num} book, {title} by {author}, is borrowed by {borrower}")

# 呼叫函式
borrow_book(author="JK Rowling", title="Harry Potter", borrower="admin")

# 輸出結果:
# 1 book, Harry Potter by JK Rowling, is borrowed by admin

如果沒有指定名稱,呼叫函式時,參數則依照順序對應,"JK Rowling" 對應到 title"Harry Potter" 對應到 author"admin" 對應到 num

1
2
3
borrow_book("JK Rowling", "Harry Potter", "admin")

# admin book, JK Rowling by Harry Potter, is borrowed by guest

任意個數的參數

如果想要讓使用者可以傳入任意個數的參數,定義函式的語法如下:

1
2
def 函式名稱(*任意個數參數名稱):
# ...程式碼

雖然定義的時候,任意個數參數名稱 只有一個,但是因為前面有加 *,因此在函式中,任意個數參數名稱 會將所有傳入的資料放在一起,轉變成 Tuple 資料型態

呼叫函式時,記得傳入多個資料

1
2
3
4
5
6
7
8
9
10
11
12
13
# 定義函式
def mean(*nums):
sum = 0
for i in nums:
sum = sum + i
mean = sum/len(nums)
return mean

# 呼叫函式
result = mean(1, 2, 4, 7, 12)
print("result is ", result)

# result is 5.2

呼叫函式時,不能傳入 Tuple 資料,會報錯:

1
2
3
4
5
6
7
8
9
10
11
12
def mean(*nums):
sum = 0
for i in nums:
sum = sum + i
mean = sum/len(nums)
return mean

data = (1, 2, 4, 7, 12)
result = mean(data)
print("result is ", result)

# TypeError: unsupported operand type(s) for +: 'int' and 'tuple'

為什麼呢?因為傳入 data 時,不會像我們以為的 nums = data 而是 nums = (data,)。因此,int 也就是整數型態的 sum 不能和一整個 tuple 相加。

看看下面程式的輸出結果會更了解。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 定義函式
def mean(*nums):
sum = 0
print("nums = ", nums)
for i in nums:
print("i is ", i)
# 因此 sum 不能和 i 相加

# 呼叫函式
data = (1, 2, 4, 7, 12)
mean(data)

# 輸出結果:
# nums = ((1, 2, 4, 7, 12),)
# i is (1, 2, 4, 7, 12)

參考資料:
彭彭的課程:Python 函式基礎 - 定義並呼叫函式
彭彭的課程:Python 函式參數詳解 - 參數預設值、名稱對應、任意長度參數