# Python -- 函數Function
###### tags: `python` `九年級`
>+ 目前為止,我們所寫的程式皆只是執行小型簡單的工作。
>當我們想要去進一步編寫大型程式,就必須了解一些方法
>來將大型程式分解成小片段以更好的去管理。
>
>+ 如果我們遇到需要 ==**重複使用某組方法**== 的情況時,
>可以透過函數來幫助我們處理這項工作。
>+ 與重複執行的**迴圈**不同,函數能幫助我們將複雜的程式分解來簡化管理
## 一、基本函數類型
### 函數一 : 沒有參數傳入,沒有數值傳出
:::info
```python=
def A():
print("Hello!")
A()
```
>輸出:
>Hello!
:::
```python=
#函式宣告
def A():
```
+ 上述函數透過`def`來向`python`表示我要建立一個函式
+ 在`def`後方定義此函數名稱為`A`
+ 括弧`()`中沒有東西,代表沒有參數傳入
+ 冒號`:`表示下行開始為該函式的區塊
+ ==函式內部區塊從此行下方第一行縮排開始,停止縮排結束==
```python=
def A():
#注意下行有縮排
print("Hello!")
```
+ 可以觀察只有一行縮排,故此函式`A()`的內部僅有一行,即印出字串`Hello!`
+ 一般python開發環境下,函式宣告行打完後點Enter換行,就會自動幫你縮排。
否則就要自己手動打`tab`來縮排一行。
```python=
A()
```
+ 當我們想要呼叫剛剛寫出的函示`A()`時,便可以在外部打`A()`呼叫函式。
+ 此處呼叫函數是在函式==外部呼叫`A()`==,所以==沒有縮排==。
+ 在呼叫後電腦才會執行函式`A()`中的`print("Hello!")`,將`Hello!`印出來。
___
### 函數二 : 參數傳入,數值傳回
:::info
```python=
def A2(num):
x=num+num
print("傳入數字的兩倍為: ", x)
return x
x=A2(100)
print("傳回的數值為: ",x)
```
>輸出結果:
>傳入數字的兩倍為: 200
>傳回的數值為: 200
:::
```python=
def A2(num):
```
+ 與函數一的`A()`不同,函式二`A2()`有一個參數傳入。
+ 此函數傳入一個參數,會被內部被當作變數 `num`來使用
```python=
def A2(num):
x=num+num
```
+ 函數內部除了變數`num`外,還宣告了一個變數`x`,`x`為`num+num`
```python=
def A2(num):
... #此處為了表達方便,用...來省略這幾行
return x
```
+ 利用`return` 來從函數內部將處理過的數值傳出去
+ 此處我們傳回函數內部的變數`x`之值,即`return x`。
```
x=A2(100)
```
+ 函數外部的程式主體部分,我們同樣也呼叫了一個`x`來取得函數`A()`傳回的數值
:::danger
### 注意! 函式內部的變數與函式外部的變數並不相通
|函式A2()內部空間的變數|函式外部空間的變數|
|:------:|:------:|
|x , num | x |
+ 此題中函數內部空間的變數`x`與外部空間接收`A2()`函數回傳值的`x`並不相通
+ 兩邊雖然名子命名一樣,但實際視為不同,因為在不同空間被命名。
:::
:::warning
```python=
def AAA(num):
x=num+num
y=200
return y
x =-100
x2=AAA(100)
print("x數值為:",x)
```
+ 同學可以參考上方程式來理解:
+ 程式主體空間的`x`被宣告為-100
+ 呼叫`AAA()`,`AAA()`內也有一個`x`。函式內部`x`為兩倍傳入的數值,即200
+ 呼叫完後`AAA()`x數值印出來為何?
|函式AAA()內部空間的變數|函式外部空間的變數|
|:------:|:------:|
| num, x, y | x, x2 |
:::
___
### 函數三: 多個傳入與傳出
```python=
def A3(x,y,z):
a=x+y+z
b=(x+y+z)/3
return a,b
total,avg = A3(100,80,90)
print("變數total為: ",total)
print("變數avg為: ",avg)
```
>輸出:
>變數total為: 270
>變數avg為: 90.0
+ 上方範例傳入三個參數給`A3()`並傳回兩個數值回來,
+ 所以我們宣告`total`與`avg`兩個變數來取得這兩個傳回的數值
___
## 二、 算成績函式
### 邏輯架構
:::info
<設計函式>
>算成績(傳入計算所需數值)
>
><函式中的函式>
>>算總分數(...)
>>算平均分數(...)
>>算加分調整後的分數(...)
<呼叫函式>
>>同學A使用 算成績(...)
>>同學B使用 算成績(...)
>>同學C使用 算成績(...)
### 函式架構圖

:::
### 程式碼
```python=
#定義算成績函式名稱:getScore
def getScore ( chinese, english, math, bonus):
#新的函式 ,第一個功能:輸出原始總成績
totalScore(chinese, english, math)
#新的函式 ,第二個功能:輸出原始平均成績
avgScore(chinese, english, math)
#新的函式 ,第三個功能:輸出加分後的總成績
adjScore(chinese, english, math ,bonus)
#印這行做為每次印出結果的間隔
print('------------------------')
def totalScore (chinese, english, math ) :
a=chinese + english + math
print("你的總分數為 :",a)
def avgScore (chinese, english, math ) :
a= (chinese + english + math)/3
print("你的平均分數為 : ",a)
def adjScore (chinese, english, math ,bonus) :
a=chinese + english + math + bonus
print("你的加分後的總分數為 :",a)
#有個學生A
getScore(100,80,60,50)
#有個學生B
getScore(100,80,60,40)
#有個學生C
getScore(10,8,60,50)
```
輸出:
>你的總分數為 : 240
你的平均分數為 : 80.0
你的加分後的總分數為 : 290
>
>你的總分數為 : 240
你的平均分數為 : 80.0
你的加分後的總分數為 : 280
>你的總分數為 : 78
你的平均分數為 : 26.0
你的加分後的總分數為 : 128