Python 3测试顺序未定

时间:2011-01-17 13:55:57

标签: python comparison python-3.x boolean

string='a'
p=0
while (p <len(string)) & (string[p]!='c') :
                    p +=1

print ('the end but the  process  already died ')
       while (p <1) & (string[p]!='c') :
IndexError: string index out of range

我想测试直到字符串结尾的条件(示例字符串长度= 1) 为什么这两个部分都被执行了条件已经是假的!  只要p < len(string)。第二部分甚至不需要执行。  如果它确实可以丢失很多性能

3 个答案:

答案 0 :(得分:9)

您没有使用正确的布尔值and。使用它,你不会看到这个问题。您正在使用的内容(&)是一种按位比较,用于评估双方。

答案 1 :(得分:1)

按位AND,“a&amp; b”应该被认为是

function _bitwise_and(A,B):
    # A and B are Python expressions
    #   which result in lists of 1's and 0's

    a = A.evaluate()
    b = B.evaluate()

    return [ 1 if abit==1 and bbit==1 else 0 for abit,bbit in zip(a,b)]

所以,图形上,

a:   ...  0 1 1 0
b:   ...  1 0 1 0
         --------
a&b  ...  0 0 1 0   <- each bit is 1 if-and-only-if the
                       corresponding input bits are both 1

,结果是一个位列表,打包成一个整数。

逻辑AND,“a和b”应该被认为是

function _and(A,B):
    # A and B are Python expressions which result in values having truthiness

    a = A.evaluate()
    if is_truthy(a):
        b = B.evaluate()
        return b
    else:
        return a

注意:如果A的结果是假的,则B永远不会被评估 - 因此,如果表达式B在评估时出错,按位AND将导致错误,而逻辑AND则不会

这是常见Python习语的基础,

while (offset in data) and test(data[offset]):
    do_something_to(data[offset])
    next offset

...因为只有当offset是可用的(非产生错误的)值时,才会评估data [offset]。

使用'&amp;'而不是'和',你通过在循环结束时评估数据[last_offset + 1]来保证错误。

当然,这可以通过另一种常见习语来避免:

for ch in string if ch=='c':
    do_something_to(ch)

完全避免了IndexError问题。

答案 2 :(得分:0)

您需要使用boolean operators和/或而不是按位运算符&amp;和|