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