Pular para o conteúdo principal

02 Strings, condicionais e repeticções

Variáveis de tipo string

Variáveis do tipo string armazenam cadeias de caracteres.

Para se representar uma string em Python, utiliza-se aspas duplas ou simples:

"Esta é uma cadeia de caracteres"
'Esta também é!'

O tamanho de uma string é dada pelo número de caracteres. Isso pode ser obtido com a função len:

len("A")
len("AB")
len("ABC")
len("A B")
len("A B C ")

É possível acessar os caracteres indexando o string:

In [32]: s = "ABCDEF"

In [33]: s[0]
Out[33]: 'A'

In [34]: s[1]
Out[34]: 'B'

In [35]: s[2]
Out[35]: 'C'

In [36]: s[3]
Out[36]: 'D'

In [37]: s[5]
Out[37]: 'F'

In [38]: s[6]
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-38-c4bc18d4aa1b> in <module>
----> 1 s[6]

IndexError: string index out of range

Operações com strings

Concatenação
In [39]: s = "ABC"

In [40]: s1 = s + "D"

In [41]: s1
Out[41]: 'ABCD'

Composição

In [48]: idade = 10

In [49]: "João tem %d anos!" % idade
Out[49]: 'João tem 10 anos!'
  • %d para números inteiros
  • %s para strings
  • %f para números de ponto flutuante
In [55]: idade = 22

In [56]: "[%d]" % idade
Out[56]: '[22]'

In [57]: "[%03d]" % idade
Out[57]: '[022]'

In [58]: "[%3d]" % idade
Out[58]: '[ 22]'

In [59]: "[%-3d]" % idade
Out[59]: '[22 ]'

Para formatar pontos flutuantes (float)

In [64]: idade = 22.1

In [65]: "[%f]" % idade
Out[65]: '[22.100000]'

In [66]: "[%5f]" % idade
Out[66]: '[22.100000]'

In [67]: "[%5.2f]" % idade
Out[67]: '[22.10]'

In [68]: "[%5.3f]" % idade
Out[68]: '[22.100]'

In [69]: "[%5.1f]" % idade
Out[69]: '[ 22.1]'

In [70]: "[%10.2f]" % idade
Out[70]: '[     22.10]'

E agora podemos combinar tudo:

In [71]: nome = 'João'

In [72]: idade = 22

In [73]: grana = 51.34

In [74]: 

In [74]: "%s tem %d anos e R$%f no bolso" % (nome, idade, grana)
Out[74]: 'João tem 22 anos e R$51.340000 no bolso'

In [75]: "%s tem %d anos e R$%5.2f no bolso" % (nome, idade, grana)
Out[75]: 'João tem 22 anos e R$51.34 no bolso'

Existe um jeito mais "moderno" de se escrever isso:

In [85]: nome = 'João'

In [86]: idade = 22

In [87]: grana = 51.10

In [88]: "{} tem {} anos e R${} no bolso".format(nome, idade, grana)
Out[88]: 'João tem 22 anos e R$51.1 no bolso'

In [89]: "{} tem {} anos e R${:5.2f} no bolso".format(nome, idade, grana)
Out[89]: 'João tem 22 anos e R$51.10 no bolso'

In [93]: "{:12s} tem {} anos e R${:5.2f} no bolso".format(nome, idade, grana)
Out[93]: 'João         tem 22 anos e R$51.10 no bolso'

In [94]: "{:<12s} tem {} anos e R${:5.2f} no bolso".format(nome, idade, grana)
Out[94]: 'João         tem 22 anos e R$51.10 no bolso'

In [95]: "{:>12s} tem {} anos e R${:5.2f} no bolso".format(nome, idade, grana)
Out[95]: '        João tem 22 anos e R$51.10 no bolso'

Mais moderno ainda:

In [96]: nome = 'João'

In [97]: idade = 22

In [98]: grana = 51.10

In [99]: f"{nome} tem idade {idade} anos e R${grana} no bolso."
Out[99]: 'João tem idade 22 anos e R$51.1 no bolso.'

In [100]: f"{nome} tem idade {idade} anos e R${grana:5.2f} no bolso."
Out[100]: 'João tem idade 22 anos e R$51.10 no bolso.'

Fatiamento de strings

In [101]: s = "ABCDEFGHI"

In [102]: s[0:1]
Out[102]: 'A'

In [103]: s[0:0]
Out[103]: ''

In [104]: s[0:3]
Out[104]: 'ABC'

In [105]: s[1:3]
Out[105]: 'BC'

Mas tem de vez em quando você quer ir até o fim ou até certo ponto

In [106]: s[3:]
Out[106]: 'DEFGHI'

In [107]: s[:3]
Out[107]: 'ABC'

Dá até para contar do final da string!

In [110]: s[-2]
Out[110]: 'H'

In [111]: s[0:-2]
Out[111]: 'ABCDEFG'

In [112]: s[-3:]
Out[112]: 'GHI'

In [113]: s[-3:-1]
Out[113]: 'GH'

Gerando nomes de arquivo

Imagina que você queira gerar arquivos numerados que aparecem em ordem no explorer. A primeira tentativa seria fazer a sequência

  • arquivo_1.xyz
  • arquivo_2.xyz
  • ...
  • arquivo_N.xyz

Mas isso não vai funcionar bem! Se N for 12, a coisa vai aparecer da seguinte maneira:

  • arquivo_1.xyz
  • arquivo_10.xyz
  • arquivo_11.xyz
  • arquivo_12.xyz
  • arquivo_2.xyz
  • ...
  • arquivo_9.xyz

Como resolver isso? Exemplo com N=12

  • arquivo_001.xyz
  • arquivo_002.xyz
  • ...
  • arquivo_009.xyz
  • arquivo_010.xyz
  • arquivo_011.xyz
  • arquivo_012.xyz

Como fazer isso? Vamos quebrar o nome do arquivo em partes:

  • Nome base: No exemplo anterior é arquivo_
  • O número
  • ponto
  • extensão
In [9]: base = "arquivo_"
   ...: ext = "txt"
   ...: 
   ...: ndig = 3
   ...: i = 12
   ...: 
   ...: nome = base + f"{10**ndig + i}"[1:] + "." + ext
   ...: print(nome)
arquivo_012.txt

Entrada de dados

Função input lê uma string do terminal.

In [115]: s = input("Digite algo: ")
Digite algo: 1234

Muitas vezes queremos ler algo e converter para um número, inteiro ou float.

In [118]: anos = int(input("Entre com tua idade: "))
Entre com tua idade: 46

In [119]: anos
Out[119]: 46

In [120]: meupi = float(input("Entre com o valor aproximado de pi: "))
Entre com o valor aproximado de pi: 3.14

In [121]: meupi
Out[121]: 3.14

Exercício 1

Tente concatenar uma string com um número inteiro

Exercício 2

Faça um programa que peça dois números inteiros. Imprima na tela a soma desses números

Exercício 3

Escreve um programa que leia um valor em metros e o exiba na tela em milímetros.

Exercício 4

Escreva um programa que leia uma quantidade de dias, horas e minutos e calcule o total de segundos

Exercício 5

Escreve um programa que converta a temperatura digitada em °C em °F.

Condições

Vimos as expressões relacionais e condicionais. Temos os elementos básicos para fazer decisões. Agora veremos como usar estas expressões para se tomar decisões. Tomar decisão aqui quer dizer executar condicionalmente partes do código.

if

if <condição>:
   # Executar o bloco indentado se a condição for verdadeira
   # Blocos são separados por identação!!!
In [5]: x = 10
   ...: 
   ...: if x > 5: # Repare nos dois pontos!
   ...:     print(f"{x} é maior que 5!") # Indentação!!!
   ...: # Fim do bloco indentado!
   ...: print("Saiu do if!")
10 é maior que 5!
Saiu do if!
In [6]: x = 1
   ...: 
   ...: if x > 5: # Repare nos dois pontos!
   ...:     print(f"{x} é maior que 5!") # Indentação!!!
   ...: # Fim do bloco indentado!
   ...: print("Saiu do if!")
Saiu do if!

Esse exemplo não é muito útil né? Qual o problema? *Nós sabemos o valor de x antes de executar o if! A gente sabe o que deve ser executado. Isso é apenas um exemplo para mostrar a sintaxe e como funciona. Num caso real, não conhecemos o valor de x: o valor pode vir do usuário, um banco de dados, internet ou algum instrumento ligado ao computador. O exemplo a seguir introduz este aspecto em um exemplo maior:

In [7]: a = int(input("Primeiro valor: "))
   ...: b = int(input("Segundo valor: "))
   ...: 
   ...: if a>b:
   ...:     print("O primeiro valor é maior!")
   ...: 
   ...: if b>a:
   ...:     print("O segundo valor é maior!")
   ...: 
Primeiro valor: 1
Segundo valor: 2
O segundo valor é maior!

E se mudarmos os valores?

In [8]: a = int(input("Primeiro valor: "))
   ...: b = int(input("Segundo valor: "))
   ...: 
   ...: if a>b:
   ...:     print("O primeiro valor é maior!")
   ...: 
   ...: if b>a:
   ...:     print("O segundo valor é maior!")
   ...: 
Primeiro valor: 2
Segundo valor: 1
O primeiro valor é maior!

Exercício 6

O que acontece se a == b? Teste!

Vamos usar um outro exemplo:

In [10]: idade = int(input("Digite a idade do seu carro: "))
    ...: if idade <= 3:
    ...:    print("Seu carro é novo.")
    ...: 
    ...: if idade > 3:
    ...:    print("Seu carro é velho.")
    ...: 
Digite a idade do seu carro: 4
Seu carro é velho.

Outro valor:

In [11]: idade = int(input("Digite a idade do seu carro: "))
    ...: if idade <= 3:
    ...:    print("Seu carro é novo.")
    ...: 
    ...: if idade > 3:
    ...:    print("Seu carro é velho.")
    ...: 
Digite a idade do seu carro: 2
Seu carro é novo.

Exercício 7

Escreva um programa que pergunte a velocidade do carro de um usuário. Caso ultrapasse 80 km/h, exiba uma mensagem dizendo que o usuário foi multado. Nesse caso, exiba o valor da multa cobrando R$ 5 por km/h acima de 80 km/h.

Exercicio 8

Escreva um programa que lê três números e imprima o valor do maior

else

No exemplo da idade do carro, você tem duas condições complementares.

  • No primeiro if, trata do carro novo: idade <= 3
  • Segundo if: idade > 3

Repare que

In [10]: idade = 10

In [11]: (idade <= 3) == (not (idade > 3))
Out[11]: True

In [12]: idade = 1

In [13]: (idade <= 3) == (not (idade > 3))
Out[13]: True

A relação anterior é sempre verdadeira. Este tipo de situação é tão comum que existe algo para facilitar escrever o programa:

if condição:
   # Se a condição for verdadeira
   # Execute este bloco.
else:
   # Caso contrário, execute este bloco.
   # Aqui a condição é falsa!

Exemplo

In [14]: idade=int(input("Entre com a idade do carro: "))
    ...: if idade > 3:
    ...:     print("Seu carro é velho")
    ...: else:
    ...:     print("Seu carro é novo")
    ...: 
Entre com a idade do carro: 10
Seu carro é velho

In [15]: idade=int(input("Entre com a idade do carro: "))
    ...: if idade > 3:
    ...:     print("Seu carro é velho")
    ...: else:
    ...:     print("Seu carro é novo")
    ...: 
Entre com a idade do carro: 1
Seu carro é novo

Como são complementares, então podemos escrever deste jeito:

In [17]: idade=int(input("Entre com a idade do carro: "))
    ...: if idade <= 3:
    ...:     print("Seu carro é novo")
    ...: else:
    ...:     print("Seu carro é velho")
    ...: 
Entre com a idade do carro: 10
Seu carro é velho

In [18]: idade=int(input("Entre com a idade do carro: "))
    ...: if idade <= 3:
    ...:     print("Seu carro é novo")
    ...: else:
    ...:     print("Seu carro é velho")
    ...: 
Entre com a idade do carro: 1
Seu carro é novo

Exercício 9

Brinque com os programas acima entrando diferentes valores

Exercício 10

Escreva um programa que pergunte a distância que um passageiro vai percorrer em km. Calcule o preço da passagem, cobrando R$ 0,50 por km para viagens de até 200 km e R 0,45 para viagens mais longas

Estruturas aninhadas

É possível compor os ifs acima. Voltando ao exemplo da idade do carro, A entrada de carros permite que o usuário entre com números negativos. Idade negativa não faz sentido, nesse caso deve-se informar que houve um erro. O resto é igual.

In [19]: idade=int(input("Entre com a idade do carro: "))
    ...: 
    ...: if idade < 0:
    ...:     print("Acho que há um erro. Idade negativa?")
    ...: else:
    ...:     if idade <= 3:
    ...:         print("Seu carro é novo")
    ...:     else:
    ...:         print("Seu carro é velho")
    ...: 
Entre com a idade do carro: 1
Seu carro é novo

In [20]: 

In [20]: idade=int(input("Entre com a idade do carro: "))
    ...: 
    ...: if idade < 0:
    ...:     print("Acho que há um erro. Idade negativa?")
    ...: else:
    ...:     if idade <= 3:
    ...:         print("Seu carro é novo")
    ...:     else:
    ...:         print("Seu carro é velho")
    ...: 
Entre com a idade do carro: 10
Seu carro é velho

In [21]: idade=int(input("Entre com a idade do carro: "))
    ...: 
    ...: if idade < 0:
    ...:     print("Acho que há um erro. Idade negativa?")
    ...: else:
    ...:     if idade <= 3:
    ...:         print("Seu carro é novo")
    ...:     else:
    ...:         print("Seu carro é velho")
    ...: 
Entre com a idade do carro: -1
Acho que há um erro. Idade negativa?

É possível ter mais casos. Imagine que a existam produtos de diferentes categorias e cada um tenha um preço:

Catogoria Preço
1 10,00
2 18,00
3 23,00
4 26,00
5 31,00

O programa a seguir verifica o preço de acordo com a tabela:

categoria=int(input("Digite a categoria: "))

if categoria == 1:
    preço = 10
else:
    if categoria == 2:
        preço = 18
    else:
        if categoria == 3:
            preço = 23
        else:
            if categoria == 4:
                preço = 26
            else:
                if categoria == 5:
                    preço = 31
                else:
                    print("Categoria errada!")
                    preço = 0

print(f"O preço do produto é: R${preço:6.2f}.")

elif

A quantidade de indentação no programa anterior começa a ficar inconveniente. Não só é chato de escrever mas pode atrapalhar a leitura do código.

Python tem uma solução! elif:

categoria=int(input("Digite a categoria: "))

if categoria == 1:
    preço = 10
elif categoria == 2:
    preço = 18
elif categoria == 3:
    preço = 23
elif categoria == 4:
    preço = 26
elif categoria == 5:
    preço = 31
else:
    print("Categoria errada!")
    preço = 0

print(f"O preço do produto é: R${preço:6.2f}.")

Bem melhor né?

Exercício 11

Escreva um programa que leia dois números e que pergunte qual operação o usuário quer realizar e calcule esta operação. As operações válidas são:

  • soma (+)
  • subtração (-)
  • multiplicação (*)
  • divisão (/)

Exercício 12

Escreva um programa que calcule o preço a pagar pelo fornecimento de energia elétrica. Pergunte a quantidade de kWh conmsumida e o tipo de instalação:

  • R: residências
  • I: indústrias
  • C: comércios

Calcule o preço da conta de luz de acordo com as regras a seguir:

Tipo Faixa (kWh) Preço
Residencial Até 500 R$ 0,40
Acima de 500 R$ 0,65
Comercial Até 1000 R$ 0,55
Acima de 1000 R$ 0,60
Industrial Até 5000 R$ 0,55
Acima de 5000 R$ 0,60

Repetições

Com o que aprendemos até agora dá para fazer algumas coisas. Não muitas mas é um começo. Uma coisa em que o computador é bom é fazer tarefas repetitivas. Olha que interessante: as pessoas em geral não curtem muito as tarefas repetitivas...

Até agora, para repetir algo tínhamos que escrevê-las nós mesmo. Sabe aquela pessoa que deixa o microfone aberto com o cachorro latindo, caminhão de gás latindo e vizinha gritando? Não dá né. Então vamos fazê-la escrever 10 vezes Não vou deixar o microfone aberto na reunião!:

print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")
print("Não vou deixar o microfone aberto na reunião!")

Mas infelizmente com a pandemia e trabalho remoto, a pessoa vai fazer isso no computador e ela sabe usar o recurso copiar e colar. Então não vai ser muito sacrifício...

Que tal mandar ela fazer isso 1000 vezes? Aí pode ser um pouco melhor. Mas a gente não sabe que essa pessoa está aprendendo Python. Então ela escreve o seguinte programinha:

msg = "Não vou deixar o microfone aberto na reunião!"
N = 1000
i = 1
while i <= N:
    print(msg)
    i = i + 1

Temos que reconhecer o esforço...

while é o comando básico de repetição e funciona da seguinte maneira:

while condição:
      # Enquanto a condição acima for verdadeira
      # Execute o bloco indentado aqui

Vamos voltar à solução do nosso intrépido usuário de Python:

  • Temos a variável N que é o número de repetições
  • Temos a variável i que será um contador _ Temos while com a condição i <= N. O bloco será repetido enquanto essa condição for verdadeira!
  • No bloco:
  • Imprimimos a mensagem msg
  • Fazemos uma coisa estranha: i = i + 1!!!

O sinal de igualdade: i = i + 1 ???

Lembre-se = é um operador de atribuição e não de comparação. O que estamos fazendo é atribuir um novo valor para i: o valor antigo somado a 1.

Infinitas repetições

Esse tipo de comando para se gerar repetições é conhecido como laço ou loop. É muito comum cometer um erro e o laço não acabar. Nesse caso, o computador vai explodir (no Star Trek, série original). Para sair disso pression Ctrl-C.

# Loop infinito
i = 0
while True:
    print(i)
    i = i + 1

Exercício 13

Faça um programa para exibir os números de 1 a 100

Exercício 14

Modifique o programa para exibir os números de 50 a 100

Exercício 15

Escreva um programa que faz a contagem regressiva para o lançamento de um foguete: 10,9,...,1,Fogo

Contadores

As variáveis i nos programas anteriores são contadores e são usados para se saber quando o loop deve acabar.

fim = int(input("Digite o último número a imprimir: "))
x = 1
while x<= fim:
    print(x)
    x = x + 1

É possível combinar while e if. Vamos agora imprimir só os números pares:

fim = int(input("Digite o último número a imprimir: "))
x = 0
while x<=fim:
    if x % 2 == 0:
        print(x)
    x = x + 1

Mas os contadores não precisam ir de um em um! Aqui está um jeito melhor:

Exercício 16

Modifique os programas anteriores para imprimir os números ímpares.

Exercício 17

Reescreva o programa para escrever os 10 primeiros múltiplos de 3

Exercício 18

Escreve um programa que recebe um número e escreve a tabuada desse número. Exemplo do resultado para o número 2:

2 x 1 = 2

2 x 2 = 4

...

2 x 10 = 20

Acumuladores

Muitas vezes além de contar, precisamos acumular valores. Exemplo: multiplicação de dois números naturais: 3 x 4 = 3 + 3 + 3 + 3

x1 = int(input("Entreo com um inteiro: "))
x2 = int(input("Entreo com um inteiro: "))

resultado = 0
i = 1
while i <= x2:
    resultado = resultado + x1
    i = i + 1

print(f"{x1} x {x2} = {resultado}")

Também dá para fazer a divisão inteira e resto:

11 / 2: 11 - 2 - 2 - 2 - 2 - 2 = 1

Temos 5 subtrações (resultado da divisão inteira) e resto 1

# Divisão
x1 = int(input("Entreo com um inteiro: "))
x2 = int(input("Entreo com um inteiro: "))

divisão = 0
total = x1
while total >= x2:
    total = total - x2
    divisão = divisão + 1

print(f"{x1} / {x2} = {divisão} com resto {total}")

Exercício 19

Escreva um programa que calcula a divisão inteira entre dois números usando + apenas

Operadores de atribuição especiais

Nos programas anteriores, usamos expressões do tipo

i = i + 1
x = x - 1

Isso é tão comum que existem operadores especialisados:

i = 10
i = i + 1
i = 10
i += 1 # Mesma operação

i = 10
i = i + 10
i = 10
i += 10 # Mesma operação

i = 10
i = i - 1
i = 10
i -= 1

i = 10
i = i - 5
i = 10
i -= 5

i = 10
i = i * 5
i = 10
i *= 5

Também existem os operadores /=, **=, //=, %=. A idéia é a mesma, se tivermos um operador binário , em geral existe o operador de atribuição ∘= que quer dizer que x = x ∘ y é a mesma coisa que x ∘= y. Não sei se são todos os operadores.

Exercício 20

Reescreva o programa de divisão acima com esses operadores de atribuição especial.

Interrompendo a repetição

Use break para sair de um laço e continue para ir para a próxima iteração do laço.

Exemplo: um programa para somar uma sequência de números dados pelo usuário:

Exercício 20

Escreva um programa que lê números do teclado. O programa deve ler os números até que o usuário digite 0 que indica que não se deseja entrar com mais números. Imprima a soma dos números, a quantidade de números digitada pelo usuário e a média aritmética dos números.

Repetições aninhadas

Como tudo em Python, dá para combinar laços, um laço dentro do outro;

Exemplo: tabela de tabuada.

tabuada = 1
while tabuada <= 10:
    num = 1
    print(f"Tabuada do {tabuada}")
    while num <= 10:
        print(f"{tabuada} x {num} = {tabuada*num}")
        num += 1
    print("")
    tabuada += 1

Exercício 21

Escreva um programa que determina se um número é primo ou não. Um número é primo se ele é divisível por 1 e por ele mesmo apenas. Dica: use o operador resto (%) para saber se um número é divisível por outro.

Exercício 22

Escreva um programa que recebe um número inteiro n e determina os primeiros n números primos

Estruturas de dados: listas

Até este momento, trabalhamos com dados simples, números e strings. Os strings têm uma característica um pouco diferente: ele é composto por caracteres. Muitas vezes é interessante trabalhar com coleções de dados. Existem diversas maneiras de organizar estas coleções de dados. A mais simples é a lista.

Em python, uma lista é uma sequência de objetos:

x = [1,2,3,4]
y = [1, 1.0, "um"]

A lista também pode conter listas!

z = [1,2,3,4, ["a", "b"], [1,2,3,4], [1,[2,3,[4,5]]]]

Para se saber o comprimento de uma lista, use a função len:

In [23]: x = [1,2,3,4]
    ...: y = [1, 1.0, "um"]
    ...: z = [1,2,3,4, ["a", "b"], [1,2,3,4], [1,[2,3,[4,5]]]]

In [24]: print(len(x))
    ...: print(len(y))
    ...: print(len(z))
    ...: 
4
3
7

Para se acessar o n-ésimo elemento, use colchetes. Lembrando que em python, se conta a partir do zero!

In [26]: print(x[0])
    ...: print(x[1])
    ...: print(x[2])
    ...: print(x[3])
    ...: print(x[4])
    ...: 
1
2
3
4
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-26-8f8e192057fe> in <module>
      3 print(x[2])
      4 print(x[3])
----> 5 print(x[4])

IndexError: list index out of range

Atenção com estruturas de dados mais complexas, por exemplo listas que contém listas:

In [27]: print(z[0])
1

In [28]: print(z[3])
4

In [29]: print(z[4])
['a', 'b']

In [30]: print(z[4][0])
a

In [31]: print(z[6])
[1, [2, 3, [4, 5]]]

In [32]: print(z[6][0])
1

In [33]: print(z[6][1])
[2, 3, [4, 5]]

In [34]: print(z[6][1][2])
[4, 5]

In [35]: print(z[6][1][2][1])
5

Nota média:

notas = [6, 6.5, 8.5, 7, 7.5]
soma = 0
N = len(notas)
i = 0
while i < N:
    soma += notas[i]
    i += 1
media = soma / N

print(f"A nota média é: {media:4.2f}")

Exercício 23

Brinque com o programa acima, aumentando o número de notas e mudando o valor das notas.

Comentários

Comments powered by Disqus