Re: [問題] 如何去除迴圈後多餘的東西
: 推 TuCH: print(",".join([i.get('name') for i in a])) 12/05 14:06
這裡有個可以再優化的地方是把 [] 去掉,變成:
print(",".join(i.get('name') for i in a))
與原做法的差異在於原作法是 list comprehension,
會先建立一個暫時的 list,再對該 list 跑 join,然後清掉該 list,
如果 list 很大,這個暫時的 list 會佔用不少記憶體空間。
(i.get('name') for i in a) 的寫法稱作 generator expression,
(傳入函數時可省略一層括號)
它產生的是 generator,generator 是在被迭代時才即時執行,即時傳回值。
由於不須建立暫時的 list,效能較好,記憶體消耗也較少。
ref: https://www.python.org/dev/peps/pep-0289/
此外,如果要去掉 list 的最後 n 筆項目,用簡單的 list slicing 可以做到:
print(",".join(i.get('name') for i in a[:-n]))
不過這做法一樣會先建立一個暫時的新 list a[:-n],
如果想再進一步優化,可以寫成這樣:
(range 也是傳回 generator)
print(",".join(a[i].get('name') for i in range(len(a) - n)))
最後,還有一個吹毛求疵的優化是寫成:
print(*(a[i].get('name') for i in range(len(a) - n)), sep=',')
也就是把 (a[i].get('name') for i in range(len(a) - n)) 這個 generator 迭代
出來的值變成 print 的多個參數,讓它逐一印出各片段和分隔字元,
和前者的差異在於前者要先建立一個連接好的大字串,
後者不用,因此可節省記憶體及提高效能。
但是要注意,在 Python < 3.7 函數有參數上限 255 的限制,
如果 a 很長可能會導致出錯。
若有這部分疑慮,還是使用 join 比較保險。
ref: https://stackoverflow.com/questions/714475/what-is-a-maximum-number-of-arguments-in-a-python-function
總之,generator 是 Python 非常強大的功能之一,
擅用它可以讓程式碼既精簡又高效。
--
《終結內容農場》瀏覽器套件
Chrome: http://bit.ly/CFTGC (桌機 & Android 手機)
Firefox: http://bit.ly/CFTFx
真相1: http://bit.ly/CFTss1
真相2: http://bit.ly/CFTss2
詳細介紹:http://bit.ly/CFTinfo
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 111.243.222.59 (臺灣)
※ 文章網址: https://www.ptt.cc/bbs/Python/M.1575803089.A.43C.html
※ 編輯: danny0838 (111.243.222.59 臺灣), 12/08/2019 20:41:19
推
12/08 23:18,
4年前
, 1F
12/08 23:18, 1F
推
12/09 00:24,
4年前
, 2F
12/09 00:24, 2F
推
12/09 09:02,
4年前
, 3F
12/09 09:02, 3F
推
12/09 12:19,
4年前
, 4F
12/09 12:19, 4F
推
12/10 07:43,
4年前
, 5F
12/10 07:43, 5F
推
12/10 14:03,
4年前
, 6F
12/10 14:03, 6F
推
12/11 14:55,
4年前
, 7F
12/11 14:55, 7F
推
12/18 15:14,
4年前
, 8F
12/18 15:14, 8F
討論串 (同標題文章)