If / else indentação adequada dentro enquanto loop

Comecei a aprender programação com o Python algumas semanas e estou tendo alguns problemas. O código a seguir é um pequeno programa que verifica se há um número par em uma lista, se ele encontrar o primeiro número par, ele quebra o loop:

numbers = [1, 3, 5] position = 0 while position < len(numbers): number = numbers[position] if number % 2 == 0: print('Found even number', number) break position += 1 else: # break not called print('No even number found') 

Isso imprime o erro:

 File "test.py", line 11 else: # break not called ^ SyntaxError: invalid syntax 

Isso é um problema de indentação, se eu remover a aba antes de “else” e então alinhá-lo com “while” o programa funciona muito bem:

 while position < len(numbers): number = numbers[position] if number % 2 == 0: print('Found even number', number) break position += 1 else: print('No even number found') # Prints: No even number found 

Minha pergunta é: por que ‘else’ precisa estar alinhado com ‘while’ em vez de estar alinhado com ‘if’ dentro do loop?

Isso é tudo que eu quero conhecer caras! Thanx antecipadamente!

Quando você remove o recuo, você está usando um bloco while: else. O else está sendo anexado ao while, o que significa que ele será executado se a condição while for falsa.

 while True: ##some looping code else: ##code to run when while is false 

Quando você recuar essa linha de código, você anexa o else a se fizer um bloco if: else. Neste caso, outro é executado quando if é falso.

 if True: ##code to run if true else ##code to run if false 

Blocos de código em python seguem o mesmo recuo. Como “else” faz parte do bloco “while”, ele precisa estar na mesma posição de tabulação para funcionar e, olhando para o seu código, eu diria que o while: else block é o que você pretendia. 🙂

Tente assim:

 numbers = [1, 3, 5] position = 0 while position < len(numbers): number = numbers[position] if number % 2 == 0: print('Found even number', number) break else: # break not called print('No even number found') position += 1 

Aqui está o problema. Existem dois tipos de instruções else neste caso. Se você alinhar a instrução else com while , a instrução else será executada quando a condição do loop while se tornar falsa.

Em seu código, a instrução else é executada quando a position < len(numbers) não é verdadeira.

Além disso, o problema de syntax está ocorrendo apenas porque você tem uma linha de código entre as instruções if e else , que é position += 1

Se você quiser usar uma instrução else para sua instrução if (não para a instrução while como sugeri no início), você deve mover essa linha de código entre if e else .

Tente isto:

 while position < len(numbers): number = numbers[position] if number % 2 == 0: print('Found even number', number) break else: print('No even number found') position += 1 

Espero que isto ajude.