: 推 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 非常强大的功能之一,
擅用它可以让程式码既精简又高效。