Problema usando o comando pausa em Python tutorial
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.
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.