将变量增加到100然后再递减到0并在循环中再次返回

时间:2017-02-05 21:31:47

标签: python loops variables increment

我只是想知道最多" pythonic"将变量x从0一直递增到100的方法,然后当x达到100时,再递减到0然后再循环回到100循环......

这样的事情:

x = 0
while True:
  if x < 100:
    x += 1
  elif x == 100:
    x -= 1

注意:上面的代码坏了,因此我的问题。 :)

最简单的方法是什么 - 不一定是最短的代码,不是寻找单行,只是一段非常好的代码。

6 个答案:

答案 0 :(得分:3)

我觉得单行很简单......那么这个:

Python 2

from itertools import *
ups_and_downs = cycle(chain(xrange(100), xrange(100, 0, -1)))

Python 3

from itertools import *
ups_and_downs = cycle(chain(range(100), range(100, 0, -1)))

(已编辑以删除一次性错误)

答案 1 :(得分:2)

首先你的代码不起作用:它将计数到100,然后在99和100之间交换。所以:1,2,3,..,99,100,99,100,99, ...

实际上,大多数Pythonic方式可能来增加/减少,但使用两个range s:

while True:
    for x in range(101):
        pass
        #do something with x
    for x in range(99,0,-1):
        pass
        #do something with x

或使用构建无限生成器:

generator = itertools.cycle(itertools.chain(range(101),range(99,0,-1)))

然后您可以将其用作:

for x in generator:
    pass
    #do something with x

Fr实例(我这里使用2,因为它使答案更紧凑):

for x in itertools.cycle(itertools.chain(range(3),range(1,0,-1))):
    print(x)

将产生:

0
1
2
1
0
1
2
1
0

循环将无限重复。

修复代码的方法是添加方向,但这可能非常 Pythonic

x = 0
dr = True
while True:
    if dr:
        x += 1
        if x >= 100:
            dr = False
    else:
        x -= 1
        if x <= 0:
            dr = True
    #do something with x

答案 2 :(得分:1)

使用两个循环没有错!

while True:
    for x in range(100):
        do_something(x)
    for x in range(98, 0, -1):
        do_something(x)

或者您可以使用变量来跟踪您要去的方向:

delta = 1
x = 0
while True:
    do_something(x)
    x += delta
    if x < 1 or x > 99:
        delta = -delta

答案 3 :(得分:1)

尝试这个怎么样?

x = 0
inc = 1
while True:
  # do your job here
  if x == 0:
    inc = 1
  elif x == 100:
    inc = -1
  x += inc

答案 4 :(得分:0)

那么,你目前的解决方案确实无法正常工作 - 你将减少到99,然后在99到100之间循环。

最简单的可能是添加direction标志,例如:

x = 0
isIncreasing = True
while True:
  if isIncreasing = True:
    x += 1
    if x == 100:
      isIncreasing = False
  else: 
    x -= 1
    if x == 0:
      isIncreasing = True

我有更多&#34;一行&#34;用itertools做这个的方法(参见上面的帖子),但这将是最直接的&#34;直接&#34;解决你当前的情况。当然,你真正想要的是generator

答案 5 :(得分:0)

好吧,因为没有其他人这样做,为什么一些发电机没有乐趣!

def lazy_forever_and_ever(hi, lo, start=0, step=1):
    x = start
    vals = {hi: lo, lo: hi}
    target=lo
    while True:
        if x == target:
            target = vals[target]
        if x >= target:
            yield x
            x -= step
        elif x <= target:
            yield x
            x += step

if __name__ == '__main__':
    _4eva = lazy_forever_and_ever(0, 10, 0, 1)
    print([next(_4eva) for _ in range(20)])

# output
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1]