【问题标题】:Python best practices xrange yieldPython 最佳实践 xrange 产量
【发布时间】:2015-03-20 10:18:15
【问题描述】:
def list_step(max = 268):    
    """ split in steps of 120 elements at time
    """
    if max > 120:
        for i in xrange(0,max,120):
            if i <= max:
                rest =  max % xrange(0,max,120)[-1]
                if rest != 120:
                    yield(i, rest)
                else:
                    yield(i, 0)
    else:
        yield(max)


a = list_step()
a.next()      return > (0,28) (120,28),ecc

是否有可能在执行最后一个 next() 时返回其余部分,而不是返回带有其余部分的元组?

这样:

    a.next()      return > (0) (120),ecc.. (28)

【问题讨论】:

  • 不清楚你的意思 - 你能举几个简短的、有代表性的例子来说明这在口译会话中的样子吗?
  • 你能给出你为什么/如何使用它的上下文吗?在我看来,zip(xrange(0,max,120), [max % 120]*max) 也会这样做。您可以使用 itertools.chain 来调用迭代器。

标签: python range yield xrange


【解决方案1】:

您可以使用 itertools.chain 将迭代器链接在一起 (documentation)。如果您只想将单个值“附加”到您的生成器中,您可以使用它(请注意,您需要以某种方式将单个项目转换为可迭代项)。

您的max % xrange(0, max, 120)[-1] 也将始终为max % 120,因为xrange(0, max, 120) 是最大值,它是小于最大值的120 的倍数,因此除以它将产生与除以120 相同的结果(模)。

import itertools

itertools.chain(xrange(0,max,120), [max % 120])

【讨论】:

  • 如果您解释了代码的工作原理,这个答案会更有用。
  • @skrrgwasme 到底什么不清楚? xrange 是一个生成器,_yield 是一个生成器,itertools.chain 链接到可迭代对象。我不确定它是否真的符合提问者的要求,因为接受的答案会产生不同的结果,但我认为问题的定义不够精确,无法确定。
  • 想想你的目标受众。 OP(和未来的访客)在这里是因为他们不了解某些东西。我们可以为每个人提供可以复制和粘贴的代码 sn-ps,但这并不能真正帮助理解。解释事物如何运作的答案对社区具有更持久的价值。
【解决方案2】:

类似的东西?

def list_step(max = 268):    
    """ split in steps of 120 elements at time
    """
    if max > 120:
        rest_list = [];
        for i in xrange(0,max,120):
            if i <= max:
                rest =  max % xrange(0,max,120)[-1]
                if rest != 120:
                    yield(i)
                    rest_list.append(rest)
                else:
                    yield(i)
                    rest_list.append(0)
        for i in rest_list:
            yield(i)
    else:
        yield(max)


a = list_step()
for i in a: print i;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-28
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多