# 函數 ~~(喔天阿超麻煩的...)~~ --- # *def* ### 你可以定義一個任何你想要的函數 ---- ## 文字說明 #### 一樣先自己看看 ``` def 介紹一個函式的定義 它之後必須連著該函式的名稱和置於括號之中的一串參數。 自下一行起,所有縮排的陳述式成為該函式的主體。 return [表達式]結束函數,選擇性地傳回一個值給呼叫方 不含表達式的return 相當於回傳None。 ``` ---- ### def的用法 ``` 公式: def 名字(你要帶入的參數): 程式碼 ``` ---- ### 舉個例子吧! ```python! def icecream_is_cold(icecream): if icecream == 'cold': print("icecream is cold") else: print("icecream is hot") ``` ## 這個是比喻不能執行 ---- ## 可為甚麼執行不了呢??? ---- ## ㄟㄟ,你只是定義ㄟ,大哥~ ## 要執行阿!!!!! ---- ## 從我們剛才的例子開始好了 ```python! def icecream_is_cold(icecream): if icecream == 'cold': return 'cold' else: return 'hot' cookie = input() Quokka = input() cookie = icecream_is_cold(cookie) Quokka = icecream_is_cold(Quokka) ``` ## 這只是比喻,不能執行 ---- ### 所以我們假設cookie是熱的,那他就會告訴你是hot的! ### 如果是冷的,就會告訴你是cold的! ### Quokka也是一樣的! ---- ## 有人不知道Quokka是什麼嗎? ---- ![image alt](https://quokkas.co/cdn/shop/articles/quokkahub-smile-daxon.jpg?v=1674013678) ---- ## (等等為甚麼Quokka有冷熱差別...) ~~不會是...停屍間...?~~ --- ## 補充 ### Pass 上半堂課有提到pass在迴圈的用法 現在來講在def中的用法 ---- pass陳述式不執行任何動作。它可用在語法上需要一個陳述式但程式不需要執行任何動作的時候。 ---- 這樣說有點難理解 我來舉個例子 ---- ```py! #輸出Python 的每個字母 def process_data(data): if data: result = process_valid_data(data) return result else: # 當資料無效時,我們還沒有確定要執行什麼操作,所以使用 pass pass ``` ---- ## 補充 ### return ---- ### return 總共有4種不同的方法 用於從函數中傳回值的語句 可以傳回單一值、多個值,或不傳回任何值(傳回None) ---- 第一種:一個參數且會 return ```python def wow(a): a=a+a return a print(wow(5)) ``` ---- 第二種:2 個參數且會 return ```python def ahhh(a,b): c=a*b return c print(ahhh(5,3)) ``` ---- 第三種:0 個參數且會 return ```python def CCCC(saysomething): print(saysomething) return 0 F=CCCC("weeeee") print(F) ``` ---- 第四種:0 個參數且不會 return ```python def OMG(a,b): c=a*b return a=5 b=3 F=OMG(a,b) print(F) ``` ---- return多個值 ```python def ggg(): return 1, 1 print(ggg()) ``` --- ## 使用import引入內建函數 ---- ### 你可以利用import來引入更多的函數 ---- ### 今天就來講如何使用import math ---- ## 首先你要在程式第一句打上這個 ```python import math ``` ---- ## 這樣就可以引入函數了喔! ---- ## math 用法 ```python import math x = 13.1 y = 19.9 z = 9 print(math.pi) #圓周率pi print(math.e) #自然數e result = math.ceil(x) #無條件進入法 result2 = math.floor(y) #無條件捨去法 result3 = math.sqrt(z) #開平方根 print(result) # 14 print(result2) # 19 print(result3) # 3.0 ``` ---- ## 額外補充(以下不需import) ```python x = 10.6 y = -46 z = 0 #python好用的內建數學函數 result = round(x) #四捨五入 result2 = abs(y) #絕對值 result3 = pow(2 , 4) #2的4次方 result4 = pow(2 , 4 , 5) #2的4次方除以5的餘數 result5 = max(x, y, z) #取最大值 result5 = min(x, y, z) #取最小值 print(result) # 11 print(result2) # 46 print(result3) # 16 print(result4) # 10.6 print(result5) # -46 ``` ---- ## 補充 ### 邏輯運算子 ---- ## 什麼是邏輯運算子? ---- ## and(和), or(或是), not(非) ### 以上就是邏輯運算子 ---- ```python a = 10 b = 10 c = 10 if (a == b and a == c): print("完全相等") else: print("不完全相等") ``` output ```python 完全相等 ``` ---- ```python a = 10 b = 10 c = 15 if a == b or a == c: print("部分相等") else: print("不相等") ``` output ```python 部分相等 ``` ---- ```python a = 10 b = 10 c = 10 if not a == b and a == c: print("不完全相等") else: print("完全相等") ``` output ```python 不完全相等 ``` --- # 複習一下這幾週看到的運算子 ---- ```python a <= b #a小於等於b a >= b #a大於等於b a == b #a等於b,不要和a = b搞混 a == b and b == c #a等於b而且b等於c a == b or b == c #a等於b或b等於c ``` --- ## bool柏林 #### 這裡會再次提到是因為可以配合def ~~但在這裡還是先從基礎的來講~~ ---- ## 他真的很簡單,他就是代表True或False ```python 變數 = True #就醬 變數 = False ``` ---- ## 至於怎麼和if搭配呢? ---- ## example ```python 子脹擁有帥氣的臉= True if 子脹擁有帥氣的臉: #如果此事為真(True) print("好帥") else: # 如果不是就是錯的(False) print("不要瞎掰好嗎") ``` ---- ## 輸入用法 ```python 子脹擁有帥氣的臉 = bool(input("子脹擁有帥氣的臉是真的嗎?!:")) if 子脹擁有帥氣的臉: #如果此事為真(True) print("好帥") else: # 如果不是就是錯的(False) print("不要瞎掰好嗎") ``` ---- ### 那麼這裡是搭配def的用法 ```py! def is_even(number): if number % 2 == 0: return True else: return False ``` ```python # 在這裡使用函數來檢查一個數字是否為偶數 result = is_even(4) print(result) # 輸出: True ``` --- ### 接下來又到了一些~~小~~練習的時間 :) ---- #### 題目1:編寫一個函數,計算n的階乘,使用while迴圈實現。(3min) ---- ```py! def factorial(n): result = 1 while n > 0: result *= n n -= 1 return result ``` ---- #### 題目2:編寫一個函數,找出兩個數字的最大公因數(GCD)。 ---- 解法一 ```py! def gcd(a, b): if a == b: return a if a == 0: return b if b == 0: return a if a & 1 == 0: # 如果a是偶数 if b & 1 == 1: # 如果b是奇数 return gcd(a >> 1, b) else: return gcd(a >> 1, b >> 1) << 1 if b & 1 == 0: # 如果b是偶数 return gcd(a, b >> 1) if a > b: return gcd((a - b) >> 1, b) return gcd((b - a) >> 1, a) ``` ---- 解法二 用輾轉相除法 有人還記得輾轉相除法嗎 ~~還是根本沒學過~~ ---- 沒事 我來說明一下 ``` 輾轉相除法,也稱為歐幾里德算法 是一種用來找到兩個正整數的最大公因數(GCD)的方法 最大公因數是指兩個整數中能夠整除它們的最大正整數 輾轉相除法的基本思想是反覆地將兩個數中較大的數除以較小的數 然後用餘數來替換它們 直到其中一個數成為0 此時另一個數就是原始兩數的最大公因數。 ``` ---- 舉個例子 ``` 假設我們要找出 48 和 18 的最大公因數(GCD)。 首先,將48除以18,得到商數2和餘數12。 接下來,將18除以12,得到商數1和餘數6。 然後,將12除以6,得到商數2和餘數0。 當餘數變為0時,我們停止計算 並且最後一個非零餘數,也就是6 就是原始兩數 48 和 18 的最大公因數。 因此,GCD(48, 18) = 6。 ``` ---- 再舉個數學寫法的例子 ![image alt](https://i.ytimg.com/vi/f0YmQ_8bOWc/maxresdefault.jpg) #### 那麼運用這個想法 我們再寫看看 ---- ```py! def gcd(a, b): while b: a, b = b, a % b return a ``` ---- #### 題目~~2.5~~:編寫一個函數,找出兩個數字的最小公倍數(LCM)。 ---- ```py! def lcm(a, b): return a * b // gcd(a, b) # 使用上面的GCD函數計算 ``` ---- #### 題目3:編寫一個函數,計算1到n的總和,但只計算那些可以被3或5整除的數字。 ---- ```py! def sum_of_multiples(n): total = 0 for i in range(1, n + 1): if i % 3 == 0 or i % 5 == 0: total += i return total ``` ---- #### 題目4:編寫一個函數,找出一個數字的所有因數。 ---- ```py! def find_factors(number): factors = [] for i in range(1, number + 1): if number % i == 0: factors.append(i) return factors ``` ---- #### 題目5:編寫一個函數,找出一個數字是否為質數。 ---- ```py! def is_prime(number): if number <= 1: return False for i in range(2, int(number**0.5) + 1): if number % i == 0: return False return True ``` ---- #### 題目7:編寫一個函數,計算於一個範圍內所有質數的總和。 ---- ```py! def sum_of_primes_in_range(start, end): total = 0 for num in range(start, end + 1): if is_prime(num): total += num # 使用之前定義的is_prime函數 return total ``` ---- ## 最後一題 ### 上禮拜最後一題的類題 我最後面會給上禮拜的解答 :) ---- ### **計算1到200之間所有質數的平方和,並找出這個平方和的因數個數** 若解得出來 其實你的def就已經夠熟練了 一樣還是先想一想再看解答啦 ---- ```py! def is_prime(number): if number <= 1: return False for i in range(2, int(number**0.5) + 1): if number % i == 0: return False return True def prime_square_sum(limit): prime_sum = 0 for num in range(2, limit + 1): if is_prime(num): prime_sum += num ** 2 return prime_sum def count_factors(number): factors = 0 for i in range(1, int(number**0.5) + 1): if number % i == 0: factors += 2 if int(number**0.5) ** 2 == number: factors -= 1 return factors limit = 200 prime_sum = prime_square_sum(limit) factor_count = count_factors(prime_sum) print(f"1 到 {limit} 之間所有質數的平方和為:{prime_sum}") print(f"這個平方和的因數個數為:{factor_count}") ``` ---- ## 上禮拜那題的解答 #### 問題:計算1到100之間所有質數的平方和,找出這個平方和的因數。 ---- ```py! prime_sum_of_squares = 0 for num in range(2, 101): is_prime = True for i in range(2, int(num ** 0.5) + 1): if num % i == 0: is_prime = False break if is_prime: prime_sum_of_squares += num**2 # 計算平方和的因數個數 divisor_count = 0 for i in range(1, prime_sum_of_squares + 1): if prime_sum_of_squares % i == 0: divisor_count += 1 print("平方和:", prime_sum_of_squares) print("因數個數:", divisor_count) ```
{"title":"函數","description":"(喔幹超麻煩的…)","contributors":"[{\"id\":\"35a0644c-29d6-4dd3-98eb-9df68421a475\",\"add\":10001,\"del\":2236}]"}
    407 views
   Owned this note