Pergunta

Eu estou seguindo o tutorial python em seu site e atualmente estou no intervalo continuar seção. Eu apenas tentei este código de exemplo.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x
...             break
...     else:
...         # loop fell through without finding a factor
...         print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

E em vez de cuspir o que diz acima eu recebo

3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Parece-me que ele continua a funcionar dentro de loop, mas por que o tutorial não levar isso em conta? É ultrapassada para a compilação mais recente intérprete (eu estou correndo xubuntu jaunty)?

Eu era capaz de corrigi-lo adicionando a linha

     else:
...                     if n != y:
...                             print n, 'is a prime number'
...                             y = n

mas eu estou preocupado este pode ser má prática de codificação. Obrigado por sua ajuda.

Foi útil?

Solução

A saída que você mostra contém ten vezes a string " x é um número primo". No entanto, esta string é impresso na cláusula else do circuito interno, e é como tal executadas , no máximo, uma vez para cada execução do loop interno.

Uma vez que os executa loop externo oito iterações, " x é um número primo" não podem ser impressas mais de oito vezes. Assim, a saída que você exibir não pode ser provocada pelo código mostrado.

Conclusão : algo é suspeito. Você pode mostrar o código como você executa-lo?


Edit: resolvido

!

Você recuado incorretamente a cláusula else, de modo que Python interpretado como pertencendo a declaração if. Python trata um guia como 8 espaços. Talvez seu editor exibe abas como 4 espaços. Dessa forma, você pode ter perdido esse bug. Como por PEP 8 , por favor não misture tabulações e espaços, e de preferência usar quatro espaços para recuar seu código.

>>> for n in range(2, 10):
...     for x in range(2, n):
...         if n % x == 0:
...             print n, 'equals', x, '*', n/x 
...             break
...         else:
...             # loop fell through without finding a factor
...             print n, 'is a prime number'
... 
3 is a prime number
4 equals 2 * 2
5 is a prime number
5 is a prime number
5 is a prime number
6 equals 2 * 3
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
7 is a prime number
8 equals 2 * 4
9 is a prime number
9 equals 3 * 3

Outras dicas

Meu melhor palpite é que seu 'else:'. Afirmação não está devidamente recuadas, em seguida, o resultado é lógico, verifique se recuo de você outra pessoa está no nível com 'para x'

i. você usa:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
        else:
            print(n, 'is a prime')

em vez de:

for n in range(2,10):
    for x in range(2,n):
        if n%x == 0:
            print(n, '=', x, '*', n/x)
            break
    else:
        print(n, 'is a prime')

Você pode precisar atualizar seu interpretador Python.

Este código é executado corretamente para mim (aviso Python número da versão):

Python 2.6.1 (r261:67515, Dec  6 2008, 16:42:21) 
[GCC 4.0.1 (Apple Computer, Inc. build 5370)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> for n in range(2, 10):
...      for x in range(2, n):
...          if n % x == 0:
...              print n, 'equals', x, '*', n/x
...              break
...      else:
...          # loop fell through without finding a factor
...          print n, 'is a prime number'
... 
2 is a prime number
3 is a prime number
4 equals 2 * 2
5 is a prime number
6 equals 2 * 3
7 is a prime number
8 equals 2 * 4
9 equals 3 * 3

Eu acho que você tem travessões errado. Se eu tomar o seu código, e recuar a outra pessoa para que ele está sob o comando if, eu recebo exatamente o resultado que você está recebendo.

O código a seguir reproduz sua saída,

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
        else:
            # loop fell through without finding a factor
            print n, 'is a prime number'

enquanto

for n in range(2, 10):
    for x in range(2, n):
        if n % x == 0:
            print n, 'equals', x, '*', n/x
            break
    else:
        # loop fell through without finding a factor
        print n, 'is a prime number'

faz o que você quer fazer.

Observe o diferente no recuo da pessoa.

Eu pensei que else deve sempre estar alinhada com if. Isso é o que eu li. Mas neste código gerador de número primo, a única maneira de obter os números primos escrito uma vez, está alinhando else com for x. Então, eu não tenho nenhuma explicação para tal identation. Embora eu estou apenas começando a aprender Python.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top