---
# System prepended metadata

title: Python 函式
tags: [python]

---

# Python 函式
###### tags: `python`
引述：
函式是程式碼包裝在一個區塊中，方便隨時呼叫使用
要先定義一個程式區塊，然後呼叫函式

[參考課程-1](https://www.youtube.com/watch?v=7qKFvUVpQXg&list=PL-g0fdC5RMboYEyt6QS2iLb_1m7QcgfHk&index=9)
[參考課程-2](https://www.youtube.com/watch?v=OOJmhezLd4o&list=PL-g0fdC5RMboYEyt6QS2iLb_1m7QcgfHk&index=10)

## 定義函式：

>def 函式名稱(參數名稱):
        >>函式內部程式碼

參數可有可無

範例1
```python=
def sayHello():
    print("hello")

```
範例2
```python=
#n1,n2為參數，呼叫時可以給定值
def add(n1,n2):
    result=n1+n2
    print(result)
```
## 呼叫函式
>函式名稱(參數資料)

範例1
```python=
def syaHello():
    print("hello")
sayHello()
```
範例2
```python=
#定義
def say(msg):
    print(msg)
#呼叫
say("Hello python")
```
## 回傳值
>def 函式名稱(參數名稱):
        >>函式內部程式碼
        >>return #結束函式,回傳資料 or none
        
資料：布林、int等
```python=
def say(msg):
    print(msg)
    return
value = say("hello function")

print(value)#印出none
```
會回傳什麼，取決於return後的東西，跟上方程式碼無關
e.g. return "hello"則function回傳的值就為hello，

回傳值代function結果，把值從function中帶出來
```python=
def add(n1,n2):
    result=n1+n2
    return result
value = add(3,4,)
print(value)#印出7
```

沒有回傳值或沒有寫，則預設為none，例如：
```python=    
def multiply(n1,n2):
    print(n1*n2)
value = multiply(3,4)
print(value)
```
>12
>None

**return有用的功能是把值從function中帶出來，外部可以繼續操作資料**

## 程式包裝（類似的工作重複執行）
```python=
#計算1+到使用者輸入的數字
def calculate(n):
    sum=0;
    for i in range(1,n+1):
        sum = sum+i;
    return sum

n = int(input('Enter a number(enter negative number to stop calculate): '));
while(n>0):
    print(calculate(n))
    n = int(input('Enter a number(enter negative number to stop calculate): '));
```

## 參數預設資料
範例1
```python=
#參數msg預設為"hello"
def say(msg="hello"):
    print(msg)
say("World")
say()#印出預設hello
```
範例2:
```python=
def power(base,exp):
    print(base**exp)
power(3,2)
power(4)
```
>Typeerror 因為沒有第二個參數
解決：如果把function改成 power(base,exp＝0)
則不會error，而是1

**當沒有給需要的參數時，則使用預設資料**

## 呼叫函式，以參數名稱對應資料，不論順序

>def 函式名稱(名稱1,名稱2):
    >>函式內部程式碼
>#呼叫函式，以參數名稱對應資料
>函式名稱(名稱2=3,名稱1=5)

範例：
```python=
def divide(n1,n2):
    result = n1/n2;
    print(result)
    
divide(2,4);#印出0.5

divide(n2=2,n1=4)#印出2
```
## 無限、不定數量的參數 
用途：不確定會有多少參數時使用
>def 函式名稱(*無限參數):
>>無限參數以Tuple資料型態處理
>>函式內部程式碼

>#呼叫函式，可傳入無限數量的參數
>函式名稱(資料1,資料2,資料3....)

範例1：
```python=
#函式接受無限參數
def say(*msgs):
    #以tuple方式處理
    for msg in msgs:
        print(msg)
#call function 傳入參數
say("Hello","World","python","good")
```
範例2:
```python=
#算輸入數字的平均數，不限定多少數字
def avg(*ns):
    sum=0
    for n in ns:
        sum+=n
    print(sum/len(ns))
avg(3,4)
avg(3,5,10)
avg(1,4,-1,-8)
```

