Capítulo 11, Básico
Strings
Uma string é uma sequência imutável de caracteres Unicode. A palavra que mais importa nessa frase é "imutável".
Código deste capítulo: basico/cap11_strings.py
Índices e fatias
Cada caractere tem uma posição, que começa em zero. Índices negativos contam a partir do fim. A fatia [início:fim:passo] exclui o índice final:
texto = "Python"
print(texto[0], texto[-1], texto[1:4], texto[::-1])
P n yth nohtyP
Strings não mudam
Nenhuma operação altera uma string existente. Elas sempre criam uma nova:
try:
texto[0] = "J"
except TypeError as erro:
print(erro)
novo = "J" + texto[1:]
print(novo)
'str' object does not support item assignment
Jython
Os métodos do dia a dia
Estes são os métodos que eu uso toda semana. Todos devolvem uma string nova (ou outro valor) e deixam a original intacta:
frase = " Aprender Python é divertido "
print(frase.strip())
print(frase.strip().lower())
print(frase.strip().upper())
print(frase.strip().split())
print("-".join(["a", "b", "c"]))
print(frase.replace("Python", "Go").strip())
print(frase.find("Python"))
print(frase.strip().startswith("Aprender"))
print(frase.count("e"))
print("Python" in frase)
Aprender Python é divertido
aprender python é divertido
APRENDER PYTHON É DIVERTIDO
['Aprender', 'Python', 'é', 'divertido']
a-b-c
Aprender Go é divertido
11
True
3
True
O find devolve -1 quando não acha. O index faz o mesmo, mas levanta ValueError. Para decidir se uma string contém outra, use o operador in.
f-strings
As f-strings são a forma moderna de montar texto. Depois dos dois pontos vai o formato do valor:
nome = "Ana"
preco = 1234.5
quantidade = 3
print(f"{nome} comprou {quantidade} itens")
print(f"Preço: {preco:,.2f}")
print(f"Total: {preco * quantidade:.2f}")
print(f"[{nome:>8}] [{nome:<8}] [{nome:^8}]")
print(f"{quantidade=}")
Ana comprou 3 itens
Preço: 1,234.50
Total: 3703.50
[ Ana] [Ana ] [ Ana ]
quantidade=3
O formato :,.2f usa vírgula para milhares e ponto para decimais, que é o padrão americano. Para o formato brasileiro, troque os símbolos:
preco = 1234.5
americano = f"{preco:,.2f}"
brasileiro = americano.replace(",", "_").replace(".", ",").replace("_", ".")
print(brasileiro)
1.234,50
Para aplicações reais, o módulo locale ou a biblioteca Babel fazem isso por região. Para um script, a troca acima resolve.
Unicode e bytes
Uma string é uma sequência de pontos de código Unicode. Os bytes só entram quando você grava em disco ou envia pela rede, e aí a codificação importa:
print(ord("A"), chr(97))
palavra = "ação"
print(len(palavra))
dados = palavra.encode("utf-8")
print(dados)
print(len(dados))
print(dados.decode("utf-8"))
65 a
4
b'a\xc3\xa7\xc3\xa3o'
6
ação
A palavra ação tem 4 caracteres e ocupa 6 bytes em UTF-8, porque ç e ã usam dois bytes cada. Sempre diga a codificação explicitamente ao ler e gravar arquivos. Retomo isso no capítulo de arquivos.
Exercício 1
Palíndromo
Escreva eh_palindromo(texto) que ignore maiúsculas e espaços. Dica: lower, replace e uma fatia invertida resolvem sem laço.
Exercício 2
Inverter a ordem das palavras
Escreva inverter_palavras("python é bom") que devolva "bom é python".