Instruções e sequenciação de instruções
Um programa em Ptyhon é em geral uma sequência de comandos e o interpretador de Python executa o mesmo comando a comando. Mais em concreto um programa consiste numa sequência de definições seguida de uma sequência de instruções, ou em notação BNF:
<programa> ::= <definição>* <sequência de instruções>
Veremos as definições mais tarde, consideremos para já apenas sequências de instruções, e em particular os mecanismos de controlo da ordem de execução das instruções.
Os dois tipos de controlo fundamentais são a sequenciação e o salto, os quais existem também na linguagem máquina. O Python como linguagem de alto nível oferece também outras estruturas de controlo, nomeadamente a selecção e a repetição.
A sequenciação é a estrutura de controlo mais simples e determina simplesmente que as instruções são executadas pela ordem em que aparecem no programa. Em Python, numa sequenciação de instruções, estas surgem linhas consecutivas. Assumindo que o símbolo terminal NEWLINE denota a mudança de linha, temos em notação BNF:
<sequência de instruções> ::= <instrução> NEWLINE | <instrução> NEWLINE <sequência de instruções>
Exemplo de programa com uma sequência de instruções:
valor = float(input('Valor? '))
tanb = float(input('TANB (%)? '))
juros = valor*tanb/100
print('Juros:', juros)Se escrevermos este programa no ficheiro juros.py, podes executar o mesmo da seguinte forma?
[aplf@darkstar fp]$ python3 juros.py Valor? 40000 TANB (%)? 0.5 Juros: 200.0 [aplf@darkstar fp]$
Num programa em Python as linhas vazias podem ser entendidas como instruções vazias, caso em que o interpretador não realiza qualquer acção e passa à próxima linha, i.e., instrução.
Execução condicional
A execução condicional é uma das estruturas de controlo mais utilizadas e permite decidir, durante a execução do programa, se uma sequência de instruções deve ou não ser executada.
A instrução if permite a selecção entre duas ou mais alternativas. Sintaxe em notação BNF:
<instrução if> ::=
if <condição>: NEWLINE
<bloco de instruções>
<outras alternativas>*
{<alternativa final>}
<outras alternativas> ::=
elif <condição>: NEWLINE
<bloco de instruções>
<alternativa final> ::=
else: NEWLINE
<bloco de instruções>
<bloco de instruções> ::=
INDENT <sequência de instruções> DEDENT
<condição> ::= <expressão>Em que INDENT corresponde à indentação de todas as instruções no bloco e DEDENT ao recuo da indentação após a última instrução no bloco. A condição é em geral uma expressão que toma um valor lógico, embora possa ser uma qualquer expressão se tivermos em conta a conversão automática para valores lógicos.
Exemplo:
if idade < 18:
print('Jovem')
else:
print('Maior')Notar a indentação.
Outro exemplo:
x = int(input('Introduza um número inteiro: '))
if x < 0 and x%2 == 0:
print(x, 'é negativo e par')
elif x < 0:
print(x, 'é negativo e ímpar')
elif x%2 == 0:
print(x, 'é um número par')
else:
print(x, 'é um número ímpar')Repetição
Em programação é também frequente repetir instruções em função dos dados de entrada ou em função de determinadas condições durante a execução de um programa. Estamos naturalmente a falar de ciclos.
Um ciclo é caracterizado por uma guarda, ou seja uma condição, e pelo corpo do ciclo, ou seja um bloco de instruções. Em cada iteração, antes de se executar o corpo do ciclo, a condição de guarda é avaliada e apenas se passa à execução do corpo se essa condição for verdade. É importante que o ciclo termine, ou por interrupção do ciclo a partir do corpo do mesmo, ou garantindo que ao fim de um número finito de passos a condição de guarda é falsa. A existência de ciclos que não terminam, i.e., ciclos infinitos, é um dos erros semânticos mais comuns.
Em Python existem duas instruções que permitem especificar ciclos, a instrução while e a instrução for. Veremos agora em detalhe a instrução while.
A instrução while permite executar um bloco de instruções enquanto uma dada condição for verdadeira. Note-se que, se a condição for falsa à partida, então o bloco de instruções não é executado de todo. Note-se também que o número de iterações depende inteiramente do valor que a condição de guarda toma em função da execução das instruções no bloco, não sendo possível determinar a priori o número de iterações. A sintaxe desta instrução é a seguinte, em notação BNF:
<instrução while> ::=
while <condição>: NEWLINE
<bloco de instruções>Para que o ciclo while termine, é necessário que as instruções no corpo do ciclo, i.e., no bloco de instruções, modifiquem o valor da condição para falso ao fim de um número finito de passos. Em alternativa o ciclo while pode ser interrompido se no bloco de instruções for executada a instrução break, cuja sintaxe em notação BNF é a seguinte:
<instrução break> ::= break
Quando a instrução break é executada, o ciclo cujo corpo inclui a instrução em questão é interrompido, independentemente do valor da condição de guarda.
Exemplo:
soma = 0
x = float(input('Introduza um número (negativo para terminar): '))
while x >= 0:
soma = soma + x
x = float(input('Introduza um número (negativo para terminar): '))
print(soma)Outro exemplo:
n = int(input('Introduza um número inteiro: '))
d = 2
print('Os pares de divisores de', n, 'são')
print(1,'x',n)
while True:
if d > n//d:
break
elif n%d == 0:
print(d, 'x', n//d)
d = d + 1