【问题标题】:Loop in line in python without creating a variable that will not be used [duplicate]在python中循环而不创建不会使用的变量[重复]
【发布时间】:2016-07-06 13:40:13
【问题描述】:

这是我的代码:

def generate_float_population(count, size):
    return [generate_float_individual(size) for item in range(count)]

我的 IDE 说,变量“item”没有被使用。我想知道,是否有更优雅的方式来做到这一点。

【问题讨论】:

  • 在这种情况下通常的做法是使用_作为变量名。
  • 变量item 是做什么用的?你没有将它传递给函数,所以你不需要它......
  • @linusg:在列表推导中使用它是因为他希望generate_float_individual(size) 被称为count 次。他不能for in range(count),所以他改为for item in range(count)。
  • generate_float_individual() 每次调用时是否返回不同的值?
  • 是的@AntoinePinsard,每次 generate_float_individual(),返回不同的值。

标签: python python-2.7 loops


【解决方案1】:

如果generate_float_individual(size) 应该在每次调用时返回相同的结果,您可以这样做:

return [generate_float_individual(size)] * count

【讨论】:

  • 即使返回值相等,如果它也是可变的,这将无法按预期工作。
  • 值得注意的是,如果generate_float_individual()返回一个可变对象,则列表中的所有元素都会在其中任何一个为时被修改。
  • 是的,你是对的,应该适应用例。例如,如果它返回一个列表,这应该可以工作return [generate_float_individual(size)[:]] * count,尽管会增加列表副本的开销。
  • @AntoinePinsard,添加 [:] 创建返回值的副本,但现在所有元素都只是对一个副本的引用。解决不了任何问题!
  • 啊,是的,我错了。
【解决方案2】:

如果实际上每次都必须调用该函数,那么这将起作用

def generate_float_population(count, size)
    return map(generate_float_individual, [size] * count)

但是,如果每次都产生相同的值,那么

def generate_float_population(count, size)
    return [generate_float_individual(size)] * count

【讨论】:

  • 第一个代码求解。
【解决方案3】:

由于变量是该函数的本地变量……它的存在真的那么重要吗?反正很快就会消失,而且很小。 您应该更担心创建一个不必要的 range(),因为这会创建一个包含 n 个元素的列表(至少在 Python 2.7 中)。

您可以使用 xrange 来创建它,或者使用类似这样的东西来做很长的路要走:

class CountDown(object):

    def __init__(self, n):
        self.n = n

    def __iter__(self):
        return self

    def next(self):
        if self.n <= 0:
            raise StopIteration()
        self.n -= 1
        return self.n

然后使用它:

def generate_float_population(count, size):
    return [generate_float_individual(size) for item in CountDown(count)]

【讨论】:

  • 你对range 提出了一个很好的观点,但问题很明显:我的 IDE 说,变量“item”没有被使用。所以这实际上并没有解决原来的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-02
  • 2017-05-29
  • 2018-05-07
  • 1970-01-01
  • 1970-01-01
  • 2018-03-31
相关资源
最近更新 更多