Python / len() / Obter o comprimento de uma string

Em Python, len(text) retorna o número de pontos de código Unicode de uma string, incluindo espaços e quebras de linha. Isso nem sempre corresponde à quantidade de bytes ou de caracteres percebidos na tela. Para coleções com comprimento, como listas, tuplas e dicionários, conta os elementos.

Uso básico, espaços e quebras de linha

len() recebe um objeto que oferece suporte a comprimento. Uma string vazia tem comprimento zero; as aspas delimitadoras não contam. Pontos de código identificam elementos de texto e são as unidades do tipo str de Python.

Use Python 3. Salve cada exemplo completo em UTF-8 como length_example.py e execute python length_example.py, ou python3 conforme sua instalação. Substitua o conteúdo para executar cada exemplo independentemente.

for text in ("abc", "", "a b", "a\nb"):
    print(repr(text), len(text))

Resultado esperado:

'abc' 3
'' 0
'a b' 3
'a\nb' 3

"a b" contém um espaço e "a\nb" uma quebra de linha, portanto ambos medem três. A notação no código \n usa dois caracteres, mas representa uma só quebra no valor da string. repr() torna essa diferença visível.

Comprimento da string e bytes UTF-8

Codificar texto em UTF-8 produz bytes para armazenamento ou transmissão. len(text) conta pontos de código; len(text.encode("utf-8")) conta os bytes codificados. Aqui, \u00e9 representa é.

text = "caf\u00e9"
data = text.encode("utf-8")
print(len(text))
print(len(data))
4
5

O texto contém quatro pontos de código, mas cinco bytes UTF-8, pois o último caractere ocupa dois bytes. Para limites de arquivos ou protocolos em bytes, meça com a codificação exigida. O comprimento da string também não mede diretamente seu consumo de memória.

Caracteres combinados e emoji

é pode ser representado por um ponto de código ou por e seguido de um acento combinante, totalizando dois. Aparência semelhante não garante valores ou comprimentos iguais. Os grupos de grafemas Unicode reúnem pontos de código em unidades próximas dos caracteres percebidos.

import unicodedata

composed = "\u00e9"
decomposed = "e\u0301"
emoji = "\U0001f469\u200d\U0001f4bb"
print(len(composed), len(decomposed))
print(composed == decomposed)
print(len(unicodedata.normalize("NFC", decomposed)))
print(len(emoji))
1 2
False
1
3

A normalização Unicode com unicodedata.normalize("NFC", text) compõe representações canonicamente combináveis. Aqui, um comprimento de dois vira um. Isso não transforma todo emoji ou combinação em um ponto de código: a sequência da tecnóloga no exemplo contém três.

Antes de implementar um “limite de caracteres”, escolha entre pontos de código, grafemas e bytes. NFC não substitui a contagem de grafemas; use uma implementação das regras adequadas de segmentação Unicode e confira entradas representativas.

Coleções e valores incompatíveis

Listas, tuplas, dicionários e conjuntos também têm comprimento. Dicionários contam chaves e conjuntos contam elementos distintos. Uma lista aninhada conta seus itens externos, sem somar automaticamente o conteúdo interno.

print(len([10, 20, 30]))
print(len((10, 20)))
print(len({"a": 10, "b": 20}))
print(len({1, 1, 2}))
rows = [[1, 2], [3, 4]]
print(len(rows))
print(sum(len(row) for row in rows))
3
2
2
2
2
4

Números e None não definem comprimento e geram TypeError. Converta um número em string para medir sua representação, incluindo sinal negativo e ponto decimal. Ser iterável não significa aceitar len(): geradores comuns não têm comprimento.

for value in (1234, None):
    try:
        print(len(value))
    except TypeError:
        print("TypeError")
print(len(str(1234)))

items = (n * 2 for n in range(3))
try:
    print(len(items))
except TypeError:
    print("TypeError")
values = list(items)
print(len(values))
print(list(items))
TypeError
TypeError
4
TypeError
3
[]

Converter um gerador em lista permite contar, mas consome os elementos e os guarda na memória. O segundo list(items) fica vazio. Não materialize dados enormes ou iteradores infinitos apenas para obter um comprimento.

Exemplo completo de validação de comprimento

Esta função aceita strings e verifica entre 1 e 12 pontos de código após remover espaços externos. Entradas vazias ou compostas só por espaços são rejeitadas; a string original não é modificada.

def valid_name(text):
    if not isinstance(text, str):
        raise TypeError("name must be a string")
    name = text.strip()
    return 1 <= len(name) <= 12

for text in ("Ada", "   ", "a" * 13, "  Ada  "):
    print(repr(text), valid_name(text))
'Ada' True
'   ' False
'aaaaaaaaaaaaa' False
'  Ada  ' True

A função não valida conteúdo ou categorias de caracteres, não remove todos os espaços internos e não limita caracteres visuais. Alinhe unidade de comprimento, política de espaços, caracteres permitidos e validação no servidor para que interface e armazenamento avaliem a mesma entrada de modo consistente.