# 函數
~~(喔天阿超麻煩的...)~~
---
# *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是什麼嗎?
----

----
## (等等為甚麼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。
```
----
再舉個數學寫法的例子

#### 那麼運用這個想法 我們再寫看看
----
```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}]"}