优雅的pythonic解决方案,实现简单循环

优雅的pythonic解决方案,实现简单循环,python,python-2.7,Python,Python 2.7,函数bar获取Foo对象列表,并返回以下对象的bar属性列表: def bars(foos): bars = [] for foo in foos: bars.append(foo.bar) return bars 来自Java背景,这是我过去解决这个问题的方法。但我觉得有一种更优雅的python方法可以解决这个问题。我该怎么做?使用: (你可以用定义条(foo)来包装它):,但我认为没有它更容易阅读)例如,@Korem的列表理解建议是

函数
bar
获取
Foo
对象列表,并返回以下对象的
bar
属性列表:

 def bars(foos):
      bars = []
      for foo in foos:
          bars.append(foo.bar)
      return bars
来自Java背景,这是我过去解决这个问题的方法。但我觉得有一种更优雅的python方法可以解决这个问题。我该怎么做?

使用:


(你可以用
定义条(foo)来包装它):
,但我认为没有它更容易阅读)

例如,
@Korem
的列表理解建议是理想的解决方案

但这里有一个替代方案,当你遇到这种模式时

  • 初始化空序列
  • 在循环中附加到它
  • 返回序列
但可能需要做一些更繁重的工作,而不是简单地用表达式来表达(列表理解不允许语句,只允许epxpressions)——创建一个:


只有两件事需要注意:

  • 生成器函数不返回序列,而是返回生成器。需要通过迭代来使用该生成器。如果要像序列一样使用它(例如为其元素编制索引),则需要将其转换为序列,例如通过执行
    list(bar(f))

它是“pythonic”-我想象Pythonia人是Pythonia的居民或其他什么:-)它通常被称为pythonic-而不是Pythonian:p@roippi我每天都会搬到毕托尼亚。这正是我想要的:d
[foo.bar for foo in foos]
def bars(foos):
    for foo in foos:
        yield foo.bar
>>> gen = bars(f)
>>> gen[0]
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: 'generator' object has no attribute '__getitem__'
>>>
>>> list(gen)[0]
42
>>> gen = bars(f)
>>> list(gen)
[42, 42, 42]
>>> list(gen)
[]