comandos


Contrôle da execução do programa

Os comandos centrais do Python são muito parecidos com os pseudo-comandos que vimos antes na parte de pseudo código. Isto foi deliberado, visando tornar mais natural sua tradução de pseudo código para Python.
Para relembrar, estes eram os pseudo-comandos vistos então:
  1. Atribuição: x = 123
  2. Decisão: se x então: (lista indentada com outros comandos para executar neste caso)
  3. Decisão com alternativa: se x então: (lista de comandos) senão: (outra lista de comandos)
  4. Repetição indefinida: enquanto condição: (lista de comandos)
  5. Repetição um número de vezes: para cada x numa lista: (lista de comandos)
  6. Quebra de loop de repetição: break
Os comandos básicos de Python são muito parecidos.

atribuição

In [1]:
x = 123     # variável x recebe o valor 123
x
Out[1]:
123
In [2]:
x,y,z = 4,5,6     # podemos atribuir diversas variáveis num só passo
print(x,y,z)
4 5 6
In [4]:
a = 11            # modo elegante de trocar os valores de duas variáveis, coisa só (?) de Python mesmo
b = 22
print(a,b)
b,a = a,b
print(a,b)
11 22
22 11
In [5]:
L = list(range(1,11))     # inicializar L com lista de valores numéricos
L
Out[5]:
[1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
In [6]:
L = [x for x in range(1,10)]       # mas usar comprehension é mais Pythonista
L
Out[6]:
[1, 2, 3, 4, 5, 6, 7, 8, 9]

comandos de decisão

Os comandos de decisão no Python são o if e seus casos com alternativas.
A sintaxe básica deste comando é if condição: (lista indentada de comandos). Se a condição for verdadeira a lista de comandos passa a ser executada.
A decisão com alternativa é assim:
if condição: (lista indentada de comandos) else: (outra lista de comandos) Neste caso se a condição for falsa, a lista de comandos após o else é que deve ser executada.
Note que após executar uma lista de comandos a execução do programa continua após o else (e a sua outra lista de comandos).

Neste ponto vale ressaltar a importância sintática da indentação de comandos no Python.
Como o interpretador sabe onde começa e termina uma determinada lista de comandos ("bloco" de comandos)?
O que torna isto enrolado é que blocos podem ocorrer dentro de outros blocos e assim por diante. Em outras linguagens como C ou Java usa-se chaves {} para englobar listas de comandos que devem ser tratadas como um todo, ou bloco.
No Python a sintaxe é muito mais leve, não existem chaves demarcadoras de blocos. Um bloco é simplesmente o conjunto de comandos que estão alinhados verticalmente. Um bloco dentro de outro é definido dando uma indentação adicional nos comandos e assim por diante.
if x < 9:             # bloco externo contendo o if e o else
    x = x + 1               # bloco interno executado se condição x < 9 for verdadeira
    l = list('ababa')
else:                 # bloco externo contendo o if e o else
    x = 0                   # bloco interno executado se condição x < 9 for falsa
    z = y + 2

outro = 354           # bloco externo do if, else e comandos seguintes
De quantos espaçoes deve ser a identação de cada bloco? Não há uma regra, o default costuma ser 4 espaços ou o que for equivalente a uma tabulação (tab), mas deve ser consistente. Use o tab para indentar.
In [8]:
x = 0
if x < 9:
    x = x + 1
    print('x é menor que 9')   # voce pode imprimir strings. Aliás, pode imprimir qualquer objeto.
x é menor que 9
In [9]:
if x > 0:
    print('x é maior que zero')
    x = x + 1
else:
    print('x é igual ou menor que zero')
x é maior que zero
Existe ainda a decisão múltipla, onde queremos efetuar ações dependendo de diversas condições testadas em cadeia (nota: a ordem dos teste importa!):
In [10]:
if x == 0:
    print('x igual a zero')
elif x == 1:                 # elif significa 'else if' e permite testar diversas alternativas em sequência
    print('x igual a 1')
elif x == 2:
    print('x igual a 2')
else:                         # else é usado como o caso final: não continuam alternativas após o else
    print('caso imprevisto!')
x igual a 2

repetição um número de vêzes

O comando Python que equivale ao nosso pseudo-comando "para cada" é o for condição: (lista indentada de comandos).
In [11]:
for x in range(1,4):            # percorre os numeros de 1 a 3 e imprime os
    print(x)
1
2
3
In [12]:
L = [1,4,7,9,5,2,1,8]            # imprime os numeros pares desta lista de numeros
for n in L:
    if n % 2 == 0:
        print(n)
4
2
8
In [13]:
cor = ['branco', 'azul','verde','vermelho','preto']     # a função len() dá o comprimento de um string
for c in cor:
    n = len(c)
    print(c,n)
branco 6
azul 4
verde 5
vermelho 8
preto 5
In [15]:
s = 'abracadabra'          # quantas vezes a letra 'a' aparece no string?
soma = 0
for c in s:
    if c == 'a':
        soma = soma + 1
print(soma)
5
Vejamos um exemplo mais complexo. No exemplo vamos receber um texto como um string, separá-lo em palavras numa lista (isto é feito pelo método split() do tipo de dados string), aí percorrer esta lista examinando cada palavra e seu comprimento. Se o comprimento for o maior encontrado até então, lembra a palavra e o comprimento e continua o procedimento. No final da lista imprime a maior palavra e seu tamanho.
In [19]:
texto = '''Falhei em tudo.
Como não fiz propósito nenhum, talvez tudo fosse nada.
A aprendizagem que me deram,
Desci dela pela janela das traseiras da casa.'''
words = texto.split()                               # split() quebra um string nos whitespaces
print(words)                                        # words é a lista de palavras do texto dado

# agora quero achar a palavra mais comprida deste texto
# seja maximo o comprimento da maior palavra encontrada em cada passo
maximo = 0
maior_palavra = ''
for wd in words:
    n = len(wd)
    if n > maximo:
        maximo = n
        maior_palavra = wd
print(maximo, maior_palavra)
['Falhei', 'em', 'tudo.', 'Como', 'não', 'fiz', 'propósito', 'nenhum,', 'talvez', 'tudo', 'fosse', 'nada.', 'A', 'aprendizagem', 'que', 'me', 'deram,', 'Desci', 'dela', 'pela', 'janela', 'das', 'traseiras', 'da', 'casa.']
12 aprendizagem

break

Com os dados do exemplo anterior vamos verificar se uma palavra dada ocorre no texto. Para isto faremos a busca e ao encontrar a palavra (se encontrar) usamos o comando break para pular fora da repetição. Experimente mudar a palavra.
In [22]:
pal = 'me'           # palavra a ser procurada no texto
achei = False        # variavel com valor booleano True ou False. Indica se achamos a palavra no texto
for w in words:
    if w == pal:
        achei = True
        break
if achei:
    print('Achei a palavra')
else:
    print('Não consta')
Achei a palavra
Agora um exemplo com um for dentro do bloco de outro. Dada uma lista de strings achar o string que tem mais repetições do digito 7.
In [23]:
lst = ['123','7','229977','8765', '17772', '345']
st = ''            # o string com mais 7s
max = 0            # maior numero de 7 achado
for s in lst:      # percorre todos strings da lista dada
    conta = 0            # numero de 7 em s
    for c in s:          # neste loop percorremos os caracteres do string s em questão
        if c == '7':
            conta = conta + 1
    if conta > max:      # Agora compara a contagem com o maximo já achado
        max = conta
        st = s
print(max, st)
3 17772

Repetição indefinida

O comando Python que equivale ao nosso "enquanto" é o while condição: (lista indentada de comandos). Enquanto condição for verdadeira o bloco é repetido.
Um comando de entrada do Python é o input() que lê um string digitado pelo usuário e retorna-o quando for digitado enter. O operador != é usado para verificar se dois termos de uma expressão são diferentes. Assim:
123 != 456    # o valor da expressão é True pois são termos diferentes
78 != 78
In [2]:
s = input()         # enquanto não for digitado 'q' continue lendo entrada por teclado
while s != 'q':
    s = input()
print('Fim.')       # se chegou aqui então um 'q' foi entrado
a
c
d
q
Fim.

Alguns exemplos

Vamos codificar em Python os exercícios propostos nas listas 1 e 2.
Atenção: a função input() retorna um string mesmo que você digite um número. Para converter de string numérico em número use a função int() para inteiros ou float() para decimais.
Como ainda não vimos definição de funções, navegação em diretórios nem leitura de arquivos vamos pular alguns exercícios. Por enquanto.
ex 1.1 Leia um número (use a função input). Calcule a soma dos quadrados de todos numeros inteiros de 1 até o numero lido. Imprima esta soma.
In [5]:
sn = input()    # le string numérico
n = int(sn)     # converte para número
soma = 0
for i in range(1, n + 1):     # percorre os numeros de 1 a n inclusive
    soma = soma + i * i      # acumula o quadrado de i em soma
print('Soma dos quadrados =', soma)
10
Soma dos quadrados = 385
ex 1.4 Leia um string entrado pelo usuário e procure sub strings formados por letras 'a' consecutivas. Conte o tamanho de cada sub string e imprima o tamanho do maior deles.
Comentário: este exemplo contém uma pegadinha sutil. Precisamos controlar cuidadosamente o início e o fim de cada segmento de 'a' consecutivos. Os eventos que devemos detetar são:
  1. estamos fora de segmento
  2. iniciou um segmento
  3. estamos dentro de um segmento
  4. terminou um segmento
In [9]:
s = 'ababbnaaameirtooaaaaaaaoogaaaaheaaiiiinuaaaaaaattttaaaaaaaauuumaaa'   # o string fornecido
maximo = 0              # tamanho do maior segmento de 'a'
max_seg = ''            # o maior segmento de 'a's
em_seg = False         # esta variavel será True se um segmento de 'a' esta sendo percorrido
conta = 0               # comprimento do segmento corrente
seg = ''                # o segmento de 'a's corrente
for c in s:
    if c == 'a':              
        if not em_seg:  
            em_seg = True         # inicio de um segmento
            conta = 1
            seg = 'a'
        else:
            conta = conta + 1   # estamos num segmento, então conta mais um 'a'
            seg = seg + 'a'
    else:                   # caracter lido não é um 'a'
        if em_seg:
            em_seg = False         # fim de um segmento
            if conta > maximo:
                maximo = conta
                max_seg = seg
            seg = ''            # reinicializa estas variáveis a cada fim de segmento
            conta = 0
print('Maior segmento encontrado =', max_seg, maximo)
Maior segmento encontrado = aaaaaaaa 8
Chega por hoje. Na próxima vamos resolver os exercícios da lista 2 e introduzir o poderoso conceito de função, ponto muito importante do Python.

No comments:

Post a Comment