---
# System prepended metadata

title: Python -- 函數Function
tags: [python, 九年級]

---

# 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使用 算成績(...)
### 函式架構圖
![](https://i.imgur.com/rcjhw9s.jpg)
:::

### 程式碼
```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