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!