优雅的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
的列表理解建议是理想的解决方案
但这里有一个替代方案,当你遇到这种模式时
- 初始化空序列
- 在循环中附加到它
- 返回序列
只有两件事需要注意:
- 生成器函数不返回序列,而是返回生成器。需要通过迭代来使用该生成器。如果要像序列一样使用它(例如为其元素编制索引),则需要将其转换为序列,例如通过执行
: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)
[]