CH 10 函式(function)


認識函式


在建立複雜的程式時,通常我們會把功能拆解成一段段小程式,以利於抽象化、重複使用和方便測試程式,將程式依據功用拆解成不同函式則是讓你的程式邁向模組化。
常見的函式可以分為三種:
1.內建函式:在 Python 程式語言中內建的函式。例如:len() 可以回傳物件內容長度。int() 可以轉換成整數型別、print() 可以列印出訊息、abs() 可以取得絕對值等。若是想要產生隨機值,可以引入 import random。
2.第三方模組函式:需要透過套件管理工具(例如:pip)安裝後,才能引入使用。
3.使用者自定義函式:使用者自定義的函式。

使用函式的步驟:
1.定義函式(包含函式傳入參數、回傳值、函式執行內容、docstring 文字字串說明)
2.使用函式(呼叫函式)

練習:使用內建函式


import random
#模組提供了生成亂數的相關函數

stock_list = ['2330', '2002', '2317']
# random.randint 隨機產生 索引從0開始到包含2的元素 
stock_number = stock_list[random.randint(0, 2)]
print(stock_number)

建立函式


建立函式前須要先思考幾個問題:
1.函式的功用
2.函式需要輸入哪些參數
3.函式需要回傳哪些資料

在Python中鐘,使用def來定義函式:

def 函式名稱(參數1, 參數2, 參數3, ...):
    """
    docstring 函式使用方式介紹
    """
    程式執行區塊
    return 回傳值

以未使用函式的例子舉例:

#定義一個可以傳入兩個參數,回傳兩者相乘的函式
result_1=1*3
result_2=100*23

print(result_1)
print(result_2)

使用函式:

# 定義函式,裡面使用 """ 撰寫的註解內容為 docstring 就是介紹函式如何使用的文件
def multiply(number1, number2):
    """
    :param number1: this is a first param
    :param number2: this is a second param
    :returns: this is a description of what is returned
    """
  #函式主體
    return number1 * number2

# 呼叫使用函式:執行函式以完成特定任務或計算
result_1 = multiply(1, 3)
result_2 = multiply(100, 23)


print(result_1)
print(result_2)

練習:建立你的第一個函式


撰寫一個攝氏轉華氏的函式(運算公式為:F = 9/5 * C + 32),讓使用者可以傳入攝氏參數並回傳轉換華氏的結果。

#transfer為函式名稱。只有一個輸入參數,因為只需要攝氏溫度。
def transfer(Celsius_degree):
  """
  :Celsius_degree: first param.
  :return:converts Celsius degree which user input to Fahrenheit degree.
  """
  #函式主體
  return Celsius_degree * 9/5 + 32

#讓使用者輸入
user_input = float(input("Enter Celsius degree: "))

#呼叫函式
result = transfer(user_input)

#f-string,可以在字串中包含表達式。使用大括號 {} 將表達式放入字串中
print(f"{user_input} Celsius is {result} Fahrenheit.")

文字字串說明(docstring)


目的為撰寫程式時通常不會只有一個程式設計師,考量到與其他工程師合作。在 Python 函式中文字字串說明(docstring)是用來說明 function 如何使用的文件,通常使用"""將內容包含在裡面。

文字字串說明(docstring)通常會包含使用方式和功能、參數名稱和說明、參數資料型別、回傳值和說明及其資料型別等。

def multiply(number1, number2):
    """
This function will return the two numbers multiply value
    :param number1 (int): this is the first param
    :param number2 (int): this is the second param
    :returns (int): this is the multiply return value
    """
    return number1 * number2

也可以使用 help()來查詢內建函式的文字說明,使用方式如下:

# help(查詢的內建函式),這邊查詢 len
help(len)

函式傳入參數


函式在定義時會定義好要傳入哪些形式參數(paramter),而實際傳入的值則稱為實際參數(argument)值。

# number1, number2 為形式參數(paramter)
def multiply(number1, number2):
    return number1 * number2

# 1, 3 為實質參數(argument)
result_1 = multiply(1, 3)

若參數為可變物件(list,dict等),會因為修改到原來物件內容而影響到原本傳入的參數物件。

def get_the_first_element(user_list):
  user_list[0] = 'steven'
  return user_list[0]

# user_list 為實質參數(argument)
user_list = ['jack', 'tom', 'toby', 'marry', 'amy']
result_1 = get_the_first_element(user_list)

# steven
# ['steven', 'tom', 'toby', 'marry', 'amy'] 可以看到 user_list 也被更改影響到
print(result_1)
print(user_list)

避免更改到原有物件內容:

def get_the_first_element(user_list):
    # 亦可使用 user_list = user_list[:] 將值進行複製
    user_list = user_list.copy()
    user_list[0] = 'steven'
    return user_list[0]

# user_list 為實質參數(argument)
user_list = ['jack', 'tom', 'toby', 'marry', 'amy']
result_1 = get_the_first_element(user_list)

# steven
# ['jack', 'tom', 'toby', 'marry', 'amy']
print(result_1)
print(user_list)

函式回傳值


Python 函式回傳值上可以使用單一值:

#定義函式與參數
def add_numbers(a, b):
#函式主體
    return a+b
#呼叫函式,希望此函式達成什麼目的
result = add_numbers(2, 3)
print(result)

使用 tuple 容器物件讓函式不只回傳一個值:
(當你的值都不會改變,而且你也不希望值被更動的時候,適合使用 tuple)

#定義函式與參數
def get_the_first_and_last_elements(user_list):
  #複製userlist避免更改到原有物件內容:
    copied_list = user_list.copy()
  #將第一個元素更動為steven
    copied_list[0] = 'steven'
  #函式主體 首個元素與最末元素
    return (copied_list[0], copied_list[-1])


user_list = ['jack', 'tom', 'toby', 'marry', 'amy']

#呼叫函式
(first_element, last_element) = get_the_first_and_last_elements(user_list)


print(first_element, last_element)
print('-------')
#tuple為不可變,再者運行上以複本(copied_list)運行,故原始user_list不會遭受更動
print(user_list)

使用函式


當呼叫函式時,可以使用兩種主要的方式:

1.按照順序傳入的位置參數法(Positional Argument): 根據函式定義的參數順序依次傳入值。

2.指定關鍵字/指名參數法(Keyword Argument): 直接指定參數名稱並提供對應的值,這樣可以不受參數順序的限制。

需要注意的是,如果同時混用這兩種方式,按照順序傳入的位置參數法的參數必須放在指定關鍵字/指名參數法的參數之前,否則會發生錯誤。

def multiply(number1, number2):
    return number1 * number2

# 指定參數關鍵字:12 * 3 = 36
multiply(number1=12, number2=3)
# 指定參數關鍵字:3 * 12 = 36
multiply(number2=12, number1=3)

# 按照順序法:12 * 3 = 36
multiply(12, 3)
# 按照順序法:3 * 12 = 36
multiply(3, 12)

練習:設計傳入字串可以回傳字串長度的函式


請設計一個函式,讓使用的人可以傳入字串後可以回傳字串長度(不含 ,.)。

def get_text_length(text):
  """
  :param text (str): text string
  :returns (int): it will return text parameter length
  """
  text = text.replace('.', '').replace(',', '')
  return len(text)

length = get_text_length('Life is short, I use python.')
print(length)

全域變數與區域變數


一般在函式內部使用的變數我們稱之為區域變數,其生命週期僅限於函式內,在函式外無法使用。若是在函式外部定義的變數,整個程式都可以使用的則稱為全域變數,一般若要在函式中使用會在變數名稱前面加上 global 關鍵字代表全域變數。

#Python






你可能感興趣的文章

在 oh-my-zsh 中自訂常用的 alias (重啟 terminal 後仍然有效)

在 oh-my-zsh 中自訂常用的 alias (重啟 terminal 後仍然有效)

[Vue 學習筆記(三)] vue iteration

[Vue 學習筆記(三)] vue iteration

甚麼是 iterable?

甚麼是 iterable?






留言討論