有人可以解释逻辑和布尔之间的区别吗?在此代码中
def isprime(num):
return [i for i in range(2,num) if num%i==0]==[]
num_which_are_prime=[i for i in range(1,100) if isprime(i) and i!=1]
print(num_which_are_prime)
num_which_are_prime=[i for i in range(1,100) if isprime(i) & i!=1]
print(num_which_are_prime)
显示:
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83, 89,97]
[2,4,6,8,9,10,12,14,15,16,18,20,21,22,24,25,26,27,28,30,32,33,34, 35,36,38,39,40,42,44,45,46,48,49,50,51,52,54,55,56,57,58,60,62,63,64,65,66, 68,69,70,72,74,75,76,77,78,80,81,82,84,85,86,87,88,90,91,92,93,94,95,96,98, 99]
答案 0 :(得分:1)
除了评论中所述&
的不当使用外。
这是因为operator precedence。
and
的优先级低于!=
!=
的优先级低于&
因此第一个表达式被评估为isprime(i) and (i != 1)
,第二个表达式被评估为((isprime(i) & i) != 1)
。
修改强>
解释&
版本的输出。如评论中所述,&
是一个按位AND运算符。布尔表达式True
和False
可分别表示为单个位1
和0
。因此,表达式isprime(i) & i
仅测试第一位(最右边的位)
对于每个非素数,您获得的0 & i
始终评估为0,0 != 1
始终为True
。
除2之外的每个素数都是奇数(即第一位为1)。因此,1 & x1
,其中x
是任意二进制字符串,将评估为1,1 != 1
将始终为False
。
最后,2是素数,但它是偶数(第一位是0)。因此,1 & 10
将为0,0 != 1
的评估结果为True
。
因此,您的输出仅包含非素数和数字2。