Re: [問題] 如何去除迴圈後多餘的東西

看板Python作者 (道可道非常道)時間4年前 (2019/12/08 19:04), 4年前編輯推噓8(800)
留言8則, 8人參與, 4年前最新討論串8/8 (看更多)
: 推 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
文章代碼(AID): #1TxDZHGy (Python)
討論串 (同標題文章)
文章代碼(AID): #1TxDZHGy (Python)