Понимание Python
Итак, у меня есть две проблемы для домашнего задания, и я застрял на втором.
-
Используйте Python Set Comprehension (эквивалент Python нотации Set Builder), чтобы сгенерировать набор всех простых чисел, которые меньше 100. Напомним, что простое число является целым числом, которое больше 1, а не делится на любое целое, отличное от самого себя, и 1. Храните свой набор простых чисел в переменной (вам понадобится это для дополнительных частей). Выведите свой набор простых чисел (например, с функцией печати).
-
Используйте Python Set Comprehension для создания набора упорядоченных пар (кортежей длины 2), состоящих из всех простых пар, состоящих из простых чисел, меньших 100. Прайм-пара - это пара последовательных нечетных чисел, которые оба просто. Храните свой набор Prime Pairs в переменной. Ваш набор номер 1 будет очень полезен. Выведите свой набор прайм-пар.
Для первого, это отлично работает:
r= {x for x in range(2, 101)
if not any(x % y == 0 for y in range(2, x))}
Тем не менее, я довольно сильно зациклен на втором. Я думаю, что мне, возможно, придется взять декартово произведение множества r с чем-то, но я просто не уверен.
Это меня немного приближает, но мне просто нужны последовательные пары.
cart = { (x, y) for x in r for y in r
if x < y }
Ответы
Ответ 1
primes = {x for x in range(2, 101) if all(x%y for y in range(2, min(x, 11)))}
Я немного упростил тест - if all(x%y
вместо if not any(not x%y
Я также ограничил диапазон y; нет смысла тестировать divisors > sqrt (x). Таким образом, max (x) == 100 означает max (y) == 10. Для x <= 10 y также должно быть < х.
pairs = {(x, x+2) for x in primes if x+2 in primes}
Вместо того, чтобы генерировать пары простых чисел и тестировать их, получить один и посмотреть, существует ли соответствующее высшее число.
Ответ 2
Вы можете получить чистые и понятные решения, построив соответствующие предикаты в качестве вспомогательных функций. Другими словами, используйте нотацию Python set-builder так же, как вы должны написать ответ с помощью регулярной математической системы.
Вся идея множества понятий - дать нам возможность писать и рассуждать в коде так же, как мы делаем математику вручную.
С соответствующим предикатом в руке проблема 1 упрощает:
low_primes = {x for x in range(1, 100) if is_prime(x)}
И проблема 2 упрощает:
low_prime_pairs = {(x, x+2) for x in range(1,100,2) if is_prime(x) and is_prime(x+2)}
Обратите внимание, как этот код является прямым переводом спецификации проблемы, "Prime Pair - это пара последовательных нечетных чисел, которые являются как первыми".
P.S. Я пытаюсь дать вам правильную технику решения проблем, фактически не отдав ответ на домашнюю проблему.
Ответ 3
Вы можете генерировать пары следующим образом:
{(x, x + 2) for x in r if x + 2 in r}
Тогда все, что осталось сделать, это получить условие, чтобы сделать их первичными, что вы уже сделали в первом примере.
Другой способ сделать это: (хотя и медленнее для больших наборов простых чисел)
{(x, y) for x in r for y in r if x + 2 == y}