# List Comprehension
> [color=#40f1ef][name=LHB阿好伯, 2020/12/21][:earth_africa:](https://www.facebook.com/LHB0222/)
###### tags: `Python_30` `R & python`

[TOC]
Python語法簡單易學且非常簡潔
今天要來學習的Comprehension即是Python的Pythonic語法之一
可以運用在任何可疊代的物件(Iterable Object)上
將前面學的[Loops迴圈](/eHZN0XxST0WO7gB47DRKRA)濃縮在一行程式碼即可完成多行的任務
讓我們的程式碼更簡潔增加可讀性
# 清單(List)的Comprehension
如[Loops迴圈](/eHZN0XxST0WO7gB47DRKRA)中大大多數程式語言都可以使用for loops
```python=
# Python 語法
for 疊代器 in 可疊代的物件:
執行程式碼(須包含疊代器)
```
然而python的Comprehension可以進一步濃縮語法
:::danger
```python=
# Python語法
[執行程式碼 for 疊代器 in 可疊代的物件 if 條件句]
```
:::
簡單的我們先嘗試生成一個數列
```python=
# Python code
numbers = [i for i in range(1, 11)]
print(numbers)
```
:::success
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
:::
計算數列1~10的平方
```python=
# Python code
squares = [i * i for i in range(11)]
print(squares)
```
:::success
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 100]
:::
## 結合if條件式
判斷數列中1~21那些是偶數
```python=
# Python code
even_numbers = [i for i in range(1, 21) if i % 2 == 0]
print(even_numbers)
```
:::success
[2, 4, 6, 8, 10, 12, 14, 16, 18, 20]
:::
或是判斷1~21中不是偶數的
```python=
# Python code
odd_numbers = [i for i in range(1, 21) if i % 2 != 0]
print(odd_numbers)
```
:::success
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
:::
多個判斷式也是沒問題
```python=
# Python code
odd_numbers = [i for i in range(-21, 21) if i % 2 != 0 and i > 0]
print(odd_numbers)
```
使用Comprehension還有其他優點
有更好的效率執行速度高於原本使用的for loop
使用time模組進行量測
速度快了近三倍
>[參考資料](https://ithelp.ithome.com.tw/articles/10203788)
```python=
import time
arr1 = []
s = time.time()
for i in range(int(1e+6)):
arr1.append(i)
print('took {} secs'.format(round(time.time() - s, 3)))
s = time.time()
arr2 = [i for i in range(int(1e+6))]
print('took {} secs'.format(round(time.time() - s, 3)))
```
:::success
took 0.228 secs
took 0.082 secs
:::
集合(Set)Comprehension的用法和串列(List)Comprehension幾乎一樣
不同的地方是集合(Set)使用大括弧符號{}
最後結果其中的元素並不會重覆
🌟全文可以至下方連結觀看或是補充
https://hackmd.io/@LHB-0222/30_Days_of_Python-13
全文分享至
https://www.facebook.com/LHB0222/
https://www.instagram.com/ahb0222/
有疑問想討論的都歡迎於下方留言
喜歡的幫我分享給所有的朋友 \o/
有所錯誤歡迎指教
# [:page_with_curl: 全部文章列表](https://hackmd.io/@LHB-0222/AllWritings)
