Какой самый питонный способ написания функции простого числа с использованием цикла for и while? - PullRequest
0 голосов
/ 19 сентября 2018

Я собираюсь выполнить функцию, цель которой - вернуть оператор Prime / Not prime, если его аргумент - простое число или нет.Мне удалось использовать цикл for:

def prime1(n):

z = []

for i in range (1, n+1):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

if len(z) == 2:
    print ("Prime")
else:
    print ("Not prime")`

Затем я попытался сделать то же самое, но с помощью цикла while:

def prime2(n):

z = []
i = 1

while i < int(len(range(1, n+1))):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

if len(z) == 2:
    print ("Prime")
else:
    print ("Not prime")

К сожалению, моя система продолжает вычислять, не выводя мне вывод,

Можете ли вы объяснить мне, где я допустил ошибку?

Ответы [ 5 ]

0 голосов
/ 19 сентября 2018

Наиболее питонический способ, который я мог придумать, приведен ниже:

def isPrime(n):
    return all(n % i for i in range(2, int(n ** 0.5) + 1)) and n > 1

for i in range(1, 20):
    print(isPrime(i))

Объяснение:

  • все гарантирует, что каждый элемент в данном выражении вернет True

  • n% i возвращает True, если n! = 0 (допускаются даже отрицательные числа)

  • int(n ** 0.5) эквивалентноsqrt(n) и, поскольку range всегда возвращает числа до n - 1, вы должны добавить 1

  • n > 1, чтобы убедиться, что n не равно 1

Проблема в вашем коде заключается в том, что ваш i = i + 1 находится в неверной области
Ваша программа проверяет, является ли (n/i).is_integer(), который возвращает False, поскольку n / 2, не является целым числом

Улучшение вашего кода:

Вместо (n/i).is_integer() вы можете использовать n % i == 0, который возвращает остаток, равный 0
Далее вы должны поставить i = i + 1 во внешней области видимости

И лично я никогда не был фанатом i = i + 1.Используйте i += 1

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

Надеюсь, это поможет!

Редактировать:

Вы можете напечатать 'Prime' или 'Not Prime' следующим образом:

def isPrime(n):
    print('Prime' if all(n % i for i in range(2, int(n ** 0.5) + 1))
                 and n > 1 else 'Not Prime')

for i in range(1, 20):
    isPrime(i)
0 голосов
/ 19 сентября 2018

Наш предпочтительный метод не должен быть while циклами, если мы не нуждаемся в их использовании, то, как говорится, мы могли бы использовать списки:

def prime(n):
    z = []  
    [z.append(i) for i in range(1, n+1) if (n/i).is_integer()]
    [print("Prime") if len(z) == 2 else print("Not Prime")]

prime(101)

Но давайте возьмем цикл в том, что выполучил ваш for цикл:

for i in range (1, n+1):
    if (n/i).is_integer():
        z.append(i)
        i=i+1

Строка i = i + не соответствует цели, которую вы намереваетесь, цикл будет повторяться с 1 to n+1 независимо от того, что

Теперьцикл while:

while i < int(len(range(1, n+1))):
   if (n/i).is_integer():
       z.append(i)
       # i=i+1 does not go inside if statement
   i += 1

Теперь вам нужно увеличить i, но если это увеличение происходит только при выполнении условий if, то если условие if не выполняетсясобираются застрять в том же цикле i.Также попробуйте использовать i += 1 означает то же самое

0 голосов
/ 19 сентября 2018

Вы увеличиваете итерируемую переменную i внутри оператора if, поэтому переменная никогда не увеличивается, зацикливаясь на бесконечном цикле.

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

Перемещение приращения i одного блока идентификации влево (внутри while вместо for) будет прекрасно работать

0 голосов
/ 19 сентября 2018

Код, адаптированный с https://www.programiz.com/python-programming/examples/prime-number

Вам не нужно проверять до num, и вы можете перейти к 2 на 2, если у вас нет базы данных простых чисел

import math
#num = 437
if num > 1:
    # check for factors
    for i in range(2, int(math.ceil(math.sqrt(num))), 2):
        if (num % i) == 0:
            print(num, "is not a prime number")
            print(i, "times", num // i, "is", num)
            break
    else:
        print(num, "is a prime number")

# if input number is less than
# or equal to 1, it is not prime
else:
    print(num, "is not a prime number")
0 голосов
/ 19 сентября 2018

i = i + 1 ничего не делает в вашем цикле for, поскольку значение i перезаписывается следующим значением итератора;фактически цикл for выполняет i = i + 1 для вас на каждую итерацию, независимо от того, делит ли i n.Вы должны сделать то же самое в цикле while:

while i < n + 1:
    if (n/i).is_integer():
        z.append(i)
    i = i + 1
...