2012-01-16 7 views
7

Tengo la sensación de que me falta algo bastante simple, pero aquí, en este una función:sintaxis no válida en bucle "para el elemento en 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 

estoy consiguiendo el error:

for item in L: 
       ^
SyntaxError: invalid syntax 

Para completar toda mi programa tiene el siguiente aspecto:

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() 

estoy usando Python 2.7.1. Tengo un punto y coma después del bucle for, la función primes(n) funciona, tengo la sensación de que probablemente sea algo estúpido, pero no puedo entender qué es lo que está causando esta sintaxis no válida.

+0

paréntesis en la línea 'L = ...' –

Respuesta

13

se echa en falta un paréntesis de cierre en la línea antes:

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

Vea como no llegamos a 0 en el "recuento de anidación" debajo de la línea?

+0

Dispara. Sabía que era algo simple. Muy avergonzado. Jaja. Gracias. – Dair

+0

Solo me gustaría comentar: cometí otros dos errores (que descubrí más tarde): 'b = 2n * (n + 1)' debería ser 'b = 2 * n * (n + 1)' también, lo necesitaba para inicializar trillizos, a, b, c y n de manera diferente. – Dair

0

hay un error en la línea antes de que:

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

Tienes 3 parens abiertas, pero sólo dos parens de cierre.

0

el error está en la línea de arriba - que se está perdiendo un corchete de cierre:

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

Te falta un paréntesis:

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

Esto me pasa todos los tiempos, se solo necesitaba mirar la línea anterior.

Cuestiones relacionadas