Понимание списка Python Простые числа - PullRequest
2 голосов
/ 11 мая 2019

Я наткнулся на решение по переполнению стека, чтобы генерировать простые числа, используя понимание списка.Но не смог понять, что делает внутренний цикл for.

Я пробовал что-то вроде

[x for x in range(5,20) for y in range(2,int(x/2)+1) if any(x%y == 0)]

Выдает ошибку: объект 'bool' не повторяется

Я знаю, что мой синтаксис неправильный, но логически для простых чисел у нас есть цикл for, затем цикл for и затем условие if для вычисления остатка (x% y).Но ответ по переполнению стека:

[x for x in range(2, 20) if all(x % y != 0 for y in range(2, x))]

Я понял причину, по которой все используется, но я не могу понять, как условие внутри all () работает так, как в идеале, должно следовать, если это так, диапазон(2, x) повторяется, и y получает значения, которые в свою очередь используются для вычислений (x% y).Как можно использовать y даже до того, как ему было присвоено значение.

Ответы [ 3 ]

3 голосов
/ 11 мая 2019

Это просто замечательная вещь для понимания списка, если он может работать нормально, как цикл for, люди не будут его создавать, потому что цикл for более читабелен и понятен.

Вы можете обнаружить, что результатом понимания списка всегда является list, в то время как результат цикла for всегда будет содержать много отдельных значений, и эти отдельные значения являются частью iterable

[x +1 для x в диапазоне (1,5)]
[2, 3, 4, 5]

для x в диапазоне (1,10): печать (x + 1)
2
3
4
5

Вы можете просто понять, что в цикле понимания уже есть список значений, тогда они просто упорядоченно подают значение условия по значению. Как это:

[1 + 1, 2 + 1, 3 + 1, 4 + 1]

Ваш код неверен, потому что вы слишком много наследуете от обычного цикла for. Ваш код, написанный для цикла for, будет выглядеть так:

for x in range(5,20):
    for y in range(2,int(x/2)+1):
        if any(x%y == 0):
            print(x)

И результат, очевидно, будет:

TypeError: объект 'bool' не повторяется

, потому что any требует итерацию, такую ​​как выражение генератора или **list**, как указано выше @ meowgoesthedog . По совпадению, список - только все о понимании списка. Тем не менее, вам нужно понять это, чтобы хорошо использовать понимание списка. Это иногда случается и со мной, в вашем случае for y in range(2,int(x/2)+1) работает как обычный for цикл.

Это синтаксис понимания списка. enter image description here

В стороне условие if, которое является необязательным предикатом. Мы можем создать другое понимание списка, следуя правилам с x%y==0 является выходным выражением и переменной y, представляющей элементы входной последовательности range(2,int(x/2)+1)

2 голосов
/ 11 мая 2019

all() и any() работают на объектах itterable. Например, all([True, True, False, True]) возвращает False. Вы не можете использовать any(True) (как в вашем примере: any(x%y == 0))

Это утверждение [x for x in range(2, 20) if all(x % y != 0 for y in range(2, x))] можно перевести на этот код:

res = []
for x in range(2, 20):
    temporary_list = (x%y != 0 for y in range(2,x))
    if all(temporary_list):
        res.append(x)

Ps. Я видел в комментариях, что вы не уверены, как объявлен y. В python есть более замечательные структуры, чем список понимания. Одним из них является генератор понимания - я думаю, что он используется в этом случае.

1 голос
/ 11 мая 2019

Синтаксис all и any работает с повторяемыми объектами (списком, наборами и т. Д.). Поэтому вы получаете ошибку, когда применяете ее на логическое значение - x%y==0.

Вы можете использовать любой из следующих способов -

[x for x in range(5,20) if not any([x % y == 0 for y in range(2, int(x/2)+1)])]

или -

[x for x in range(2, 20) if not any(x % y == 0 for y in range(2, int(x/2)+1))]

Как и все остальные дополняют друг друга .

...