Como comparar um numero no python
Show
Vamos ver como comparar Strings em Python. Método 1: usando operadores relacionais Os operadores relacionais comparam os valores Unicode dos caracteres das strings do índice zero até o final da string. Em seguida, retorna um valor booleano de acordo com o operador usado. Exemplo:
Resultado: Verdade Verdade Falso FalsoMétodo 2: usar é e não é O operador == compara os valores de ambos os operandos e verifica a igualdade de valor. Já o operador is verifica se ambos os operandos se referem ao mesmo objeto ou não. O mesmo é o caso para! = E não é . Vamos entender isso com um exemplo: str1 = "Geek" str2 = "Geek" str3 = str1 print("ID of str1 =", hex(id(str1))) print("ID of str2 =", hex(id(str2))) print("ID of str3 =", hex(id(str3))) print(str1 is str1) print(str1 is str2) print(str1 is str3) str1 += "s" str4 = "Geeks" print("\nID of changed str1 =", hex(id(str1))) print("ID of str4 =", hex(id(str4))) print(str1 is str4)Resultado: ID de str1 = 0x7f6037051570 ID de str2 = 0x7f6037051570 ID de str3 = 0x7f6037051570 Verdade Verdade Verdade ID de str1 alterado = 0x7f60356137d8 ID de str4 = 0x7f60356137a0 FalsoO ID do objeto das strings pode variar em diferentes máquinas. Os IDs de objeto de str1, str2 e str3 eram os mesmos, portanto, o resultado é True em todos os casos. Depois que o id de objeto de str1 for alterado, o resultado de str1 e str2 será falso. Mesmo depois de criar str4 com o mesmo conteúdo do novo str1, a resposta será falsa, pois seus IDs de objeto são diferentes. O vice-versa acontecerá com não. Método 3: Criando uma função definida pelo usuário . Usando operadores relacionais, podemos apenas comparar as strings por seus unicodes. Para comparar duas strings de acordo com alguns outros parâmetros, podemos fazer funções definidas pelo usuário. No código a seguir, nossa função definida pelo usuário irá comparar as strings com base no número de dígitos. def compare_strings(str1, str2): count1 = 0 count2 = 0 for i in range(len(str1)): if str1[i] >= "0" and str1[i] <= "9": count1 += 1 for i in range(len(str2)): if str2[i] >= "0" and str2[i] <= "9": count2 += 1 return count1 == count2 print(compare_strings("123", "12345")) print(compare_strings("12345", "geeks")) print(compare_strings("12geeks", "geeks12"))Resultado: Falso Falso Verdade
Versões atualizadas deste script
Versão 2 - Enviado por Levi Gomes em 28/05/2011 Changelog: Estou enviando essa nova versão afim de melhorar o algoritmos, visto que na primeira versão havia uma chamada a função que era desnecessária. Download 1306585744.Maior.py Esconder código-fonte # -*- coding: iso-8859-1 -*- #Autor: Levi Gomes de Oliveira #e-mail: [email protected] # Qualquer dúvida encaminhar para o e-mail acima # Esse programa compara dois números x e y e retorna o valor do maior def maior(x,y): #Aqui definimos a função MAIOR, essa função é uma função de x e y if x>y: # Comparamos x e y, se x é maior retornamos o valor de x return x else: # caso contrário, retornamos o valor de y return y x= float(raw_input("Insira o valor de x \n")) # requisição dos valores para as variáveis y= float(raw_input("Insira o valor de y \n")) maior(x,y) # chamamos a função para efetuar o processamento print "O maior valor é: \n", maior(x,y) # imprimimos o resultadoScripts recomendados Gerador de Tabuada Horá do descanso! Uma peque aplicação que fiz usando pygtk Loja de tintas Calculadora Python - sem bugs !? Validador e gerador de CPF em Python Comentários
[1] Comentário enviado por eldermarco em 15/05/2011 - 17:14h Apenas uma observação: Você faz duas chamadas a função maior que você definiu. A primeira não é necessária.
[2] Comentário enviado por levi linux em 16/05/2011 - 18:20h Boa noite Elder Marco, é verdade a primeira "chamada" é desnecessário. Vlw, muito obrigado.
[3] Comentário enviado por Lisandro em 27/05/2011 - 07:37h Pode tirar a primeira chamada e melhorar a função para reconhecer e informar quando os numeros são iguais. Abraço. Nesse artigo vou mostrar como funciona o operador de igualdade no Python e como alteramos seu comportamento, controlando mais nosso código. Tenho um sistema em Python que armazena os filmes que eu tenho em uma lista, para organização, com uma função que pega todos os filmes e retorna uma lista com eles: class Filme(): def __init__(self, titulo, diretor): self.titulo = titulo self.diretor = diretor def __str__(self): return self.titulo + ‘ - ‘ + self.diretor def pega_todos_os_filmes(): meus_filmes = pega_todos_os_filmes() for filme in meus_filmes: print(filme)Vamos ver como ficou: A Teoria de Tudo - James Marsh La La Land - Damien Chazelle O Poderoso Chefão - Francis Ford CoppolaOk, temos nossa lista de filmes! Depois de um tempo, queria descobrir se eu tinha um filme. Como podemos fazer isso? Comparando objetos com o operador ==Para descobrir se eu já tenho um filme, criei uma função que verifica se o filme que eu quero saber está na nossa lista de filmes: def tenho_o_filme(filme_procurado): meus_filmes = pega_todos_os_filmes() for filme in meus_filmes: if filme_procurado == filme: return True return False filme_procurado = Filme(‘A Teoria de Tudo’, ‘James Marsh’) if tenho_o_filme(filme_procurado): print(‘Tenho o filme!’) else: print(‘Não tenho :(‘)Rodamos nosso código e esse foi o resultado: Não tenho :(Ué! A gente já viu que o filme A Teoria de Tudo está na nossa lista, então o que está dando errado? Sabemos que o operador == funciona bem para números e strings: x = 700 y = 700 print(x == y) a = ‘Yan’ b = ‘Yan’ print(a == b)O resultado: True TrueMas então por que ele não funciona como queremos com nossa classe Filme? Como o Python compara objetos?A questão é que o Python não sabe como deve comparar os objetos de tipo Filme quando utilizamos o operador ==. Que valor deve ser comparado? O titulo? O diretor? E de que forma? O Python não sabe! Com essa dúvida, o Python opta por não verificar valor nenhum, mas sim a identidade dos objetos. Isto é, ele checa se as variáveis em comparação apontam para o mesmo objeto na memória. Podemos verificar a identidade de um objeto através da função id(): a = Filme(‘A Teoria de Tudo’, ‘James Marsh’) b = Filme(‘A Teoria de Tudo’, ‘James Marsh’) print(id(a)) print(id(b))O resultado será parecido com esse: 139789394500856 139789394500800Repare que, de fato, os dois valores de identidade são diferentes! Se indicássemos que a variável b aponta para o objeto da variável a, o resultado seria diferente: a = Filme(‘A Teoria de Tudo’, ‘James Marsh’) b = a print(a == b)Dessa vez: TrueIsso ocorre porque, nesse caso, as duas variáveis apontam para o mesmo objeto, ou seja, possuem a mesma identidade: print(id(a)) print(id(b))O resultado: 139824816890912 139824816890912Vamos ver como isso funciona com os números inteiros e as strings que testamos lá atrás: x = 700 y = 700 print(‘Os inteiros:’) print(id(x)) print(id(y)) a = ‘Yan’ b = ‘Yan’ print(‘As strings:’) print(id(a)) print(id(b))E o resultado: Os inteiros: 139789394500800 139789394500856 As strings: 139789394500970 139789394500970Bem, os números têm identidades diferentes, enquanto as strings apresentaram identidades iguais. Isso significa que a comparação == com strings compara o id, e com números inteiros não? Não exatamente… Como o Python compara tipos primitivos?De fato, os ids eram os mesmos com as strings, mas, mesmo assim, não era isso que estava sendo comparado. Os tipos primitivos no Python já têm implementado nativamente suas próprias maneiras de se comparar. No caso do int e da string, o que se compara são seus valores. Como podemos mudar esse comportamento padrão do ==, então? Afinal, comparar o id dos objetos não é o que queremos! Precisamos, de alguma forma, basear nossa comparação em algum atributo do Filme. Quem vem de outras linguagens de programação, como Java, já deve conhecer métodos como o equals(), que pode ser sobrescrito para ter o comportamento alterado. Como isso funciona no Python? Conhecendo a rich comparisonNo Python temos como implementar algo similar ao equals(), mas ainda mais poderoso - a comparação rica, ou, como é tecnicamente conhecida, rich comparison . Com ela, podemos definir os seguintes métodos de comparação em uma classe:
No nosso caso, como estamos tratando de comparações de igualdade, focaremos no método __eq__() (mas é importante notar a possibilidade de implementação de todos os tipos básicos de comparação!). Precisamos, primeiro, saber o que queremos que seja comparado. Como precisamos que a comparação foque em algo único de cada filme, usaremos o próprio título. Então vamos implementar: class Filme(): def __eq__(self, outro_filme): return self.titulo == outro_filme.tituloAgora que aplicamos isso ao nosso código, vamos tentar procurar um filme em nosso acervo novamente: def tenho_o_filme(filme_procurado): meus_filmes = pega_todos_os_filmes() for filme in meus_filmes: if filme_procurado == filme: return True return False filme_procurado = Filme(‘A Teoria de Tudo’, ‘James Marsh’) if tenho_o_filme(filme_procurado): print(‘Tenho o filme!’) else: print(‘Não tenho :(‘)Dessa vez: Tenho o filme!Certo! Simplificando nossa verificação com o operador inPodemos, ainda, simplificar o código em nossa função tenho_o_filme() utilizando o operador in para verificar se o filme já está na lista, já que este operador também se baseia no retorno de ==: def tenho_o_filme(filme_procurado): meus_filmes = pega_todos_os_filmes() return filme_procurado in meus_filmesPeculiaridades da rich comparisonHá alguns aspectos interessantes de nosso código que valem a pena destacar. Em primeiro lugar, repare que não implementamos o método ne(), relativo ao operador !=. Mas o que acontece, então, se tentarmos usar esse operador? A partir do Python 3, o operador != retorna automaticamente o inverso do retorno do método __eq__(), se o método __ne__() não tiver sido implementado. Apesar disso, se sua classe herdar de outra em que o método __ne__() é definido (como é nos tipos primitivos), o comportamento do != se baseará no que é especificado nesse método, não no inverso do __eq__()! Por conta disso, é recomendável sempre declarar o método __ne__() quando quisermos implementar o __eq__(), tanto pela compatibilidade com o Python 2 (que sem esse método vai comparar os ids), quanto para evitar possíveis problemas em nosso código. Outro aspecto interessante de nosso código é que optamos por retornar um valor boolean. Sim, optamos! A rich comparison te permite um retorno de qualquer tipo. Isso significa que uma comparação do tipo a > b não precisa, necessariamente, nos devolver um boolean, mas pode devolver qualquer coisa que o desenvolvedor implementar. Em geral, optamos por retornar um boolean, mas há grandes e importantes projetos que alteram esse comportamento, como o SQLAlchemy, que usa essa feature para facilitar a criação de queries SQL, e até a biblioteca numpy, inspiração para a criação da rich comparison. ConclusãoNesse post, aprendemos a implementar métodos de comparação para nossas classes no Python utilizando a técnica de comparação rica. Agora entendemos como funcionam os operadores ==, !=, >, <, >=, <=. E aí? Agora não teremos problemas com comparações entre objetos que nós mesmos implementamos no Python! Se quiser se aprofundar mais na linguagem e conhecer outras features dela, dê uma olhada na nossa formação de Python para Web! Leia também: |