# FDCSC110 Nov19 Handout - Function
---
## Function
程式裡的函數跟數學中的函數有一點不太一樣,
數學中的函數限制較多,
程式中的函數限制較少,
在 `Python` 中更是如此。
### 宣告
```python=
def [Function Name]([Arguments]):
...
```
範例程式碼
```python=
def A(x):
return x**2
def B(x, y):
return x**y
def C(*args):
return args[0]**args[1]
def D(**kwargs):
return kwargs['base']**kwargs['exponent']
def main():
print(A(2)) # 4
print(B(3, 2)) # 9
print(C(2, 4)) # 16
print(B(y = 9, x = 2)) # 512
print(D(base = 5, exponent = 2)) # 25
if __name__ == '__main__':
main()
```
### 使用方法
1.
```python=
print(input())
```
上面的程式碼是用來輸出輸入的東西。
`print()` 是一個內建的函數,用於輸出。
`input()` 也是內建函數,用於輸入。
他們分別都有各自的引數,
但只有 `input()` 有回傳,
在數學上可理解為**函數值**,
`print()` 則沒有。
2.
```python=
ar = [i for i in range(1, 11)]
print(sum(ar)) # 55
```
在上面的程式碼中,
有 `sum()` 這個內建函數,
可以看到他以 `ar` 為參數帶入 `sum()` 的引數,
並且回傳 `ar` 裡面所有元素的和。
## Recursion
程式裡的遞迴跟數學的遞迴很像,
但是通常程式裡的遞迴是從末項開始的。
以費氏數列為例,
在數學上的遞迴關係式如下。
$$
fib_n = \begin{cases}
1,\quad n = 1 \\
1,\quad n = 2 \\
fib_{n-1} + fib_{n-2},\quad n > 2 \\
\end{cases}
$$
而在程式上會這樣寫
```python=
def fib(n):
if n == 1:
return 1
if n == 2:
return 1
if n > 2:
return fib(n-1) + fib(n-2)
```
數學上式直接用起始項去推第 $n$ 項,
但程式上是從第 $n$ 出發,找到起始項後再把答案往回做。
其實遞迴的應用很廣,
也很複雜,
像是窮舉、遍歷等,
如果各位有繼續在程式這條路上精進的話,
一定會遇到的。
## List
基本上,
學一個資料結構只要掌握三點就差不多了。
1. 宣告
2. 取值
3. 修改
### 宣告
```python=
a = list()
b = []
```
### 取值
可以用運算子 `[]`
```python=
lst = [1, 2, 'a', 'b', ['c']]
print(lst[1]) # 2
print(lst[4][1]) # 'c'
```
或是迭代一個 `List` 物件
```python=
lst = [1, 2, 'a', 'b', ['c']]
for i in lst:
if not type(i) == list:
print(i)
else:
for j in i:
print(j)
```
### 修改
修改可以分成三個部分,
修改值、增加節點、刪除節點。
```python=
lst = [1, 2, 'a', 'b', ['c']]
lst[3] = 'x'
lst.insert(1, 'y') # 把 'y' 插入到第 1 項
lst.pop() # 把最後一項刪除
lst.append('z') # 在最後面加上 'z'
del lst[0] # 刪除第 0 項
print(lst) # ['y', 2, 'a', 'x', 'z']
lst.clear() # 清空整個 List
print(lst) # []
```
其實還有很多函數,
但是這些其實就夠用了,
如果想要學其他的可以自己去查查看:poop:。
### 合併
其實就把兩個 `List` 相加就好
```python=
lst1, lst2 = [1, 2], ['a', 'b']
lst3 = lst1 + lst2
print(lst3) # [1, 2, 'a', 'b']
```
### 排序
直接呼叫 `sort()` 函數
```python=
lst = [5, 2, 3, 1, 4]
lst.sort()
print(lst) # [1, 2, 3, 4, 5]
```
關於 `sort()` 函數其實還有很多可以講,
但因為比較複雜,
這裡就不多作介紹。
## Tuple
可以把它想成不能修改的 `List`,
也就是說 `List` 裡面的**修改**、**排序**它都不能用。
但是他有一個優勢是其他結構無法取代的,
那就是 `unpack`。
```python=
tup = 1, 2, 3
a, b, c = tup
print(a, b, c) # 1 2 3
```
其實在第一堂課就有遇過他了,
那個當初很毒的輸入又多理解了一項,
那個 `a, b = map(...)`,
`map(...)` 回傳的是 `Map`,
而 `Map` 在被轉成 `Tuple`,
所以才能 `unpack` 給 `a` 跟 `b`。