認識函式
在建立複雜的程式時,通常我們會把功能拆解成一段段小程式,以利於抽象化、重複使用和方便測試程式,將程式依據功用拆解成不同函式則是讓你的程式邁向模組化。
常見的函式可以分為三種:
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
關鍵字代表全域變數。