有人可以解释逻辑和布尔之间的区别在这种情况下,

时间:2018-06-07 05:09:24

标签: python python-3.x python-2.7 boolean-logic

有人可以解释逻辑和布尔之间的区别吗?在此代码中

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]

1 个答案:

答案 0 :(得分:1)

除了评论中所述&的不当使用外。

这是因为operator precedence

  • and的优先级低于!=
  • !=的优先级低于&

因此第一个表达式被评估为isprime(i) and (i != 1),第二个表达式被评估为((isprime(i) & i) != 1)

修改

解释&版本的输出。如评论中所述,&是一个按位AND运算符。布尔表达式TrueFalse可分别表示为单个位10。因此,表达式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。