Covil Do Dev

Função len() em Python

Aprenda como e quando usar a função len() do Python. Você também aprenderá a personalizar suas definições de classe para que os objetos de uma classe definida pelo usuário possam ser usados como argumentos na função len().

Lindomar Rodrigues

Atualizado

Em muitas situações, você precisará encontrar a quantidade de itens armazenados em uma estrutura de dados.

A função len() interna do Python é a ferramenta que o ajudará nessa tarefa.

Geralmente o uso da função len() é simples.

No entanto, existem ocasiões em que você precisará entender com mais detalhes como essa função funciona e como aplicá-la a diferentes tipos de dados.

Neste artigo, você aprenderá:

  • Encontrar o comprimento de diferentes tipos de dados utilizando a função len()
  • Utilizar o len() com tipos de dados não padrões do Python(De bibliotecas de terceiros)
  • Preparar suas classes para poder utilizar o len()

Ao final deste artigo, você saberá quando e como usar a função len() em Python.

Você saberá para quais tipos de dados você poderá utilizar a função len() e quais você não pode usar.

Você também entenderá como usar len() com tipos de dados de terceiros, como ndarray do NumPy e o DataFrame do pandas, e até com suas próprias classes.

ad

Começando com a função len() em Python

A função len() é uma das funções internas do Python.

Ela retorna o comprimento de um objeto, por exemplo, ela pode retornar o número de itens em uma lista.

Você pode usar a função com muitos tipos de dados diferentes.

No entanto, nem todos os tipos de dados são argumentos válidos para a função len().

Você pode começar olhando a chamada help para esta função:

print(help(len))  

A saída será:

Help on built-in function len in module builtins:  
len(obj, /)  
Return the number of items in a container.  

Quem em tradução livre seria:

Ajuda para a função interna len em módulos internos:  
len(obj, /)  
Retorna o número de itens em um contêiner.  

A função recebe um objeto como argumento e retorna o cumprimento desse objeto.

A documentação para a função len() vai um pouco mais longe:

Return the length (the number of items) of an object. The argument may be a sequence (such as a string, bytes, tuple, list, or range) or a collection (such as a dictionary, set, or frozen set).

Que em português seria:

Retorna o comprimento (o número de itens) de um objeto. O argumento pode ser uma sequência (como uma string, bytes, tupla, lista ou range) ou uma coleção (como um dicionário, set ou frozen set).

Quando você usa tipos de dados internos e muitos tipos de terceiros com len(), a função não precisa iterar pela estrutura de dados.

O comprimento de um objeto contêiner é armazenado como um atributo do objeto.

O valor desse atributo é modificado cada vez que os itens são adicionados ou removidos da estrutura de dados e len() retorna o valor do atributo de comprimento.

Isso garante que len() funciona com eficiência.

Nas seções a seguir, você aprenderá a usar len() com sequências e coleções.

Você também aprenderá sobre alguns tipos de dados que não podem ser usados como argumentos para a função len() em Python.

Usando len() com sequências

Uma sequência é um contêiner com itens ordenados, Listas, tuplas e strings são três das sequências internas básicas em Python.

Você pode encontrar o comprimento de uma sequência chamando len():

nome = "José"

print(len(nome))

numeros = [1, 2, 3]

print(len(numeros))

letras = ('a', 'b', 'c', 'd', 'e')

print(len(letras))

A saída será:

4  
3  
5  

Para encontrar o comprimento da string nome, da lista numeros e da tupla letras, você usa len()
da mesma maneira.

Todos os três tipos de dados são argumentos válidos para len().

A função len() sempre retorna um inteiro, pois está contando o número de itens no objeto que você lhe passa.

A função retorna 0 se o argumento for uma sequência vazia:

nome = ""

print(len(nome))

numeros = []

print(len(numeros))

letras = ()

print(len(letras))

A saída será:

0  
0  
0  

Nos exemplos acima, você encontra o comprimento de uma string vazia, uma lista vazia e uma tupla vazia.

A função retorna 0 em todos os casos.

Um objeto range também é uma sequência que você pode criar usando range().

Um objeto range não armazena todos os valores, mas os gera quando são necessários.

No entanto, você ainda pode encontrar o comprimento de um objeto range usando len():

print(len(range(1, 20, 2)))  

A saída será:

10  

Esse intervalo de números inclui os inteiros de 1 até 19 com incremento de 2.

O comprimento de um objeto range pode ser determinado a partir dos valores de início, parada e o passo.

Nesta seção, você usou a função len() do Python com strings, listas, tuplas e objetos range, no entanto, você também pode usar a função com qualquer outra sequência interna.

Usando len() com coleções(set)

Em algum momento, pode ser necessário encontrar o número de itens exclusivos em uma lista ou outra sequência.

Você pode usar conjuntos(set) e len() para conseguir isso:

import random

numeros = [random.randint(1, 20) for _ in range(20)]
print(numeros)

unicos = set(numeros)
print(unicos)

print(len(unicos))

A saída será:

[12, 10, 9, 18, 15, 12, 18, 7, 11, 15, 19, 2, 3, 15, 14, 4, 20, 2, 7, 2]
{2, 3, 4, 7, 9, 10, 11, 12, 14, 15, 18, 19, 20}
13

Você gera a lista numeros usando uma compreensão de lista e ela contém vinte números aleatórios que variam entre 1 e 20.

A saída diferirá cada vez que o código for executado, pois, você está gerando números aleatórios.

Nesta execução em particular, há treze números únicos na lista de vinte números gerados aleatoriamente.

Outro tipo de dados integrado que você usará com frequência é o dicionário.

Em um dicionário, cada item consiste em um par chave-valor.

Quando você usa um dicionário como argumento para len(), a função retorna o número de itens no dicionário:

print(len({"Joao": 10, "Maria": 12, "Roberto": 11}))

A saída será:

3  

A saída do exemplo mostra que há três pares de valores-chave neste dicionário.

Como foi o caso das sequências, len() retornará 0 quando o argumento for um dicionário vazio ou um conjunto vazio.

Isso faz com que dicionários vazios e conjuntos vazios sejam falsos.

Explorando len() com outros tipos de dados

Você não pode usar todos os tipos de dados internos como argumentos para len().

Para tipos de dados que não armazenam mais de um item dentro deles, o conceito de comprimento não é relevante.

Este é o caso de números e tipos boolean:

print(len(5))  

que irá retornar o seguinte erro:

TypeError: object of type 'int' has no len()  

Os tipos inteiro, flutuante, Boolean e complex são exemplos de tipos de dados internos que você não pode usar com len().

A função gera um TypeError quando o argumento é um objeto de um tipo de dados que não tem comprimento.

Você já viu que uma lista tem um comprimento, o que significa que você pode usá-la como um argumento em len().

Você cria um iterador da lista usando a função interna iter().

Em um iterador, cada item é buscado sempre que necessário, como quando a função next() é usada ou em um loop.

No entanto, você não pode usar um iterador no len().

Você obtém um TypeError quando usa um iterador como argumento para len().

Como o iterador busca cada item conforme e quando necessário, a única maneira de medir seu comprimento é esgotar o iterador.

Um iterador também pode ser infinito, como o iterador retornado por itertools.cycle(), portanto, seu comprimento não pode ser definido.

Você não pode usar geradores com len() pelo mesmo motivo.

O comprimento desses objetos não pode ser medido sem usá-los.

Explorando len() com mais alguns exemplos

Nesta seção, você aprenderá sobre alguns casos de uso comuns para len().

Esses exemplos ajudarão você a entender melhor quando usar essa função e como usá-la de maneira eficaz.

Em alguns dos exemplos, você também verá casos em que len() há uma solução possível, mas pode haver mais maneiras de obter a mesma saída.

Verificando o comprimento de uma entrada do usuário

Um caso de uso comum de len() é verificar o comprimento de uma sequência de entrada por um usuário:

nome = input("Nome do usuário: [4-10 caracteres] ")

if 4 <= len(nome) <= 10:
    print(f"obrigado. O nome {nome} é válido")
else:
    print("O nome necessita ter entre 4 e 10 caracteres")

Neste exemplo, você usa um if para verificar se o inteiro retornado por len() é maior ou igual a 4 e menor ou igual a 10.

Você pode executar este script e obterá uma saída semelhante a abaixo:

Nome do usuário: [4-10 caracteres] leo_cdv
obrigado. O nome leo_cdv é válido

O nome de usuário tem sete caracteres nesse caso, portanto, a condição no if é avaliada como True.

Você pode executar o script novamente e inserir um nome de usuário inválido:

Nome do usuário: [4-10 caracteres] leonardo_cdv
O nome necessita ter entre 4 e 10 caracteres

Nesse caso, len(nome) retorna 12, e a condição no if é avaliada como False.

Finalizando um loop com base no comprimento de um objeto

Você usará len() se precisar verificar quando o comprimento de uma sequência mutável, como uma lista, atinge um número específico.

No exemplo a seguir, você solicita que o usuário insira três opções de nome de usuário, que você armazena em uma lista:

nomes = []
print("Insira 3 opções de nome")

while len(nomes) < 3:
    nome = input("Nome: [4-10 caractere] ")
    if 4 <= len(nome) <= 10:
        print(f"obrigado. O nome {nome} é válido")
        nomes.append(nome)
    else:
        print("O nome necessita ter entre 4 e 10 caracteres")
    print(nomes)

Agora você está usando o resultado de len() no while.

Se o usuário inserir um nome de usuário inválido, você não manterá a entrada.

Quando o usuário insere uma string válida, você a anexa à lista nomes.

O loop se repete até que haja três itens na lista.

Você pode até usar len()para verificar quando uma sequência está vazia:

cores = ["azul", "branco", "rosa"]

while len(cores) > 0:
    print(f"A próxima cor é: {cores.pop(0)}")

A saída será:

A próxima cor é: azul
A próxima cor é: branco
A próxima cor é: rosa

Você usa o método .pop() para remover o primeiro item da lista em cada iteração até que a lista esteja vazia.

Se você estiver usando esse método em listas grandes, remova os itens do final da lista, pois isso é mais eficiente.

Você também pode usar o tipo de dados deque, que permite que você pule da esquerda com eficiência.

Há uma maneira mais Pythonica de obter a mesma saída usando o valor boolean das sequências:

cores = ["azul", "branco", "rosa"]

while cores:
    print(f"A próxima cor é: {cores.pop(0)}")

A saída será:

A próxima cor é: azul  
A próxima cor é: branco  
A próxima cor é: rosa  

Uma lista vazia é falsa.

Isso significa que o while interpreta uma lista vazia como False.

Uma lista não vazia é verdadeira e o while a trata como True.

O valor retornado por len() determina a veracidade de uma sequência.

Uma sequência é verdadeira quando len() retorna qualquer inteiro diferente de zero e falsa quando len()
retorna 0.

Encontrando o índice do último item de uma sequência

Imagine que você deseja gerar uma sequência de números aleatórios no intervalo de 1 á 10 e gostaria de continuar adicionando números à sequência até que a soma de todos os números excedam 21.

O código a seguir cria uma lista vazia e usa um loop while para preencher a lista:

import random

numeros = []

while sum(numeros) <= 21:
    numeros.append(random.randint(1, 10))

print(numeros)
print(numeros[len(numeros) - 1])

A saída será:

[10, 10, 7]
7

Você anexa números aleatórios à lista até que a soma exceda 21.

A saída que você obterá variará conforme você estiver gerando números aleatórios.

Para exibir o último número da lista, use len(numbers) e subtraia 1 dele, pois o primeiro índice da lista é 0.

Indexação em Python permite que você use o índice -1 para obter o último item de uma lista.

Portanto, embora você possa usar len() nesse caso, não precisa.

Você deseja remover o último número da lista para que a soma de todos os números da lista não exceda 21.

Você usa len() novamente para calcular o índice do último item da lista, que você usa como argumento para o
método .pop().

Mesmo neste caso, você pode usar -1 como argumento para .pop() remover o último item da lista e devolvê-lo.

Dividindo uma lista em duas metades

Se você precisar dividir uma sequência em duas metades, precisará usar o índice que representa o ponto médio da sequência.

Você pode usar len() para encontrar esse valor.

No exemplo a seguir, você criará uma lista de números aleatórios e a dividirá em duas listas menores:

import random

numeros = [random.randint(1, 10) for _ in range(10)]
print(numeros)

metade_um = numeros[:len(numeros) // 2]
metade_dois = numeros[len(numeros) // 2:]

print(metade_um)
print(metade_dois)

A saída será:

[9, 7, 6, 8, 2, 6, 8, 8, 10, 10]
[9, 7, 6, 8, 2]
[6, 8, 8, 10, 10] 

Na instrução de atribuição em que você define metade_um, você usa a fatia que representa os itens do início até o ponto médio.

Você pode descobrir o que a fatia representa dividindo as etapas usadas na expressão da fatia:

  1. Primeiro, len(numeros) retorna o inteiro 10.
  2. Em seguida, 10 // 2 retorna o inteiro 5 conforme você usa o operador de divisão de inteiro.
  3. Por fim, 0:5 é uma fatia que representa os cinco primeiros itens, que possuem índices 0 até 4. Observe que o endpoint é excluído.

Na próxima atribuição, onde você define metade_dois, você usa a mesma expressão na fatia.

No entanto, neste caso, o inteiro 5 representa o início do intervalo.

A fatia agora 5: representa os itens do índice 5 até o final da lista.

Se sua lista original contiver um número ímpar de itens, metade de seu comprimento não será mais um número inteiro.

Quando você usa a divisão inteira, obtém o piso do número.

A lista metade_um agora conterá um item a menos que metade_dois.

Você pode tentar isso criando uma lista inicial de onze números em vez de dez.

As listas resultantes não serão mais metades, mas representarão a alternativa mais próxima para dividir uma sequência ímpar.

Usando a função len() com bibliotecas de terceiros

Você também pode usar o len() com vários tipos de dados personalizados de bibliotecas de terceiros.

Na última seção deste tutorial, você aprenderá como o comportamento de len() depende da definição da classe.

Nesta seção, você verá exemplos de uso do len() com tipos de dados de duas bibliotecas populares de terceiros.

NumPy ndarray

O módulo NumPy é o módulo mais utilizado em todas as aplicações de programação quantitativa em Python.

O módulo introduz o tipo de dado numpy.ndarray.

Esse tipo de dado, com as funções do NumPy, é ideal para cálculos numéricos e é o bloco de construção para tipos de dados em outros módulos.

Antes de começar a usar o NumPy, você precisará instalar a biblioteca.

Você pode usar o gerenciador de pacotes padrão do Python pip, e executar o seguinte comando no console:

pip install numpy  

Você instalou o NumPy e agora pode criar um array NumPy de uma lista e usar len() no array:

import numpy as np

numeros = np.array([4, 7, 9, 23, 10, 6])
print(type(numeros))

print(len(numeros))

A saída será:

<class 'numpy.ndarray'>
6

A função do NumPy np.array() cria um objeto do tipo numpy.ndarray da lista que você passa como argumento.

No entanto, os arrays NumPy podem ter mais de uma dimensão.

Você pode criar um array bidimensional convertendo uma lista de listas em um array:

import numpy as np

numeros = [[11, 1, 10, 10, 15],
           [14, 9, 16, 4, 4]]
numeros_array = np.array(numeros)

print(numeros_array)

print(len(numeros_array))

print(numeros_array.shape)

print(len(numeros_array.shape))

print(numeros_array.ndim)

A saída será:

[[11  1 10 10 15]
 [14  9 16  4  4]]
2
(2, 5)
2
2

A lista numeros consiste em duas listas, cada uma contendo cinco números inteiros.

Quando você usa essa lista de listas para criar uma matriz NumPy, o resultado é uma matriz com duas linhas e cinco colunas.

A função retorna o número de linhas na matriz quando você passa essa matriz bidimensional como um argumento em len().

Para obter o tamanho de ambas as dimensões, você usa a propriedade .shape, que é uma tupla que mostra o número de linhas e colunas.

Você obtém o número de dimensões de uma matriz NumPy usando .shape e len() ou usando a propriedade .ndim.

Em geral, quando você tem um array com qualquer número de dimensões, len() retorna o tamanho da primeira dimensão:

import numpy as np

array_3d = np.random.randint(1, 20, [2, 3, 4])

print(array_3d)

print(array_3d.shape)

print(len(array_3d))

A saída será:

[[[ 8 17  2  6]
  [11  9 14 17]
  [14  2 18  6]]

 [[ 1  7  7 11]
  [17  7 17  8]
  [ 4 11 11 14]]]
(2, 3, 4)
2

Neste exemplo, você cria uma matriz tridimensional com a forma (2, 3, 4) em que cada elemento é um número inteiro aleatório entre 1e 20.

Você usa a função np.random.randint() para criar uma matriz desta vez.

A função len() retorna 2, que é o tamanho da primeira dimensão.

Pandas DataFrame

O DataFrame é outro tipo de dados amplamente usado em muitas aplicações.

Antes de poder usar pandas, você precisará instalá-lo usando o seguinte comando no console:

pip install pandas  

Você instalou o pacote pandas e agora pode criar um DataFrame a partir de um dicionário:

import pandas as pd

notas = {"Robert": [60, 75, 90],
         "Mary": [78, 55, 87],
         "Kate": [47, 96, 85],
         "John": [68, 88, 69]}

df = pd.DataFrame(notas, index=["Física", "Matemática", "Português"])

print(df)

print(len(df))

print(df.shape) 

A saída será:

            Robert  Mary  Kate  John
Física          60    78    47    68
Matemática      75    55    96    88
Português       90    87    85    69
3
(3, 4)

As chaves do dicionário são strings que representam os nomes dos alunos de uma turma.

O valor de cada chave é uma lista com as notas de três matérias.

Ao criar um DataFrame a partir desse dicionário, você define o índice usando uma lista contendo os nomes dos assuntos.

O DataFrame tem três linhas e quatro colunas.

A função len() retorna o número de linhas no DataFrame.

O tipo DataFrame também tem uma propriedade .shape, que você pode usar para mostrar que a primeira dimensão de um DataFrame representa o número de linhas.

Você viu como len() funciona com vários tipos de dados integrados e também com alguns tipos de dados de módulos de terceiros.

Na seção a seguir, você aprenderá como definir qualquer classe para poder ser usada como argumento para a função len() em Python.

Usando len() em classes definidas pelo usuário

Quando você define uma classe, um dos métodos especiais que você pode definir é .__len__().

Esses métodos especiais são chamados métodos dunder, pois possuem sublinhados duplos no início e no final dos nomes dos métodos.

A função interna do Python len() chama o método .__len__() de seu argumento.

Na seção anterior, você viu como len() se comporta quando o argumento é um objeto DataFrame do pandas.

Esse comportamento é determinado pelo método .__len__() da classe, que você pode ver no código-fonte do módulo DataFrame.

class DataFrame(NDFrame, OpsMixin):
    # ... 
    def __len__(self) -> int:
        """Returns length of info axis, but here we use the index."""

        return len(self.index)

Este método retorna o comprimento da propriedade .index do DataFrame usando len().

Esse método dunder define o comprimento de um DataFrame para ser igual ao número de linhas no DataFrame, conforme representado por .index.

Conclusão

Você explorou como usar len() para determinar o número de itens em sequências, coleções e outros tipos de dados que contêm vários itens por vez, como matrizes NumPy e DataFrames do pandas.

A função len() em Python é uma ferramenta chave em muitos programas.

Alguns de seus usos são diretos, mas há muito mais nessa função do que seus casos de uso mais básicos, como você viu neste tutorial.

Saber quando você pode usar essa função e como usá-la efetivamente ajudará você a escrever um código mais organizado.

Agora você tem uma boa base para entender a função len().

Aprender mais sobre len() ajuda você a entender melhor as diferenças entre os tipos de dados.

Você está pronto para usar a função len() em seus algoritmos e melhorar a funcionalidade de algumas de suas definições de classe, aprimorando-as com o método .__len__().

Obrigado por visitar o blog e por ler esse artigo, se tive qualquer dúvida, ideia ou sugestão, não hesite em entrar em contato pelo meu e-mail: lindomar@covildodev.com.br