Python 通过重复应用函数创建列表

Python 通过重复应用函数创建列表,python,list,Python,List,我想要这个: [foo() for _ in xrange (100)] 但是更漂亮 恐怕你不会得到比Python更漂亮的结果了,除非有人建议不要使用匿名变量。这是python的成语,意思是做你想做的事 对于新手来说,u可能被认为是令人困惑的,因为它可能被误认为是特殊语法。我使用它,但只在我的代码的专家部分。我也越来越多地遇到它,但在这一点上意见似乎仍然有点分歧。如果foo总是返回相同的结果,您可以使用 [foo()]*100 这样做的优点是foo只被调用一次 编辑:正如@larsmans指

我想要这个:

[foo() for _ in xrange (100)]

但是更漂亮

恐怕你不会得到比Python更漂亮的结果了,除非有人建议不要使用匿名变量。这是python的成语,意思是做你想做的事

对于新手来说,u可能被认为是令人困惑的,因为它可能被误认为是特殊语法。我使用它,但只在我的代码的专家部分。我也越来越多地遇到它,但在这一点上意见似乎仍然有点分歧。

如果foo总是返回相同的结果,您可以使用

[foo()]*100
这样做的优点是foo只被调用一次

编辑:正如@larsmans指出的,只有当foo返回一个不可变的结果时,这才有意义


在所有其他情况下,您的解决方案都很好

根据您对beautifuller的定义,您可能更喜欢以下内容:

maplambda x:foo,xrange100


虽然在我看来,您已经拥有了更好的功能。

根据它的功能,您可以将foo作为生成器。

您可以编写一个生成器,重复如下所示:

def repeat(times, func, *args, **kwargs):
    for _ in xrange(times):
        yield func(*args, **kwargs)
然后:

它还接受传递给函数的参数,因此您可以:

from random import randint
list(repeat(100, randint, 1, 100))   # 100 random ints between 1 and 100

由于它是一个生成器,您可以将它导入任何类型的iterable,无论它是此处的列表、元组或集合,还是在理解或循环中使用它。

您的列表理解已经非常出色和有效,但是如果您需要多个选项来完成相同的事情,那么我认为您可以在此处使用map。如果需要调用指定次数的特定函数,请使用:

# in case your func looks like
def func():
    # do something
#then
map(func(), xrange(numberOfTimes))
如果您的函数需要范围中的值,则可以使用带有lambda的map:

# 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)))

等等……

我想,“这是一个未使用变量的python名称吗?”@Davy8:似乎不是每个人都同意@他告诉我说,斯文·马纳奇得到了两张赞成票。使用uu的一个优点是它可以防止派林抱怨一个未使用的变量。我认为任何以u开头的变量名都会起作用。我个人更喜欢被忽略或u忽略,因为这实际上是在被忽略变量的名称中表示被忽略。但是如果foo返回可变结果,即使它们通过==比较相等,这也会让你大吃一惊。这是错误的,因为foo只被调用一次,与OP:[RandInt1100]*5中的100个调用相反,5给出了[26,26,26,26,26]这就是为什么我指出foo必须始终返回相同的结果-randint显然不这样做。在我的例子中,foo是一个简单的函数,在每次调用时返回不同的未参数化结果,把它变成一个生成器似乎有点过头了。来自C的背景,非常漂亮。它比Enumerable.Range0100漂亮。Selectx=>foo;。如果你必须使用lambda,map是很好的,我听过的大多数人的观点都被认为是不太像pythonic的。
# 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)))