【发布时间】:2011-10-04 17:39:58
【问题描述】:
我想要这个:
[foo() for _ in xrange (100)]
但更漂亮。 ?
【问题讨论】:
-
来自 C# 背景,非常漂亮。比
Enumerable.Range(0, 100).Select(x => foo());漂亮。
我想要这个:
[foo() for _ in xrange (100)]
但更漂亮。 ?
【问题讨论】:
Enumerable.Range(0, 100).Select(x => foo());漂亮。
根据您对“更美”的定义,您可能更喜欢这个:
map(lambda x: foo(), xrange(100))
虽然您已经拥有的 IMO 要好得多。
【讨论】:
lambda,map()(好吧,我听过的大多数人都认为)不像等效的列表理解那样pythonic。
你可以像这样写一个生成器repeat:
def repeat(times, func, *args, **kwargs):
for _ in xrange(times):
yield func(*args, **kwargs)
然后:
list(repeat(100, foo))
它还接受要传递给函数的参数,因此您可以:
from random import randint
list(repeat(100, randint, 1, 100)) # 100 random ints between 1 and 100
由于它是一个生成器,您可以将它通过管道传输到任何类型的可迭代对象中,无论是 list(如这里)还是 tuple 或 set,或者在理解或循环中使用它。
【讨论】:
您的列表理解已经很漂亮和有效,但是如果您需要多个选项来做同样的事情,那么我认为您可以在这里使用 map。如果您需要调用某个函数指定的次数使用:
# in case your func looks like
def func():
# do something
#then
map(func(), xrange(numberOfTimes))
如果您的函数需要范围内的值,那么您可以将 map 与 lambda 一起使用:
# in case your func looks like
def func(value):
# do something with value
#then
map(lambda val: func(val), xrange(numberOfTimes))
或者,如果您需要使用多个相同长度列表中的数据:
# in case your func looks like
def func(value1, value2):
# do something with values
#then
map(lambda val: func(*val), zip(xrange(10), xrange(10,20)))
等等……
【讨论】:
根据它的作用,您可以将foo() 设为生成器。
【讨论】:
如果foo() 总是返回相同的结果,你可以使用
[foo()]*100
这样做的好处是foo() 只被调用一次。
编辑:正如@larsmans 指出的那样,这只有在foo() 返回不可变结果时才有意义。
在所有其他情况下,您的解决方案都很好!
【讨论】:
foo 返回可变结果,即使它们与 == 比较相等,这在你的脸上爆炸。
foo() 只被调用一次,而不是 OP 中的 100 次调用:[randint(1,100)]*5 给 [26, 26, 26, 26, 26]
foo() 必须始终返回相同的结果——randint() 显然不会这样做。
恐怕你不会得到它比 Python 中的更漂亮,除了有些人会建议不要 _ 使用“匿名”变量。这是做你想做的事的 Pythonic 习语。
(_ 对新手来说可能会让人感到困惑,因为它可能会被误认为是特殊的语法。我使用它,但只在我的代码的“专家部分”中使用它。我也越来越频繁地遇到它,但意见在这一点上似乎仍然有些分歧。)
【讨论】:
_ 是未使用变量的pythonic 名称?
_ this way。
_ 的一个优点是它可以防止 PyLint 抱怨未使用的变量。我认为任何以_ 开头的变量名都可以。
ignored 或_ignored 之类的东西,因为这实际上是以被忽略变量的名称表示的。