iT邦幫忙

2021 iThome 鐵人賽

DAY 20
0

生成式(comprehension)

生成式可以依照規模產生資料,接著將資料儲存在串列、字典與集合內。

串列生成式

若要生產一個串列有5個數字,而5個數字分別是「1、2、3、4與5」,我們可以使用以下方式產生這個串列。

a = []
a.append(1)
a.append(2)
a.append(3)
a.append(4)
a.append(5)

或者使用for迴圈也可以產生此串列。

a = []
for i in range(1,6):
    a.append(i)

Python提供另一種產生的方式為生成式(comprehension),比較符合Python的風格,串列生成式的語法為「[運算式 for 元素 in 可迭代的物件]」,使用「[]」表示為串列,可迭代的物件式tuple、串列、字串、字典與函式range等,剛才範例使用生成式改寫後如下。

[x for x in range(1,6)]

前後使用「[]」代表是串列,這行程是可以產生一個串列,串列有5個數字,5個數字分別是「1、2、3、4與5」。

生成式也可以加上條件判斷,加上條件判斷的串列生成式格式為「[運算式 for 元素 in 可迭代的物件 if 條件判斷]」。
產生一個串列,該串列元素為1到10的所有奇數數字,使用生成式可以寫成以下程式。

[x for x in range(1,11)if x%2 == 1]

生成式也可以包含另一個生成式,前面生成式執行一次,後面接的生成式要執行完畢,形成巢狀生成式,巢狀生成式的格式為「運算式 for 元素1 in 可迭代的物件1 for 元素2 in 可迭代的物件2」。
以下程式會執行九九乘法表,串ㄎ列每一個元素都式tuple,紀錄九九乘法表的被乘、乘數與積的結果。

[(i,j,i*j) for i in range(1,10) for j in range(1,10)]

產生器(generator)

python中沒有tuple的生成式,可以使用「(運算式 for 元素 in 可迭代的物件)」製作產生器(generator),這不是tuple生成式,使用「()」表示為產生器。例如:製作1到10的奇數產生器,產生器為「(num for num in range(1,10)if(nu,%2) == 1」,產生器只能執行一次,執行第二次產生任何值,以下來看個範例

#input
odd = (num for num in range(1,10) if (num%2)==1)
print(odd)
for num in odd:
    print(num)
for num in odd:
    print(num)
    
#output
<generator object <genexpr> at 0x00000273811DA8C8>
1
3
5
7
9
#第二次的「for num in odd:
#             print(num)不會輸出任何資料,因為產生器只能使用一次

以上是今天迴圈與生成式的介紹,
明天會給大家更多例題練習喔!!
/images/emoticon/emoticon05.gif


上一篇
[Day_19]迴圈與生成式 - (5)
下一篇
[Day_21]迴圈與生成式 - 練習題
系列文
Python淺顯易懂的小教室30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言