# 函數概念
###### tags: `Python`
```python=
def 函數名(引用的變數):
要做的事情
return 要回傳的參數
```
## 範例:比較大小
### 使用函數前
```python=
x = eval(input('請輸入第一個數字'))
y = eval(input('請輸入第二個數字'))
if x < y :
print('%d < %d' % (x , y))
elif x > y :
print('%d > %d' % (x , y))
else :
print('%d = %d' % (x , y))
```
光一次比較就需要那麼多行;且當需要重複使用比大小這個`功能`時,就需要一直複製貼上,程式碼也會變得很臃腫
### 使用函數後
```python=
x = eval(input('請輸入第一個數字'))
y = eval(input('請輸入第二個數字'))
def z (n, m):
if n < m :
print('%d < %d' % (n , m))
elif n > m :
print('%d > %d' % (n , m))
else :
print('%d = %d' % (n , m))
return 0
z (x , y)
z (n = y, m = x)
```
使用函數的兩種寫法都可以;可以按照定義順序輸入參數,也可以指定填入的參數
## 全域變數 與 區域變數
> 在上述的範例中,`n`, `m`變數僅存在於`函數z`內,所以被稱為區域變數
>
> 可以想像為函數為程式的微宇宙,其基本定律與主宇宙無異;所以函數內的編程語法與主程式相同,但函數內的變數(區域變數)不與函數外相通,函數外的變數(全域變數)也不與函數內相通
>
> 而`x`, `y`則是全域變數,存在於主宇宙;但由於他們身分與微宇宙不相通,所以在微宇宙使用時也要換成該宇宙內的稱謂
## return
> 在執行完函數後,可以選擇向主宇宙回報資訊,常見的像是`布林值`, `區域變數`, 或指定的參數
### 範例:體位判定
```python=
SMMP = eval(input('請輸入骨骼肌肉量(單位:kg)'))
weight = eval(input('請輸入體重(單位:kg)'))
sex = input('請輸入性別 M/F')
SMMP = SMMP / weight * 100
def x (sex, SMMP):
if sex == 'M' and 34 > SMMP >32:
n = ('健康')
elif sex == 'M' and SMMP > 34 :
n = ('標準')
elif sex == 'M' and SMMP < 32:
n = ('虛弱')
elif sex == 'F' and 30 > SMMP > 28:
n = ('標準')
elif sex == 'F' and SMMP > 30 :
n = ('健康')
elif sex == 'F' and SMMP < 28 :
n = ('虛弱')
elif sex != 'M' or sex != 'F' :
n = ('性別輸入格式錯誤')
return n
print(x (sex, SMMP))
```
## 備註:
### 1. 使用函數時,盡量讓其不要影響到主程式
可以的話回傳參數就好,留給主程式操作空間,使函數具有更大的泛用性
### 2. 當輸入不確定個數的參數時,可以用`*`:
```python=
def name(*name):
for num, *number in enumerate(name) :
print(f'num = {num+1}, name = {number}')
return 0
name('Harry', 'Jack', 'Hank')
```