2014-01-26 8 views
0

У меня есть класс, который представляет собой набор переключателей, которые могут быть как включенными, так и выключенными, и мне нужно изменить состояние любого переключателя, который я выбираю, от True до False. Как установить целое число для представления любого из этих логических значений?Назначение булевых значений целых чисел

class SwitchBoard(object): 
    def __init__(self, switches): 
     self.switches = switches 

    def flip(self, num): 
     if num in range(0, self.switches): 
      if num == True: 
       return "Lightswitch %s is now on!" % num 
       num = 1 
      else: 
       return "Lightswitch %s is now off!" % num 
       num = 2 
     else: 
      return "Lightswitch %s does not exist!" % num 
+1

Я думаю, что вы хотите словарь. –

+1

Нет, вам нужен [список] (http://docs.python.org/2/tutorial/introduction.html#lists). – user2357112

+2

Подумайте о том, что 'num' в вашем коде. В какой-то момент это, кажется, номер переключателя, который вы пытаетесь перевернуть, но в другой момент вы спрашиваете, является ли оно «Истиной». –

ответ

3

Вы хотите что-то вроде этого:

class SwitchBoard(object): 
    def __init__(self, num_switches): 
     # create a dict of {number: state} key-values 
     self.switches = {i: False for i in range(num_switches)} 

    def flip(self, num): 
     # test for the number being one of the dict's keys 
     if num in self.switches: 
      if self.switches[num]: 
       print("Lightswitch %s was on!" % num) 
      else: 
       print("Lightswitch %s was off!" % num) 
      # flip the value 
      self.switches[num] = not self.switches[num] 
     else: 
      print("Lightswitch %s does not exist!" % num) 

    def flip_every_nth(self, n): 
     for i in range(0, len(self.switches), n): 
      self.flip(i) 


x = SwitchBoard(8) 
x.switches 
x.flip(1) 
x.flip(3) 
x.flip(1) 
x.flip(10) 
x.switches 
x.flip_every_nth(3) 

Результат:

Lightswitch 1 was off! 
Lightswitch 3 was off! 
Lightswitch 1 was on! 
Lightswitch 10 does not exist! 
Lightswitch 0 was off! 
Lightswitch 3 was on! 
Lightswitch 6 was off! 

вещи, чтобы отметить:

  • Ваши num = 1 и num = 2 линии никогда не будут выполнены, потому что они встречаться на корме er a return заявление.
  • На самом деле не рекомендуется возвращать строку с информацией, например «Lightswitch 3»! - Вместо этого я заменил их на print.
  • Я предполагаю, что вы не хотите иметь имена (только числа) для ваших коммутаторов, учитывая, что у вас есть функция для переключения каждого n-го переключателя.
+1

@GiulioPiancastelli Почему бы и нет? – senshin

+0

Дело в том, почему, поскольку списка может быть достаточно. –

+0

@ GiulioPiancastelli Нет, в одном списке недостаточно хранится достаточно информации для OP. – jayelm

3

Я думаю, вы пытаетесь отследить несколько переключателей. Вы можете сохранить список True, False значений и обновлять их:

class SwitchBoard(object): 
    def __init__(self, num_switches): # Clearer name 
     self.num_switches = num_switches 
     self.states = [False] * num_switches # All off 

    def flip(self, num): 
     if 0 <= num < self.num_switches: # Why create a whole range? 
      # Do flip: 
      self.states[num] = not self.states[num] 

      return "Lightswitch %d is now %s!" % (
       num, "on" if self.states[num] else "off") 
     else: 
      return "Lightswitch %d does not exist!" % num 

Edit: ответ senshin очень похож, за исключением он использует словарь. Вероятно, это лучший выбор, чем список, потому что он работает независимо от имен, выбранных для коммутаторов, тогда как список работает только в том случае, если они являются целыми целыми числами начиная с 0. Тот факт, что его решение может просто использовать 'in' как проверка, кажется, подтверждает это чувство.

+2

Ваше использование 'self.num_switches' является избыточным.Проверка на первой строке 'flip' может просто использовать' len' для второго сравнения. –

+0

Спасибо за вашу помощь, для этой проблемы будет работать список или dict. Поскольку коммутаторы когда-либо будут только в последовательном порядке (по моей вине за то, что я не объяснил это изначально), мне технически не нужно больше, чем список, хотя диктофон более полезен, и мне было легче его понять. – Amon

+0

@GiulioPiancastelli: Я знаю, но в исходном коде этот номер был сохранен. Я не знаю, что он точно решает и что ему нужно, но я стараюсь не слишком сильно менять код OP одновременно. – RemcoGerlich

3

У вас есть несколько вариантов:

Один, используя словарь. Так, self.switches будет выглядеть примерно так:

self.switches = { 
    1: True, 
    2: False, 
    3: True, 
    4: True 
} 

Чтобы получить доступ к значениям в вашей flip функции, вы могли бы сделать что-то вроде этого. Обратите внимание, что в Python, вам не нужно говорить if value == True, скорее, просто использовать само логическое значение: if value:

def flip(self, num): 
    try: 
     if self.switches[num]: # On 
      print("Turning switch off!") 
      self.switches[num] = False 
     else: # Off 
      print("Turning switch on!") 
      self.switches[num] = True 
    except KeyError: # No switch in dictionary! 
     print("Switch does not exist!") 

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

class Switch(object): 
    def __init__(self): 
     self.on = True # default to on 

self.switches бы список Switch объектов:

def flip(self, num): 
    if num > len(self.switches): 
     print("Switch does not exist!") 
     return 
    if self.switches[num].on: # On 
     print("Turning switch off!") 
     self.switches[num].on = False 
    else: 
     print("Turning switch on!") 
     self.switches[num].on = True 

Edit: В ответ на Комментарии Giulio об использовании списка логических значений:

Да, такая структура данных будет проще для этого использования. Однако, учитывая, OP, вы делаете класс, я предполагаю, что для вашего коммутатора будет больше, чем включение и выключение переключателей - в противном случае ваше использование класса в действительности не обязательно. Список логических значений - очень хрупкий способ представления данных, которые вы хотите.Как только вам потребуются дополнительные функции, вам придется переписать свой код; например, если вы хотите назвать коммутаторы чем-то другим, кроме последовательных целых чисел, или дать им цвета или, возможно, удалить их с доски целиком.

+0

@GiulioPiancastelli Извините, что? В списке недостаточно хранится достаточная информация для OP. Вы можете использовать два списка или использовать словарь. В моем ответе нет ничего плохого. Если вы проиграли, скажите, пожалуйста, как я могу улучшить. – jayelm

+0

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

+0

@GiulioPiancastelli Хорошо, вы правы - достаточно простого списка булевых значений. Тем не менее, это примерно весь список, который способен представлять. Словарь или класс допускают расширение. – jayelm

Смежные вопросы