Re: [问题] 如何去除循环后多余的东西

楼主: danny0838 (道可道非常道)   2019-12-08 19:04:45
: 推 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 非常强大的功能之一,
擅用它可以让程式码既精简又高效。
作者: yummy8765 (tsuyoku)   2019-12-08 23:18:00
作者: cuteSquirrel (松鼠)   2019-12-09 00:24:00
作者: TuCH (谬客)   2019-12-09 09:02:00
受益良多
作者: hongyan (Yan)   2019-12-09 12:19:00
学到了。谢谢分享
作者: froce (froce)   2019-12-10 07:43:00
推,生成器真的很好用。
作者: wargods8402 (维尼X维尼)   2019-12-10 14:03:00
推...
作者: kangapoo (kangapoo)   2019-12-11 14:55:00
优文给推
作者: plankton   2019-12-18 15:14:00
推 

Links booklink

Contact Us: admin [ a t ] ucptt.com