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().
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 doPython
(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.
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:
- Primeiro,
len(numeros)
retorna o inteiro10
. - Em seguida,
10 // 2
retorna o inteiro5
conforme você usa o operador de divisão de inteiro. - Por fim,
0:5
é uma fatia que representa os cinco primeiros itens, que possuem índices0
até4
. Observe que oendpoint
é 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 1
e 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__()
.