2016-11-09 123 views
0

我想通过用LIGHTx命名的布尔变量来创建一些二进制信号系统。具有固定排序元素的Python布尔列表

LIGHT1 = True 
LIGHT2 = True 
LIGHT3 = False 
LIGHT4 = False 

接下来,我窝这些变量为未来计算的列表,

signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4] 

目前我使用从Python: Boolean List to Binary StringConvert base-2 binary number string to int的理念转换的列表为int这是我的信号编号。在此,[1,1,0,0]装置12

In [97]: boolList2BinString(signal) 
Out[97]: 12 

我的问题是:

  1. 如何可以自动通过更新的光的值更新“信号”的元素,而不是一次又一次地运行signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4]? Whitch意味着,在我的其他代码中,我只需要运行LIGHTx = xxxxboolList2BinString(signal)。 (也许某种方式像C++的指针?)
  2. 如果对于问题1是不可能的,是否有任何方法可以修复列表中的LIGHT的顺序?

[更新]

排除的方式,建立 'boolList2BinString' 功能内的 '信号' 列表中。

原文:

def boolList2BinString(lst): 
    return int('0b' + ''.join(['1' if x else '0' for x in lst]), 2) 

大楼内:

def boolList2BinString(): 
    osignal = [LIGHT1 , LIGHT2 , LIGHT3 , LIGHT4 ] 
    return int('0b' + ''.join(['1' if x else '0' for x in signal ]), 2) 

提前感谢!

回答

0

也许你只是需要某种包装。

class Light(object): 
    def __init__(self, state): 
     self.state = state 
    def false(self): 
     self.state = False 
    def true(self): 
     self.state = True 

LIGHT1 = Light(True) 
LIGHT2 = Light(True) 
LIGHT3 = Light(False) 
LIGHT4 = Light(False) 

signal = [LIGHT1, LIGHT2, LIGHT3, LIGHT4] 

然后你根本就改变每​​个灯的状态为LIGHT1.true()或LIGHT1.false()和signal列表值将会自动改变。

LIGHT1.false() 
LIGHT1.state # False 
LIGHT1.true() 
LIGHT1.state # True 

当然,方法命名可以改变。

0

你可以创建一个类来保存布尔值,那么它会像一个指针

>>> class Light: 
...  def __init__(self, value): 
...    self.value = value 
...  def get(self): 
...    return(self.value) 
...  def set(self, value): 
...    self.value = value 

然后使用light.get()来获取值,或light.set()设定值

>>> Light1 = light(True) 
>>> Light2 = light(False) 
>>> lights = [light1, light2] 
>>> for l in lights: 
...  print(l.get()) 
... 
True 
False 

例子显示设置:

>>> for l in lights: 
...  print(l.get()) 
... 
True 
False 

>>> light2.set(True) 
>>> for l in lights: 
...  print(l.get()) 
... 
True 
True 
>>> 
0

你可以使用一个特殊属性类的整数中的位。

下面是一个例子:

class Light(property): 
    def __init__(self, rank): 
     self.rank= rank 
     super(Light, self).__init__(self._get, self._set) 
    def _get(self, signal): 
     return (signal.value & (1 << self.rank)) != 0 
    def _set(self, signal, value): 
     if value: 
      signal.value |= 1 << self.rank 
     else: 
      signal.value &= ~(1 << self.rank) 

class Signal(object): 
    def __init__(self, value=0): 
     self.value = value 
    l1 = Light(3) 
    l2 = Light(2) 

然后,您可以使用简单:

>>> s = Signal() 
>>> s.value 
0 
>>> s.l1 
False 
>>> s.l1 = True 
>>> s.l1 
True 
>>> s.value 
8 

(测试都Python的2.7和Python 3.5)

相关问题