Перебирай список бесконечно - PullRequest
7 голосов
/ 28 марта 2019
a = 1
b = 2
c = 3
x = a

def change_x():
    x = next??
    print("x:", x)

for i in range(10):
    change_x()

Как я могу циклически переключаться через a, b, c, вызывая change_x () бесконечно?

Вывод должен быть:

x: 2
x: 3
x: 1
x: 2
...

Ответы [ 7 ]

8 голосов
/ 28 марта 2019

Вы можете использовать cycle() и вызывать next() столько раз, сколько хотите получить циклические значения.

from itertools import cycle

values = [1, 2, 3]
c = cycle(values)

for _ in range(10):
    print(next(c))

Выход:

1
2
3
1
2
3
1
2
3
1

или как предложил @chepner без использования next():

from itertools import islice

for i in islice(c, 10):
    print(i)

Чтобы получить тот же результат.

8 голосов
/ 28 марта 2019

Вы можете использовать itertools.cycle, чтобы переключаться между значениями в a, b и c, как указано:

from itertools import cycle
for i in cycle([a,b,c]):
    print(f'x: {i}')

Выход

x: 1
x: 2
x: 0
x: 1
x: 2
x: 0
x: 1
x: 2
x: 0
x: 1
...
3 голосов
/ 28 марта 2019

это то, что itertools.cycle делает

import itertools,time

for i in itertools.cycle([1,2,3]):
    print(i)
    time.sleep(1)
2 голосов
/ 28 марта 2019

Просто поместите ваши переменные в список и выберите их следующим образом:

mylist = [a,b,c]
i=0
while True:
   print(mylist[i%3])
   i+=1
1 голос
/ 28 марта 2019

Если вы хотите определить функцию вручную, тогда вы используете yield from:

def cycle(iterables):
    while True:
        yield from iterables
0 голосов
/ 06 апреля 2019

Если вам нужна альтернатива, которая не использует itertools, вы можете создать класс, который возвращает список, который вы хотите циклически обработать, затем в цикле вы можете напечатать список, как показано в следующем коде:

class Repeater:
    def __init__(self, l):
        self.l = l
    def __iter__(self):
        return self
    def __next__(self):
        return self.l

l = Repeater([1, 2, 3])

for e in l:
    print(*[f"x: {i}" for i in e], sep='\n')

Я предполагаю, что вы используете Python 3.6+, в противном случае измените оператор печати на:

print(*["x: {}".format(i) for i in e], sep='\n')

Выход:

x: 1
x: 2
x: 3
x: 1
x: 2
x: 3
x: 1
x: 2
x: 3
x: 1
x: 2
x: 3
x: 1
0 голосов
/ 28 марта 2019

Я не уверен, что вы хотели использовать глобальные переменные окружения таким образом, но можно следить за тем, что вы делаете, используя объект.

Предполагается, что вы знаете имена переменных, поэтому вы можете использовать globals() для доступа к их значениям.

class CycleThrough:
    def __init__(self, variable_list = ['a','b','c']):
        self.variable_list = variable_list
        self.current_variable_idx = 0
        self.total_length = len(self.variable_list)

    def next_variable(self):
        new_index = self.current_variable_idx + 1
        if new_index == self.total_length:
            new_index = 0 

        self.current_variable_idx = new_index

        variable_name = self.variable_list[self.current_variable_idx]


        global x 
        x = globals()[variable_name]
        print(x)

# defining your variables
a = 1
b = 2
c = 3 
x = a

#use object method to cycle through and reassign the global variable x

ct = CycleThrough()
for i in range(10):
    ct.next_variable()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...