Spróbuje wytłumaczyć choć sam jestem dopiero na początku swej programistycznej drogi... mam nadzieję że nie zamieszam...
Programik ten sprawdza czy wartość wywołana w pierwszej, zewnętrznej pętli jest podzielna (bez reszty) przez wartości wywołane w pętli wewnętrznej.
Pętla zewnętrzna podaje do pętli wewnętrznej "kandydata do sprawdzenia" o wartościach z zakresu range(2, 31), kolejno w każdym przejściu od 2 do 30.
Warunek "if" w pętli wewnętrznej sprawdza naszego kandydata czy jest on podzielny "bez reszty" przez liczby z jej zakresu range(2, candidate) czyli od 2 do kandydata (jego samego nie uwzględniając).
Każdorazowo gdy spełniony zostanie warunek "if" zwracany jest komunikat że liczba nie jest liczbą pierwszą oraz wartość znalezionego dzielnika. W momencie gdy wszystkie dzielniki (z przedziału 2 do candidate) zostaną sprawdzone następuje wyjście do pętli zewnętrznej i podanie kolejnego kandydata...i tak do wyczerpania zapasów.
Sprawdzamy pierwszego kandydata 2 (z pętli zewn.) przez zakres (2, 2) i- tu mam lekką zagadkę wydaje mi się że program nie znajdzie tego dzielnika - ponieważ sam "kandydat" nie będzie sprawdzany (będę wdzięczny za korektę jeżeli się mylę ). W związku z czym nie zostanie wyświetlony komunikat i program wyjdzie do pętli zewnętrznej.
Następnie sprawdzamy 3 czy jest podzielne bez reszty przez wartości z przedziału (2,3) czyli tylko przez 2. Nie jest podzielne więc znów program nic nie wyświetli i przejdzie do pętli zewnętrznej.
Teraz bierzemy na warsztat 4 i sprawdzamy czy jest podzielne przez wartości z przedziału (2,4). Znajduje 2. Wyświetla komunikat. Sprawdza 3 i znów wychodzi do pętli zewnętrznej.. i tak do końca czyli do 30.
Będę wdzięczny za wykrycie wszelkich nieścisłości rozumowania.