究竟是函式或是函數,一直是我在學習 functions 時,內心未能解決的一大疑惑,有的時候會聽到別人說函數,有的時候會聽到別人說函式,到底是函式還是函數,搞得我好亂啊!
還是兩個可以混用呢?
根據 iThome 這篇函數與函式的差別?,有部分的人認為函式跟函數在程式語言與數學上有些不同的意義,但多數人認為這只是一個翻譯與用語的落差,所以「函式」與「函數」在此時此刻看來,指的是同一個東西。
在開始建立函式之前,讓我們了解什麼是函式以及為什麼我們需要它。函式是一個可重複使用的程式碼區塊,用來執行特定任務。在 Python 中,我們可以使用 def
關鍵字來**定義(宣告)函式。函式的程式碼區塊只有在函式被呼叫(call)或執行(invoke)**時才會執行。
當我們創建函式時,稱為宣告函式。當我們開始使用函式時,稱為呼叫或執行函式。函式可以有參數或沒有參數。
# 宣告函式
def function():
pass
# 呼叫函式
function()
函式可以在沒有參數的情況下宣告。
def generate_full_name():
first_name = 'Chien'
last_name = 'Chuan'
space = ' '
full_name = first_name + space + last_name
print(full_name)
generate_full_name() # 呼叫函式
def add_two_numbers():
num_one = 2
num_two = 3
total = num_one + num_two
print(total)
add_two_numbers() # 呼叫函式
函式可以回傳值。如果函式中沒有 return
,則函式的回傳值為 None
。讓我們修改上面的例子,讓函式產生回傳值,並將呼叫函式後的回傳結果印出來。
def generate_full_name():
first_name = 'Asabeneh'
last_name = 'Yetayeh'
space = ' '
full_name = first_name + space + last_name
return full_name
print(generate_full_name())
def add_two_numbers():
num_one = 2
num_two = 3
total = num_one + num_two
return total
print(add_two_numbers())
在函式中,我們可以傳入不同的資料類型(如數字、字串、布林值、列表、元組、字典或集合)作為參數。
單一參數:如果函式需要一個參數,我們需要使用用一個引數來呼叫它。
# 宣告函式
def function(parameter):
pass
# 呼叫函式
function(argument)
def greetings(name):
message = name + ', welcome to Python!'
return message
print(greetings('Frank')) # Frank, welcome to Python!
def add_ten(num):
ten = 10
return num + ten
print(add_ten(90))
def square_number(x):
return x * x
print(square_number(2))
def area_of_circle(r):
PI = 3.14
area = PI * r ** 2
return area
print(area_of_circle(10))
def sum_of_numbers(n):
total = 0
for i in range(n+1):
total += i
print(total)
print(sum_of_numbers(10)) # 55
print(sum_of_numbers(100)) # 5050
多個參數:函式也可以接受多個參數。如果函式需要多個參數,我們需要傳入相應的引數。
# 宣告函式
def function(parameter1, parameter2):
pass
# 呼叫函式
function(argument1, argument2)
def generate_full_name(first_name, last_name):
space = ' '
full_name = first_name + space + last_name
return full_name
print('全名: ', generate_full_name('Chien', 'Chuan'))
def sum_two_numbers(num_one, num_two):
return num_one + num_two
print('兩數相加: ', sum_two_numbers(1, 9))
def calculate_age(current_year, birth_year):
age = current_year - birth_year
return age
print('年齡: ', calculate_age(2021, 1819))
def weight_of_object(mass, gravity):
weight = str(mass * gravity) + ' N' # 將值轉成字串
return weight
print('物體重量(牛頓): ', weight_of_object(100, 9.81))
在前面的例子中,我們依照參數的順序傳遞了引數,這被稱為位置引數(Positional Arguments)。如果想不按照參數的順序來傳遞引數,可以使用關鍵字參數(Keyword Arguments)。
# 宣告函式
def function(para1, para2):
pass
# 呼叫函式
function(argument1='John', argument2='Doe') # 引數順序無關緊要
def get_fullname(firstname, lastname):
space = ' '
full_name = firstname + space + lastname
return full_name
print(get_fullname(firstname='Chien', lastname='Chuan'))
def add_two_numbers(num1, num2):
total = num1 + num2
return total
print(add_two_numbers(num2=3, num1=2)) # 引數順序無關緊要
如果函式中沒有 return
,則默認回傳 None
。為了讓函式回傳值,我們使用 return
關鍵字並接上要回傳的變數。我們可以從函式中回傳任何資料類型。注意:函式一次只會執行一個 return
,當 return
被執行時,函式的執行也會結束。
回傳字串
def print_name(firstname):
return firstname
print_name('Chien') # Chien
def print_full_name(firstname, lastname):
space = ' '
full_name = firstname + space + lastname
return full_name
print_full_name(firstname='Chien', lastname='Chuan')
回傳數字
def add_two_numbers(num1, num2):
total = num1 + num2
return total
print(add_two_numbers(2, 3))
def calculate_age(current_year, birth_year):
age = current_year - birth_year
return age
print('年齡: ', calculate_age(2019, 1819))
回傳布林值
def is_even(n):
if n % 2 == 0:
print('偶數')
return True # 當 return 被執行時,函式會立即結束
return False
print(is_even(10)) # True
print(is_even(7)) # False
回傳列表
def find_even_numbers(n):
evens = []
for i in range(n + 1):
if i % 2 == 0:
evens.append(i)
return evens
print(find_even_numbers(10))
我們也可以給函式中的參數設置預設值。當呼叫函式時,如果未傳遞引數,函式將使用預設值。
# 宣告函式並設定預設值
def function(para=value):
pass
# 呼叫函式
function() # 若未傳遞引數,將使用預設參數
function(argument)
def greetings(name='Peter'):
message = name + ', 歡迎來到 Python for Everyone!'
return message
print(greetings())
print(greetings('Asabeneh'))
def generate_full_name(first_name='Chien', last_name='Chuan'):
space = ' '
full_name = first_name +
space + last_name
return full_name
print(generate_full_name())
print(generate_full_name('David', 'Smith'))
def calculate_age(birth_year, current_year=2021):
age = current_year - birth_year
return age
print('年齡: ', calculate_age(1821))
def weight_of_object(mass, gravity=9.81):
weight = str(mass * gravity) + ' N'
return weight
print('物體重量(牛頓): ', weight_of_object(100)) # 使用地球上的重力
print('物體重量(牛頓): ', weight_of_object(100, 1.62)) # 使用月球的重力
如果我們不知道要傳入多少個引數,可以在參數名前加上 *
,這樣就可以接受任意數量的引數。
# 宣告函式
def function(*args):
pass
# 呼叫函式
function(arg1, arg2, arg3, ...)
def sum_all_nums(*nums):
total = 0
for num in nums:
total += num # 相當於 total = total + num
return total
print(sum_all_nums(2, 3, 5)) # 10
在 Python 中,函式是一等公民(first-class objects),也就是說函式可以作為引數傳遞給其他函式、賦值給變數,甚至從其他函式中回傳。這允許我們在更高階的函式中使用函式,讓程式碼更加靈活。
def greeting(name):
return f"Hello, {name}!"
def process_name(func, name):
result = func(name)
return result
# 將 greeting 函式作為引數傳遞給 process_name 函式
output = process_name(greeting, "Alice")
print(output) # Output: Hello, Alice!
又是差點來不及寫完鐵人賽的一天,明天要去參加五倍學院的 17th ASTRO Camp Demo Day,作為上一屆 16th 的學生,搶先看到他們的成果,只能說他們進步的速度,讓我倍感壓力呀。