---
# System prepended metadata

title: Lambda

---

# Lambda
- 以一行陳述式來表示的匿名函式
- 可以取代一般的小函式

函式改寫
```python3=
#原式
def square(x):
    return x**2
    
#先改成一行
def square(x): return x**2

#將def換成lambda
lambda square(x): return x**2

#將函式名字與括號去除
lambda x: return x**2

#刪掉return
lambda x: x**2

#也可以指定給變數
square = lambda x: x**2
```

## 應用
- map 函式
```python=
#map(function, list)
#將每個list內的成員都經過function的計算並回傳
def triple(x):
	return x**3

numbers = [x for x in range(1,9)]

print(list(map(triple, numbers)))
#map韓式的輸出為map object,若要印出數值須先轉為list

#將triple用lambda取代

print(list(map(lambda x: x**3, numbers)))

#[1, 8, 27, 64, 125, 216, 343, 512]
```
- filter 函式
```python3=
numbers = [x for x in range(1,21)]
print(list(filter(lambda x: x%2 == 0, numbers)))
#只有符合x%2 ==0的x會被回傳
#filter的結果也要先轉為list才能輸出數值
#[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
```
- all(list)尋找list中的值是否全部皆為True
- any(list)尋找list中是否出現至少一次True
```python3=
#確認list內的數是否都能被2整除
nlist = [x for x in range(1,30) if x%2 ==0]
print(all(nlist))
#True
#回傳的是布林值所以不需特別用list包裝

#Generator expression的寫法較快，不會真正產生一個list
#去掉[]
print(any(x for x in range(50) if x%3 == 0))
#True
print(any(x for x in range(50) if x%3 == 6))
#False(因為是空集合)
```
- sorted(list)
-- 和list專用的.sort()不同，.sort()會直接改變原本list內的成員（由小到大排列）
-- sorted的結果需要用變數接起來，且不會改變原本list內容
```python=
#將播放順序依照少到多排列
songs = [
    {"title":"love story", "playcount":15},
    {"title":"speak now", "playcount":8},
    {"title":"me!", "playcount":22},
    {"title":"sparks fly", "playcount":5},
    {"title":"wonderland", "playcount":30}  
]

print(sorted(songs, key = lambda x:x["playcount"]))

#將播放順序依照多到少排列
print(sorted(songs, key = lambda x:x["playcount"], reverse = True))
#[{'title': 'wonderland', 'playcount': 30}, {'title': 'me!', 'playcount': 22}, {'title': 'love story', 'playcount': 15}, {'title': 'speak now', 'playcount': 8}, {'title': 'sparks fly', 'playcount': 5}]

```
- max(list)與min(list)
```python=
#利用max與min來找播放次數最多與最少的歌曲
print(max(songs,key = lambda x: x["playcount"]))
#{'title': 'wonderland', 'playcount': 30}
print(min(songs,key = lambda x: x["playcount"]))
#{'title': 'sparks fly', 'playcount': 5}
#因為回傳的值是一個字典，所以直接在後方輸入key就可以得到曲名
print(max(songs,key = lambda x: x["playcount"])['title'])
#wonderland
```


