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)
。第二部分甚至不需要执行。
如果它确实可以丢失很多性能
答案 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;和|