作者danny0838 (道可道非常道)
看板Python
标题Re: [问题] 如何去除回圈後多余的东西
时间Sun Dec 8 19:04:45 2019
: 推 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://webptt.com/cn.aspx?n=bbs/Python/M.1575803089.A.43C.html
※ 编辑: danny0838 (111.243.222.59 台湾), 12/08/2019 20:41:19
1F:推 yummy8765: 推 12/08 23:18
2F:推 cuteSquirrel: 推 12/09 00:24
3F:推 TuCH: 受益良多 12/09 09:02
4F:推 hongyan: 学到了。谢谢分享 12/09 12:19
5F:推 froce: 推,生成器真的很好用。 12/10 07:43
6F:推 wargods8402: 推... 12/10 14:03
7F:推 kangapoo: 优文给推 12/11 14:55
8F:推 plankton: 推 12/18 15:14