Как сделать бесконечное l oop от k до заданного числа и обратно до нуля? - PullRequest
2 голосов
/ 23 января 2020

Я хочу что-то вроде (если начать с 2):

2, 3, ..., n-1, n, n-1, ..., 3, 2, 1, 0, 1, 2, 3, ... (forever)

Есть ли что-то попроще, чем это?:

def print_numbers_forth_and_back_forever(first_number, upper_limit):
    for i in range(first_number, upper_limit):
        print(i)
    while True:
        # back from n to 0
        for i in reversed(range(0, upper_limit+1)):
            print(i)
        # 1 to n-1
        for i in range(1, upper_limit):
            print(i)


print_numbers_forth_and_back_forever(4, 10)

Ответы [ 4 ]

2 голосов
/ 23 января 2020

То же, что вы сделали с генератором:

# you can add start argument to replace 0
def gen_infinite_bounce(first, end) :
  yield from range(first,end)
  while True:
    yield from range(end, 0, -1)
    yield from range(0, end)

first = 2 # first Value
end = 5 # end bounce
# you can create a variable start to replace 0
for i in gen_infinite_bounce(first, end):
  print(i)

Вы также можете сделать это с помощью itertools:

first = 2 # first Value
end = 5 # end bounce
# you can create a variable start to replace 0
from itertools, import chain, cycle
for i in chain(
  range(first, end), cycle(
    chain(
      range(end, 0, -1),
      range(0, end)
    )
  )
):
  print(i)
2 голосов
/ 23 января 2020

Следующее использование itertools обеспечит генератор, который должен удовлетворять требованиям - просто измените аргументы range(a, b) для изменения вывода:

from itertools import cycle, chain

r = range(10)
r_reversed = reversed(r[1:-1])
gen = cycle(chain(r, r_reversed))

Вывод:

>>> from itertools import islice
>>> list(islice(gen, 20))
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1]

Чтобы начать с произвольного целого числа, используйте аргумент start для islice следующим образом:

>>> list(islice(gen, 4, 20))
[4, 5, 6, 7, 8, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1]
1 голос
/ 23 января 2020

Вы можете использовать itertools с range() объектами для эффективного создания желаемого результата:

from itertools import cycle, chain, islice

def cycle_fwd_back(first, last):
    yield from range(first, last)
    yield from cycle(chain(reversed(range(last + 1)), range(1, last)))


# First 30
print(list(islice(cycle_fwd_back(4, 10), 30)))

Выходы:

[4, 5, 6, 7, 8, 9, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 9, 8, 7]
0 голосов
/ 23 января 2020

Вы можете использовать ниже код

def print_numbers_forth_and_back_forever(first_number, upper_limit):
inc = 
i = first_number
while True:
    if i == upper_limit:
        inc = -1
    elif i == 0:
        inc = 1
    print(i,end = ' ')
    i += inc
...