2016-09-15 2 views
0

Итак, у меня есть этот код, и он должен распечатать кортеж со всеми простыми числами в нем. Но вместо этого он просто печатает пустые кортежи ...allPrimes распечатка пустого кортежа Python

Может ли кто-нибудь сказать мне, почему? Я также ДОЛЖЕН ИСПОЛЬЗОВАТЬ АНГЛИЙСКИЙ.

def isPrime(number): 
for i in range(2,int(number**(0.5))+1): 
    if number % i == 0: 
     return False 
    else: 
     return True 


def allPrimes(number): 
    tup=() 
    for i in range(1,number): 
     if isPrime(i) == True: 
      tup += (i,) 
    print(tup) 

allPrimes(26) 

Вот правильный код

def isPrime(number): 
    if number < 2: 
     return False 
    for i in range(2, int(number ** (0.5)) + 1): 
     if number % i == 0: 
      return False 
    return True 



def allPrimes(number): 
    tup=() 
    for i in range(1,number): 
     if isPrime(i) == True: 
      tup += (i,) 
     print(tup) 

allPrimes(26) 
out[1]: (2, 3, 5, 7, 11, 13, 17, 19, 23) 
+0

Я только что внесла некоторые изменения в свой код, и он по-прежнему не работает. – drewteriyaki

+0

Я должен использовать кортеж, это для кампании – drewteriyaki

+0

Обычно лучше использовать 'list' для ее создания. Даже если он должен быть «кортежем» в конце, гораздо быстрее построить «list», а затем конвертировать в «tuple» один раз в конце, чем постоянно создавать новый 'tuple' один элемент дольше. Просто инициализируйте 'ret = []', измените 'tup + = (i,)' на 'ret.append (i)', и когда вы 'return' /' print', выполните 'print (tuple (ret)), 'или' return tuple (ret) 'для преобразования. – ShadowRanger

ответ

2

Функция isPrime() начинается с 1. Каждое целое число равномерно делится на 1, поэтому оно всегда возвращает False. Начните с 2 вместо.

def isPrime(number): 
    if number < 2: 
     return False 
    for i in range(2, int(number ** (0.5)) + 1): 
     if number % i == 0: 
      return False 
    return True 

Кроме того, ваши allPrimes, вероятно, следует использовать список, а не кортеж, и вы можете использовать только isPrime(i) вместо isPrime(i) == True, но он будет работать так, как она есть.

+0

Не совсем верно ... это вернет True для 1 – wim

+0

Я только что сделал thos изменения, но он говорит, что 3 не является простым числом – drewteriyaki

+0

Нет, это не так. – kindall

1

Это потому, что ваша функция IsPrime не работает.

number % 1, то есть «остаток при делении на 1» всегда будет равен нулю для целых чисел.

1

Есть несколько вопросов, в вашем коде:

1) В isPrime возвращается True на неправильной линии

2) Вы печатаете tup вне области видимости функции

3) Вы не обработка случая 1isPrime)

4) Вы используете tuple для хранения простых чисел, list это ставка тер; он намного эффективнее.

5) Используйте змейку для имен функций в Python.

внесения изменений:

def is_prime(number): 
    if number < 2: 
     return False 

    for i in range(2,int(number**(0.5))+1): 
     if number % i == 0: 
      return False 

    return True 

def all_primes(number): 
    my_primes = [] 
    for i in range(1,number): 
     if is_prime(i): 
      my_primes.append(i) 
    return my_primes 

if __name__ == "__main__": 
    print all_primes(40) 
+0

Я предлагаю различать между реализациями/логическими ошибками и соглашениями good/Python (пункты 1-4 и 5), поэтому OP не путается, что имена имеют значение. Но, может быть, я просто слишком придирчив - в этом случае извините ;-) – quapka

0

Потому что в первой итерации, если number % i != 0: число является простым, вы должны вернуть True в конце итерации перерыва он, если `число% я == 0:

def isPrime(number): 
    res = True 
    if number < 2: 
     res = False 
    else: 
     for i in range(2,int(number**0.5)+1): 
      if number % i == 0: 
       res = False 
       break 
    return res 
+0

Пожалуйста, проверьте это. – Zety