2012-01-16 2 views
7

У меня есть чувство, что я что-то очень простое, но здесь не хватает, в этой одной функции:Неверный синтаксис «для элемента в L» петли

def triplets(perimeter): 

    triplets, n, a, b, c = 0 #number of triplets, a, b, c, sides of a triangle, n is used to calculate a triple 
    L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 

    for item in L: #iterate through the list of primes 
     if perimeter % item == 0: #check if a prime divides the perimeter 
      n = perimeter/item 
      a = n**2 - (n+1)**2 #http://en.wikipedia.org/wiki/Pythagorean_triple 
      b = 2n*(n+1) 
      c = n**2 + n**2 
      if a+b+c == perimeter: #check if it adds up to the perimeter of the triangle 
       triplets = triplets + 1 

    return triplets 

Я получаю сообщение об ошибке:

for item in L: 
       ^
SyntaxError: invalid syntax 

Для полноты всей моей программы выглядит следующим образом:

import math 

def primes(n): #get a list of primes below a number 
    if n==2: return [2] 
    elif n<2: return [] 
    s=range(3,n+1,2) 
    mroot = n ** 0.5 
    half=(n+1)/2-1 
    i=0 
    m=3 
    while m <= mroot: 
     if s[i]: 
      j=(m*m-3)/2 
      s[j]=0 
      while j<half: 
       s[j]=0 
       j+=m 
     i=i+1 
     m=2*i+3 
    return [2]+[x for x in s if x] 

def triplets(perimeter): 

    triplets, n, a, b, c = 0 #number of triplets, a, b, c, sides of a triangle, n is used to calculate a triple 
    L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 

    for item in L: #iterate through the list of primes 
     if perimeter % item == 0: #check if a prime divides the perimeter 
      n = perimeter/item 
      a = n**2 - (n+1)**2 #http://en.wikipedia.org/wiki/Pythagorean_triple 
      b = 2n*(n+1) 
      c = n**2 + n**2 
      if a+b+c == perimeter: #check if it adds up to the perimeter of the triangle 
       triplets = triplets + 1 

    return triplets 

def solve(): 
    best = 0 
    perimeter = 0 
    for i in range(1, 1000): 
     if triplets(i) > best: 
      best = triplets(i) 
      perimeter = i 
    return perimeter 

print solve() 

Я использую Python 2.7.1. У меня есть точка с запятой после цикла for, работает функция primes(n), у меня есть ощущение, что это, наверное, что-то глупое, но я не могу понять, что именно вызывает этот недействительный синтаксис.

+0

скобка в строке 'L = ...' –

ответ

13

У вас не хватает закрывающей скобки на линии до:

 L = primes(int(math.sqrt(perimeter)) #list of primes to divide the perimeter 
#    ^^  ^  ^^ 
#nesting count 1 2   3   21 

Посмотрите, как мы не достигнем 0 в «вложенности графа» ниже линии?

+0

Стреляй. Я знал, что это просто. Так смущен. Ха-ха. Благодарю. – Dair

+0

Просто хотел бы прокомментировать: Я сделал еще две ошибки (которые я узнал позже): 'b = 2n * (n + 1)' должно быть 'b = 2 * n * (n + 1)' также, мне нужно для инициализации триплетов, a, b, c и n по-разному. – Dair

0

Существует ошибка в строке перед ней:

L = primes(int(math.sqrt(perimeter)) 

У вас есть 3 открытых скобок, но только две закрывающие скобки.

0

Ошибка в строке выше - вы пропустили закрывающую скобку:

L = primes(int(math.sqrt(perimeter))) 
1

Вы упускаете скобку:

L = primes(int(math.sqrt(perimeter))) 
            ^
            | 
           this one 

Это происходит со мной все время, вы просто нужно было посмотреть на линию раньше.