Pular para o conteúdo

    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:

    basico/cap11_strings.pylinhas 10 a 11
    texto = "Python"
    print(texto[0], texto[-1], texto[1:4], texto[::-1])
    
    Saída
    P n yth nohtyP
    

    Strings não mudam

    Nenhuma operação altera uma string existente. Elas sempre criam uma nova:

    basico/cap11_strings.pylinhas 16 a 22
    try:
        texto[0] = "J"
    except TypeError as erro:
        print(erro)
    
    novo = "J" + texto[1:]
    print(novo)
    
    Saída
    '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:

    basico/cap11_strings.pylinhas 27 a 37
    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)
    
    Saída
    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:

    basico/cap11_strings.pylinhas 42 a 49
    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=}")
    
    Saída
    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:

    basico/cap11_strings.pylinhas 51 a 54
    preco = 1234.5
    americano = f"{preco:,.2f}"
    brasileiro = americano.replace(",", "_").replace(".", ",").replace("_", ".")
    print(brasileiro)
    
    Saída
    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:

    basico/cap11_strings.pylinhas 59 a 65
    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"))
    
    Saída
    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".