查看有关表达式的 python 文档。这些都是仅代表一种或另一种、各种复杂性的值的东西。它们不是引起副作用的事物(如 I/O)或对可变数据的转换。顾名思义,生成器表达式只是另一种表达式。
减少代码行数并不是生成器表达式的预期目的。除了“内存效率和惰性计算值”的主要用途(感谢下面的评论者)之外,它们的很大一部分目的是通过使迭代器成为一种更易于访问的原子值来使您的代码更加简洁和可读。如果您使代码的可读性降低,则您可能错误地使用了生成器表达式。
特别是在我看来,生成器表达式与python 编程的功能范式紧密相关。它们产生的值与您从数学定义的系列中所期望的一样the generator yielding all the Fibonacci numbers
,例如示例。考虑到这种功能范式,专门使用生成器来产生副作用可能是一种代码异味。
积极地说,使用生成器表达式的正确方法可能是让它们一次对可迭代数据集的一个元素进行一次明确定义的转换,然后生成转换后的数据。这符合函数范式:函数接受一个值,返回一个值,并且没有副作用。
您可以使用生成器函数以一种有趣的方式重构此代码,这将允许您通过迭代生成的元素来打印连续的元素。像这样:
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())
d.items()
最后,您可能希望通过使用该iteritems
函数来删除中间列表创建:
>>> (('{} ---> {}').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