Python: как переключаться между двумя значениями

Я хочу переключаться между двумя значениями в Python, то есть между 0 и 1.

например, когда я запускаю функцию в первый раз, она возвращает число 0. В следующий раз он дает 1. В третий раз возвращается к нулю и так далее.

Извините, если это не имеет смысла, но кто-нибудь знает способ сделать это?

13 ответов


использовать itertools.cycle():

from itertools import cycle
myIterator = cycle(range(2))

myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 0
myIterator.next()   # or next(myIterator) which works in Python 3.x. Yields 1
# etc.

обратите внимание, что если вам нужен более сложный цикл, чем [0, 1], это решение становится гораздо более привлекательным, чем другие, размещенные здесь...

from itertools import cycle
mySmallSquareIterator = cycle(i*i for i in range(10))
# Will yield 0, 1, 4, 9, 16, 25, 36, 49, 64, 81, 0, 1, 4, ...

вы можете сделать это с помощью такого генератора:

>>> def alternate():
...   while True:
...     yield 0
...     yield 1
...
>>>
>>> alternator = alternate()
>>>
>>> alternator.next()
0
>>> alternator.next()
1
>>> alternator.next()
0

вы можете найти полезным создать псевдоним функции, например:

import itertools
myfunc = itertools.cycle([0,1]).next

затем

myfunc()    # -> returns 0
myfunc()    # -> returns 1
myfunc()    # -> returns 0
myfunc()    # -> returns 1

вы можете использовать мод (% оператор).

count = 0  # initialize count once

затем

count = (count + 1) % 2

будет переключать значение count между 0 и 1 каждый раз, когда этот оператор выполняется. The преимущество этого подхода заключается в том, что вы можете цикл через последовательность значений (при необходимости) от 0 - (n-1) здесь n значение можно с помощью % оператора. И этот метод не зависит от каких-либо специфических Python функции/библиотеки.

например,

count = 0

for i in range(5):
     count = (count + 1) % 2
     print count

выдает:

1
0
1
0
1

в python, True и False - целые числа (1 и 0 соответственно). Вы можете использовать логическое значение (True или False) и оператор not:

var = not var

конечно, если вы хотите перебирать другие числа, чем 0 и 1, Этот трюк становится немного сложнее.

чтобы упаковать это в предположительно уродливую функцию:

def alternate():
    alternate.x=not alternate.x
    return alternate.x

alternate.x=True  #The first call to alternate will return False (0)

mylist=[5,3]
print(mylist[alternate()])  #5
print(mylist[alternate()])  #3
print(mylist[alternate()])  #5

from itertools import cycle

alternator = cycle((0,1))
next(alternator) # yields 0
next(alternator) # yields 1
next(alternator) # yields 0
next(alternator) # yields 1
#... forever

используя xor работает и является хорошим визуальным способом переключения между двумя значениями.

count = 1
count = count ^ 1 # count is now 0
count = count ^ 1 # count is now 1

var = 1
var = 1 - var

это официальный хитрый способ сделать это;)


используя трюк подстрочного индекса кортежа:

value = (1, 0)[value]

использование индексов кортежа - один из хороших способов переключения между двумя значениями:

toggle_val = 1

toggle_val = (1,0)[toggle_val]

Если вы обернули функцию вокруг этого, у вас будет хороший переменный переключатель.


для переключения переменной x между двумя произвольными (целочисленные) значения, например, a и b, используйте:

    # start with either x == a or x == b
    x = (a + b) - x

    # case x == a:
    # x = (a + b) - a  ==> x becomes b

    # case x == b:
    # x = (a + b) - b  ==> x becomes a

пример:

переключение между 3 и 5

    x = 3
    x = 8 - x  (now x == 5)
    x = 8 - x  (now x == 3)
    x = 8 - x  (now x == 5)

это работает даже со строками (вроде).

    YesNo = 'YesNo'
    answer = 'Yes'
    answer = YesNo.replace(answer,'')  (now answer == 'No')
    answer = YesNo.replace(answer,'')  (now answer == 'Yes')
    answer = YesNo.replace(answer,'')  (now answer == 'No')

простое и общее решение без использования каких-либо встроенных. Просто следите за текущим элементом и распечатайте/верните другой, а затем измените текущий статус элемента.

a, b = map(int, raw_input("Enter both number: ").split())
flag = input("Enter the first value: ")
length = input("Enter Number of iterations: ")
for i in range(length):
    print flag
    if flag == a:
        flag = b;     
    else:
        flag = a

вход:
3 8
3
5
выход:
3
8
3
8
3

Means numbers to be toggled are 3 and 8 Second input, is the first value by which you want to start the sequence And last input indicates the number of times you want to generate


если переменная ранее определена, и вы хотите, чтобы она переключалась между двумя значениями, вы можете использовать a если B еще c форма:

variable = 'value1'
variable = 'value2' if variable=='value1' else 'value1'

кроме того, он работает на Python 2.5+ и 3.x

https://docs.python.org/3/reference/expressions.html#conditional-expressions