Кто-то может объяснить разницу между логическим и логическим И в этом случае, - PullRequest
0 голосов
/ 07 июня 2018

Может кто-то объяснить разницу между логическим и логическим и в этом коде

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 голосов
/ 07 июня 2018

Помимо неправильного использования &, как указано в комментарии.

Это из-за приоритета оператора .

  • 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.

...