看看python docs on expressions。这些都是仅代表一种或另一种不同复杂性的值的东西。它们不是引起副作用的事物(如 I/O)或对可变数据的转换。生成器表达式,顾名思义,只是另一种表达式。
减少代码行并不是生成器表达式的预期目的。除了“内存效率和延迟计算值”的主要用途(感谢下面的评论者)之外,它们的很大一部分目的是通过使迭代器成为一种更易于访问的原子值来使您的代码更加简洁和可读。如果您使代码的可读性降低,则可能是您错误地使用了生成器表达式。
在我看来,特别是生成器表达式与 python 编程的函数范式紧密相关。它们产生的值与您从数学定义的系列中所期望的一样,例如the generator yielding all the Fibonacci numbers。考虑到这种功能范式,专门使用生成器来产生副作用可能是一种代码味道。
积极地说,使用生成器表达式的正确方法可能是让它们一次对可迭代数据集的一个元素进行一次明确定义的转换,并生成转换后的数据然后。这符合函数式范式:函数接受一个值,返回一个值,并且没有副作用。
您可以使用生成器 function 以一种有趣的方式重构此代码,这将允许您通过迭代生成的元素来打印连续的元素。像这样:
def my_printer(dictlist):
for d int dictlist: # renamed to not shadow dict
for key in dict:
print .format('{} ---> {}').format(key,dict[key])
yield
然后你可以打印如下元素:
>>> p = my_printer(dictlist)
>>> p.next()
'some stuff 1'
>>> p.next()
'some stuff 2'
等等
这并不是你真正要求的。
为了更直接地回答您的问题,如果您将 print 语句排除在外,您可能会得到看起来像是嵌套 for 循环的扁平化:
>>> (('{} ---> {}').format(k,v) for d in dictlist for k,v in d.items())
或者实际上,由于(k,v) 只是一个您以相同顺序传递的元组,您可以使用 splat 运算符 * 将其作为参数直接解压缩到您的 format 调用中:
>>> (('{} ---> {}').format(*p) for d in dictlist for p in d.items())
最后,您可能希望通过使用iteritems 函数来删除d.items() 的中间列表创建:
>>> (('{} ---> {}').format(*p) for d in dictlist for p in d.iteritems())
然后使用常规 for 循环打印结果:
>>> for x in _:
print x
key2 ---> value2
key1 ---> value1
key3 ---> value3
key4 ---> value4