将布尔值分配给整数

时间:2014-01-26 21:04:08

标签: python boolean

我有一个代表一堆可以打开或关闭的开关的类,我需要能够将我选择的任何开关的状态从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

3 个答案:

答案 0 :(得分: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 = 1num = 2行永远不会被执行,因为它们发生在return语句之后。
  • 返回包含“Lightswitch 3已开启”等信息的字符串并不是一个好主意。 - 我已将这些更改为print s。
  • 我假设你不想为你的开关设置名字(只有数字),因为你有一个翻转每个第n个开关的功能。

答案 1 :(得分: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

编辑:除了使用字典外,senshin的答案非常相似。这可能是一个比列表更好的选择,因为无论为开关选择的名称如何,它都可以工作,而列表只有在它们恰好是从0开始的连续整数时才有效。事实上他的解决方案可以简单地使用'in'作为检查似乎证实了这种感觉。

答案 2 :(得分: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

编辑:回应Giulio关于使用布尔值列表的评论:

是的,这种数据结构对于这种用途来说会更简单。但是,鉴于OP,你正在上课,我假设你的交换机上会有更多的东西,而不是打开和关闭开关 - 否则,你首先不需要使用类。布尔值列表是表示所需数据的一种非常脆弱的方式。只要您需要其他功能,就必须重写代码;例如,如果你想将开关命名为连续整数以外的任何整数,或者给它们颜色,或者可能完全从板上删除它们。