{%hackmd @ZZRT/CSS %}
# 函式
包裝程式裡相同的部分
----
`def`關鍵字
> def func(para)
**def** {my_function|函式名稱}({para1, para2|參數}):
----
以縮排定義函式區塊
```python
def func():
# 函式區塊
```
----
如果想讓參數帶有預設值呢?
```def function(a=0)```
----
函式裡的==區域變數==不能被外面使用
```python
def func():
var = 0
print(var)
# Error
```
----
可以調用外面的函數 但**不能改變**
```python=
var = 0
def func():
print(var) # OK
var += 1 #Error
```
```python=4
global var
```
----
return 回傳值
```python
def func():
return
```
Python的函式可以當作參數傳遞給變數或其他函式
而這種函式也稱為==一級函式==
----
```python=
def func(f):
print('call function')
return f()
def sayHi():
print('hi')
func(sayHi)
# callfunction
# hi
```
----
<ol class=quiz>
Q1. 下列何者是python定義函式的關鍵字
<li data-ans="x">func</li>
<li data-ans="x">function</li>
<li data-ans="o">def</li>
<li data-ans="x">define</li>
</ol>
----
Q2. 撰寫一個sum函式 用於相加兩數
:::spoiler 提示1:
def sum` `a` ` b` ` ` `
` ` a+b
:::
:::spoiler 提示2:
`)` `(` `return` `,` `:`
:::
----
```python
a = 0
def func():
a = 1
func()
print(a)
```
<ol class=quiz>
Q3. 上述程式會輸出甚麼?
<li data-ans="o">0</li>
<li data-ans="x">1</li>
<li data-ans="x">Error</li>
</ol>
----
```python
a = 1
def func():
a -= 1
func()
print(a)
```
<ol class=quiz>
Q3. 上述程式會輸出甚麼?
<li data-ans="x">0</li>
<li data-ans="x">1</li>
<li data-ans="o">Error</li>
</ol>
----
```python
a = 0
def func():
global a
a = 1
def func2():
a = 2
func2()
func()
print(a)
```
<ol class=quiz>
Q5. 上述程式會輸出甚麼?
<li data-ans="x">0</li>
<li data-ans="o">1</li>
<li data-ans="x">2</li>
</ol>
---
### Lambda 匿名函式
----
- 簡潔
- 不需要函式名稱
- 適用於小型運算
- 只有1行
- Java, C# 也支援喔~
----
使用方法:
**lambda** `parameters`**:** `expression`
- lambda: key word
- parameter: 參數
- expression: 運算式
----
使用範例:
``` python
power = lambda x, y: x**y;
print(power(25, 2))
# 625
```
----
也可以用filter來跑list
``` python
a = [1, 2, 3, 4, 5]
result = filter(lambda x: x>3, a)
print(list(result))
# [4, 5]
```
---
### 註解
\# 單行註解
"""
"""
放在函式的第一行
功能跟多行註解相似
正確名稱是 **多行字串**
它也是字串 可以被`print` 也可以像普通字串一樣操作
特點:
文字都會原封不動的顯示
----
<ol class=quiz>
Q2. 如何註解一段文字?
<li data-ans="x">// 註解</li>
<li data-ans="o"># 註解</li>
<li data-ans="x">/* 註解 */</li>
<li data-ans="x">``` 註解 ```</li>
<li data-ans="o">''' 註解 '''</li>
</ol>
---
# 練習題題目咯~~
----
給定經過多次對折旋轉的紙的邊長
以對折次數 回推原本的紙張
第一行依序為紙的長(縱)、寬(橫)
接下來有數個動作
1: 上下對折
2: 左右對折
3: 旋轉
直到輸入0代表操作結束
輸出: 以*拼成未經對折的紙張
(後面有測資, 共2頁)
----
```
輸入:
1 3
1
1
2
0
輸出:
******
******
******
******
```
----
```
輸入:
2 3
1
3
1
0
輸出:
****
****
****
****
****
****
```
----
:::spoiler (點我show答案)
``` python
def draw(h,w):
print(('*'*w+'\n')*h)
height, width = map(int,input().split())
process = []
while True:
p = input()
if p == '0': break
process.append(p)
for p in process[::-1]: # 以相反順序回推
if p == '1': height *= 2
elif p == '2': width *= 2
elif p=='3': height, width = width, height
draw(height,width)
```
:::
{"metaMigratedAt":"2023-06-16T11:15:03.191Z","metaMigratedFrom":"YAML","title":"Lesson 3","breaks":true,"slideOptions":"{\"transition\":\"fade\",\"parallaxBackgroundImage\":\"https://cdn.discordapp.com/attachments/887196342135451652/889752537513750588/image0.png\",\"parallaxBackgroundSize\":\"2100px 1000px\",\"defaultTiming\":120}","contributors":"[{\"id\":\"35809032-c270-45a6-adab-a7e7a63da25b\",\"add\":3704,\"del\":1384},{\"id\":\"a41c05df-55bf-44dc-9b5f-6e53858b0a77\",\"add\":1063,\"del\":24}]","description":"包裝程式裡相同的部分"}