#### meet.google.com/czn-pbav-zvr ### md.nchuit.cc/py/ # 函式(Function) > [name=ZJ][time= 110,10,18] --- ## 函式是什麼? function 是一個建構程式的小區塊, 它就像是一台機器,你可以自行指定它的==功能==,以及所需要的原料(==輸入==)、產出(==輸出==)。 如此一來,在需要用到同一個操作的時候,只需要呼叫這個函式,就可以免去把同樣的程式碼不斷複製貼上的情況。 ---- ## 優點 1. 程式的重複利用性 2. 程式的易讀性 3. 程式的易除錯性 4. 程式的一致性 5. 程式的模組化 --- # 函式建立+呼叫 ## 建立函式 使用**關鍵字**==def==定義函式: 和 ==if==、==elif== 一樣,要在後面加==冒號==然後==縮排== ```python= def my_function(): print("My first function") #實際上"print()"就是一個函式 ``` ---- ## 呼叫函式 ```python= def my_function(): print("My first function") my_function() ###呼叫 ``` ### Result: My first function --- # 函式(Function)參數 ---- ## 引數、參數(Arguments, Parameters) 資料可以作為引數傳遞到一个函式中作為參數使用。 #### ex1: ```python= def f1(val): #建立函式 print(val) k=19 f1(k) #呼叫函式 ``` val 參數; k 引數 --- #### ex2: ```python= def f1(val): #建立函式 print("小"+val) f1("明") #呼叫函式 f1("夫") #呼叫函式 f1("聰") #呼叫函式 ``` val 參數; k 引數 ---- #### Result: 小明 小夫 小聰 --- ## 關鍵字參數(Keyword Argument)和 預設值參數(Default Argument) ---- ## 關鍵字參數(Keyword Argument) ```python= def f1(person, item): #建立函式 print(person +" uses "+item+ ".") f1(person="Ken", item="pen") #呼叫函式 f1("Ken", "pen") #呼叫函式 ``` ### Result: Ken uses pen. Ken uses pen. ---- ## 預設值參數(Default Argument) ```python= def f1(person, item, date="2022.10.18"): #建立函式 print(person ," uses ",item," on ",date,".") f1(person="Ken", item="pen") #呼叫函式 f1("Ken", "pen") #呼叫函式 ``` ### Result: Ken uses pen on 2022.10.18 . Ken uses pen on 2022.10.18 . --- ## 函式(Function) *args、**kwargs運算子 ---- ### 打包成tuple(*args) *Python會將參數資料打包成元組(Tuple)資料型態,那如果想打包成字典(Dictionary)資料型態,則可以使用 ** 符號 ```python= def f1(*data): #建立函式 print(data) f1("Ken","pen","2022.10.18") #呼叫函式 ``` #### Result: ('Ken', 'pen', '2022.10.18') ---- ### 打包成dictionary(**kwargs) ```python= def f2(**data2): print(data2) f2(person="Jhon", item="eraser", date="2022.10.17") ``` #### Reslult: {'person': 'Jhon', 'item': 'eraser', 'date': '2022.10.17'} ---- 另外,在宣告時 **任意參數**一定要放在**任意關鍵字參數** 前面 ```python= def my_function(arg0,arg1,*args,**kwargs): #to do... pass ``` --- # 函式(Function)種類 ### 無回傳值 前面有了 ### 有回傳值 ```python= def Sum(a,b): sum=0; for i in range(a,b+1): sum += i; return sum; print(Sum(2,10)) ``` #### Result: 54 --- # 函式(Function)變數範圍(Scope) **區域變數(Local Variable)** 和 **全域變數(Global Variable)** #### ex1: ```python= x=10 #全域變數 def number_is(): x=1000 #區域變數 print(x) number_is() print(x) ``` ---- #### Result: 1000 10 ---- #### ex2: ```python= x=10 def number_is(): global x x=1000 #強制更改全域變數 print(x) print(x) number_is() print(x) ``` #### Result: 10 1000 1000 --- # `lambda`函式(匿名函式) 匿名函式,顧名思義,就是沒有名字的函式,只有函式的實體 `lambda`函式可以接受任意數量的引數,但只能有一個表達式用作回傳。 ```python= x = lambda a, b : a * b print(x(5, 6)) # print((lambda a, b : a * b)(5, 6)) ``` ---- 等同於... ```python= def x(a,b): return a * b print(x(5, 6)) ``` ---- 常見的使用時機 ```python= scores = [ ('Jane', 'B', 12), ('John', 'A', 15), ('Dave', 'B', 11)] # 依照第三個數字元素排序 key = lambda s: s[2] scores.sort(key) # scores.sort(key = lambda s: s[2]) print(scores) ``` --- ## 更多內建函式庫 ```python= example1 = abs(-10) print(example1) #取得絕對值 輸出 10 example2 = chr(66) print(example2) #取得整數66的字元 輸出 B example3 = divmod(33,6) print(example3) #取得33除以6的商數和餘數 輸出 (5, 3) example4 = float(33) print(example4) #轉成浮點數 輸出 33.0 example5 = hex(33) print(example5) #轉成16進位 輸出 0x21 example6 = int(22.79) print(example6) #轉成整數(無條件捨去) 輸出 22 example7 = oct(33) print(example7) #轉成八進位 輸出 0o41 example8 = ord("B") print(example8) #取得Unicode編碼 輸出 66 example9 = pow(2,5) print(example9) #取得2的5次方 輸出 32 example10 = round(22.79) print(example10) #轉成整數(四捨五入) 輸出 23 example11 = sum([11,22,33,44]) print(example11) #取得list的總和 輸出 110 ``` ---- #### Reslut: 10 B (5, 3) 33.0 0x21 22 0o41 66 32 23 110 --- # 遞迴(題外話) 遞迴是一個常見的數學和程式概念。它意味著一個函式呼叫自己。 在使用遞歸時要非常小心,因為它很容易陷入一個永遠不會終止狀況,或者使用過量內存或處理器資源。但如果寫得正確,遞歸可以是一種非常高效和數學上優雅的編寫方法。 ---- 優點: (1)可增加程式的可讀性。 (2)可處理較複雜的問題。 缺點: (1)需要花費較多的時間。 (2)利用暫存堆疊(Stack)的觀念,需要額外的儲存空間。 ---- <!-- .slide: data-background="white" --> ### [Stack](https://zh.wikipedia.org/zh-tw/%E5%A0%86%E6%A0%88) ![](https://i.imgur.com/Gl4cYbJ.png) ---- ![](https://i.imgur.com/2r7BiIb.png) ---- ![](https://i.imgur.com/dEHSmnw.png) ---- #### 費式數列: ```python= def fibo(n): if n == 0: return 0 elif n == 1: return 1 return int(fibo(n-1) + fibo(n-2)) print(fibo(10)) ``` --- # 練習: ::: spoiler 練習1 ```python= def my_function(fname, lname): print(fname +' ' + lname) my_function('kk','jj') ``` ::: 執行下面程式碼會報錯,請修改第4行讓它能運行。 ```python= def my_function(fname, lname): print(fname + ' ' + lname) my_function('kk') ##改這行 ``` ---- ::: spoiler 練習2 ```python= def isPrime(n): if(n==2): return True for i in range(2,int(n**0.5)+1): if(n%i==0): return False return True print(isPrime(1117)) ``` ::: spoiler 寫一個含一個引數的函式(如下),判斷`n`是不是質數(回傳`True`或`False`)。 ```python= def isPrime(n): ## TO-DO print(isPrime(1117)) ``` :::success hint: 質數判斷邏輯,除了2其餘為奇數 ::: ---- ::: spoiler 練習3 ver.1.0 ```python= def func(n=int(input('輸入n:'))): for i in range(1,n+1): for j in range(i): print('*',end='') print() func() ``` ver.2.0 ```python= def func(n): #此function 為 印出一行 n 個星星 for i in range(n): print('*',end='') print() times=int(input('輸入n:')) for i in range(1,times+1): #執行function n次 func(i) ``` ::: 輸入: 整數n 輸出: nxn的直角三角形 ps使用function 輸入n:5 ![](https://i.imgur.com/1WAYEv5.png) ---- ::: spoiler 練習4 ```python= def mean(a,b,c): return (a+b+c)/3 print(mean(3,2,7)) ``` ```python= mean = lambda a,b,c : (a+b+c)/3 print(mean(3,2,7)) ``` ::: 輸入: `a,b,c` 輸出: 平均值 (也用可以用下面的`lambda`試試看) --- ## 參考資料 [Python 初學第七講 — 函式](https://medium.com/ccclub/ccclub-python-for-beginners-tutorial-244862d98c18) [[Python教學]5個必知的Python Function觀念整理](https://www.learncodewithmike.com/2019/12/python-function.html) [[Day05]Python 基礎語法 - function、import](https://ithelp.ithome.com.tw/articles/10201851) [[Python教學]Python Lambda Function應用技巧分享](https://www.learncodewithmike.com/2019/12/python-lambda-functions.html) [初學者學演算法|從費氏數列認識何謂遞迴](https://medium.com/appworks-school/%E5%88%9D%E5%AD%B8%E8%80%85%E5%AD%B8%E6%BC%94%E7%AE%97%E6%B3%95-%E5%BE%9E%E8%B2%BB%E6%B0%8F%E6%95%B8%E5%88%97%E8%AA%8D%E8%AD%98%E4%BD%95%E8%AC%82%E9%81%9E%E8%BF%B4-dea15d2808a3)
{"metaMigratedAt":"2023-06-17T11:41:42.374Z","metaMigratedFrom":"YAML","title":"函式 - Python 教學","breaks":true,"description":"中興大學資訊研究社1101學期程式分享會主題社課","contributors":"[{\"id\":\"de8e7839-dcf2-4d44-a4b5-080015e10202\",\"add\":8824,\"del\":2006},{\"id\":\"e86b6571-4dea-4aa4-ba20-ece559b0e015\",\"add\":105,\"del\":69}]"}
Expand menu