dezembro 07 2016 · python · metodos

Os metódos any() e all()

Que o Python tem umas funções muito legais todo mundo já sabia e essas funções facilitam um bocado a nossa vida no dia-a-dia.

As funçoes any() e all() são duas dessas funções que nos ajudam na hora do sufoco para verificar a existência de objetos em listas, strings e etc.

Dia desses precisei verificar se uma dada frase era um pangrama, que nada mais é que uma frase que contém todas as letras do alfabeto. Sendo a mais conhecida delas no mundo do desenvolvimento a: The quick brown fox jumps over the lazy dog.

Antes de mostrar a solução para esse problema, vamos ver como as funções se comportam:

>>> lista_verdadeira = ['a', 1, True] # Lista com valores verdadeiros apenas;
>>> lista_falsa = ['', 0, False] # Lista com valores falsos apenas;
>>> lista_mista = ['a', '', 0, True, False] # Lista com valores verdadeiros e falsos;
>>> any(lista_mista)
True
>>> any(lista_falsa)
False
>>> any(lista_verdadeira)
True
>>> all(lista_mista)
False
>>> all(lista_falsa)
False
>>> all(lista_verdadeira)
True

Como deu pra perceber no código acima, a função all() retorna True apenas se todos os elementos de uma lista forem verdadeiros. Quaisquer elementos que sejam False faz a função all() retornar False. O mesmo funciona para a função any(). Se qualquer elemento for verdadeiro, ele retorna True.

Voltando ao problema do pangrama.

Isto posto, para resolver o problema do pangrama eu utilizei toda a magia do Python utilizando o metodo all() juntamente com um generator (assunto para outro post) assim:

>>> from string import ascii_lowercase # Importa todas as letras do alfabeto romano em minusculas
>>> frase = 'The quick brown fox jumps over the lazy dog'
>>>
>>> def is_pangram(string):
>>>     return all(c.lower() for c in string if c in ascii_lowercase)
>>>
>>> is_pangram(frase)
True

Calma, não se preocupe. Pode parecer magia negra a primeira vista mas não é. Neste exemplo, eu utilizei uma feature do Python chamada expressão geradora ou generator expression. O que essa expressão acima faz é percorrer toda a string passada como argumento, item a item (c.lower() for c in string), e verifica se este caractere (if c in) está dentro do alfabeto (ascii_lowercase). O metódo lower() como o nome já diz, transforma o caractere em minusculo, para tornar a expressão case insensitive.

A função any()

Um exemplo de uso da função any() é verificar se uma string possui alguma vogal, por exemplo:

>>> saudacao = 'hello'
>>> vogais = 'aeiou'
>>> any(c for c in saudacao if c in vogais)
True

Ler uma expressão any() facilita o entendimento. Leia a função assim "Retorne verdadeiro para qualquer(any) caractere(c) em 'string' se o caractere estiver(in) em vogais"

Considerações finais

Vimos neste post que duas funções embutidas do Python podem fazer MUITO trabalho para nos, transformando um código que seria escrito com muitas linhas e com baixo desempenho em uma expressão concisa e de alto desempenho.

Por hoje é só pessoal. Este é meu primeiro post aqui e eu espero trazer muito mais. Aguardem que em 2017 tem uma série de posts sobre Python aqui.

Saudações e Keep Coding!

  • LinkedIn
  • Tumblr
  • Reddit
  • Google+
  • Pinterest
  • Pocket