iT邦幫忙

2024 iThome 鐵人賽

DAY 13
0
Python

初學者的 30 天 Python 復健課程系列 第 13

復健第十三天:萬事皆可放的函式 Functions

  • 分享至 

  • xImage
  •  

究竟是函式或是函數,一直是我在學習 functions 時,內心未能解決的一大疑惑,有的時候會聽到別人說函數,有的時候會聽到別人說函式,到底是函式還是函數,搞得我好亂啊!

還是兩個可以混用呢?

根據 iThome 這篇函數與函式的差別?,有部分的人認為函式跟函數在程式語言與數學上有些不同的意義,但多數人認為這只是一個翻譯與用語的落差,所以「函式」與「函數」在此時此刻看來,指的是同一個東西。

函式 (Functions)

什麼是函式?

在開始建立函式之前,讓我們了解什麼是函式以及為什麼我們需要它。函式是一個可重複使用的程式碼區塊,用來執行特定任務。在 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 的學生,搶先看到他們的成果,只能說他們進步的速度,讓我倍感壓力呀。


上一篇
復健第十二天:轉呀轉呀的迴圈 Loops
下一篇
復健第十四天:自己刻出樂高積木 Modules 模組
系列文
初學者的 30 天 Python 復健課程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言