iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
自我挑戰組

大二萌新的學習紀錄系列 第 27

Day 27 : Python - 什麼是列表推導式?又該如何將它和if、if-else一起做使用?

如標題,這篇想和大家聊聊「列表推導式」是什麼東西

我們先看看範例再說明,這樣大家會比較好理解


Ex 1:
如果你今天有一for迴圈長這樣:

# 依序印出0~9的二次方為何
for i in range(10):
    print(i*i)
# 結果為: 0 1 4 9 16 25 36 49 64 81

你可以用「列表推導式」將它改寫成這樣:

# 依序算出0~9的二次方為何,並將其結果存在一列表內,再用變數result儲存
result = [i*i for i in range(10)]
print(result)
# 結果為: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

看完範例一,再看看範例二

Ex 2:
有一列表為Ax,現在你想用for迴圈和if去找4的倍數有哪些,並將它們印出來:

Ax = [20, 22, 16, 15, 18, 17]
# 有一列表為Ax,for迴圈會執行len(Ax)次,len(Ax)是計算Ax的總長度為何
for i in range(len(Ax)):
	# 判斷Ax內有無4的倍數,有則印出
    if (Ax[i]%4==0):
        print(Ax[i])
# 結果為: 20 16

你可以用「列表推導式」將它們改寫成這樣:

# 判斷Ax內有無4的倍數,有則將結果存在一列表內,並用變數result儲存
result = [Ax[i] for i in range(len(Ax)) if Ax[i]%4==0]
print(result)
# 結果為: [20, 16]

看到這裡,你應該猜到「列表推導式」的功用是什麼了
它的「目的」是為了讓程式碼看起來更加簡潔,在撰寫上會更方便快速,其結果會存到「一列表內」,所以答案印出來都會是列表的形式

其架構如下:

[結果  for  變數  in  範圍]

它也可以將if-else等判斷式寫在裡面,但請注意! 如果只有「單一if」的時候,它需寫在「範圍的後面

其架構如下:

[if的結果  for  變數  in  範圍  if (if的判斷條件)]

如果是「if-else同時出現」,需寫在「for的前面

其架構如下:

[if的結果  if (if的判斷條件)  else  else的結果  for  變數  in  範圍]

知道if-else同時出現的架構後,讓我們看看範例三

Ex 3:
給你一個列表year,今天要你在year這個列表內,找出閏年為何:

year = [2015, 2020, 2012, 2013]
# 有一列表為year,for迴圈會執行len(year)次
for i in range(len(year)):
    # 判斷year內有哪些是閏年,是則印出是閏年,不是則印出不是閏年
    if ((year[i]%4==0 and year[i]%100!=0) or year[i]%400==0):
        print(year[i], "是閏年")
    else:
        print(year[i], "不是閏年")
# 結果為:2015 不是閏年
#        2020 是閏年
#        2012 是閏年
#        2013 不是閏年

你可以用「列表推導式」將它們改寫成這樣:

# 判斷year內有哪些是閏年,是則印出是閏年,不是則印出不是閏年,並將其結果存在一列表內,用變數LeapYear儲存
LeapYear = [(year[i], "是閏年") if ((year[i]%4==0 and year[i]%100!=0) or year[i]%400==0) else (year[i], "不是閏年") for I, v in enumerate(year)]
print(LeapYear)
# 結果為: [(2015, '不是閏年'), (2020, '是閏年'), (2012, '是閏年'), (2013, '不是閏年')]

以上就是今天的介紹

如果你想加上ifif-else的判斷式,請務必記住它的擺放位置!
因為我之前一直把if-else放在「範圍的後面」,以至於程式一直報錯,所以它的擺放位置真的是世界宇宙無敵重要!!!


上一篇
Day 26 : Linux - 檔案or目錄的權限該怎麼看?又該如何做更改?
下一篇
Day 28 : C語言 - 如何解決用scanf連續輸入時,程式會自動斷行的問題?
系列文
大二萌新的學習紀錄30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言