我只是想知道最多" pythonic"将变量x
从0一直递增到100的方法,然后当x
达到100时,再递减到0然后再循环回到100循环......
这样的事情:
x = 0
while True:
if x < 100:
x += 1
elif x == 100:
x -= 1
注意:上面的代码坏了,因此我的问题。 :)
最简单的方法是什么 - 不一定是最短的代码,不是寻找单行,只是一段非常好的代码。
答案 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
或使用itertools构建无限生成器:
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]