我有一个代表一堆可以打开或关闭的开关的类,我需要能够将我选择的任何开关的状态从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
答案 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 = 1
和num = 2
行永远不会被执行,因为它们发生在return
语句之后。 print
s。 答案 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,你正在上课,我假设你的交换机上会有更多的东西,而不是打开和关闭开关 - 否则,你首先不需要使用类。布尔值列表是表示所需数据的一种非常脆弱的方式。只要您需要其他功能,就必须重写代码;例如,如果你想将开关命名为连续整数以外的任何整数,或者给它们颜色,或者可能完全从板上删除它们。