Ver Feed RSS

root@blog:/# chmod o+r *

[Curso de Python] Interação com o usuário - Parte 3

Avalie este Post de Blog

Antes de prosseguir leia os artigos anteriores aqui



No post anterior eu falei que usar a função input não é lá muito seguro, porém a função raw_input retorna somente strings, como resolver esse problema??

Interação com o usuário



A solução para nosso impasse é aprender a converter strings para outros valores. Vamos logo com isso então...

Vamos primeiro fazer o seguinte teste:
Código :
>>> n1 = raw_input("Digite o primeiro numero: ")
Digite o primeiro numero: 12
>>> print n1, type(n1)
12 <type 'str'>
>>>
Como disse, o raw_input retorna sempre uma strings, vamos ver agora como se dá a conversão:
Código :
>>> s1 = raw_input("Digite o primeiro numero: ")
Digite o primeiro numero: 12
>>> n1 = int(s1)
>>> print n1, type(n1)
12 <type 'int'>
>>>
Pronto, agora temos um inteiro. Vamos ver como seria o código do programa para somar dois numeros:
Código :
s1 = raw_input("Digite o primeiro numero: ")
s2 = raw_input("Digite o segundo numero: ")
soma = int(s1) + int(s2)
print 'Resultado: %(s1)s + %(s2)s = %(soma)d'%locals()
Exemplo de execução:
Código :
$ python soma.py
Digite o primeiro numero:10
Digite o segundo numero: 20
Resultado 10 + 20 = 30
Esse tipo de tratamento só tem um problema:
Código :
$ python soma.py
Digite o primeiro numero:10.5
Digite o segundo numero: 20
Resultado 10 + 20 = 30
Como nós especificamos que queremos inteiros (int) ele descarta a parte fracionária. O que podemos fazer é converter para ponto flutuante (float), o programa ficaria assim:
Código :
 s1 = raw_input("Digite o primeiro numero: ")
s2 = raw_input("Digite o segundo numero: ")
soma = float(s1) + float(s2)
print 'Resultado: %(s1)s + %(s2)s = %(soma)f'%locals()
Executando o programa teremos:
Código :
$ python soma.py
Digite o primeiro numero: 10.5
Digite o segundo numero: 7.2
Resultado: 10.5 + 7.2 = 17.700000
Pronto, temos números com ponto flutuante! E o que acontece se tentarmos executar o programa informando argumentos inválidos? Vamos ver...
Código :
$ python soma.py
Digite o primeiro numero: teste
Digite o segundo numero: 12
Traceback (most recent call last):
  File "soma.py", line 3, in <module>
    soma = float(s1) + float(s2)
ValueError: invalid literal for float(): teste
 
$ python soma.py
Digite o primeiro numero: [1,2, 3]
Digite o segundo numero: 12
Traceback (most recent call last):
  File "soma.py", line 3, in <module>
    soma = float(s1) + float(s2)
ValueError: invalid literal for float(): [1,2, 3]
Como vemos nosso programa está "protegido" dessas eventualidades!


Desafio
Pra quem ainda acompanha isso, deixo um outro desafio, fazer um programa que calcula a divisão de dois números e imprime o seu resultado. Lembrando, testem o programa com diversas entradas. Tem um pequeno detalhe nesse programa que vocês vão precisar resolver. No próximo post vou falar sobre isso.

Até mais...

Atualizado 01-09-2010 em 09:11 por Magnun

Categorias
Python , Artigos , Artigos , Cursos , Curso de Python

Comentários

Página 1 de 2 12 ÚltimoÚltimo
  1. Avatar de lord4rk
    A poucos dias achei os seus post's e achei muito bom, me ajudou muito com aprendizagem!!
    Por favor continue postando sobre python!!

    try:
    ... n1 = int(raw_input('Digite o primeiro numero: '))
    ... n2 = int(raw_input('Digite o segundo numero: '))
    ... resultado = n1 / n2
    ... print '%i / %i = %i' % (n1, n2, resultado)
    except:
    .... "Erro"


    []'s
    Jr.
  2. Avatar de Magnun
    Olá Lord4rk!!

    Muito boa a sua solução! Vejo que já conhece um pouco sobre Python pois fez uso da instrução try/except! Espero que você comente mais vezes por aqui! Vou continuar postando sim, não só nesse curso mas também sobre assuntos mais avançados (talvez esses venham a te interessar mais).

    Esse curso de Python que estou fazendo será de longa duração pois pretendo abordar desde o básico à orientação à objetos, criação de interfaces gráficas e estruturação de projetos python incluindo a hospedagem do projeto em sites como googlecode e launchpad.

    Se precisar de ajuda em algum projeto ou estiver disposto a colaborar, meus contatos estão acima! Até mais...
  3. Avatar de ilsahec
    muito bom
  4. Avatar de fabiocs
    obrigado por mais esta aula..
  5. Avatar de victoreng
    Olá Magnum,

    você está por aqui ainda? ou já cansou de aguentar agente enchendo você?? hehehe

    cara não entendi qual é o problema a ser resolvido q vc falou, eu executei esse programa

    #!/usr/bin/env python

    num1 = float(raw_input('num1: '))
    num2 = float(raw_input('num2: '))
    num3 = num1/num2
    print 'Resultado:',num3

    e não consegui entender o problema a ser resolvido, afinal ele está rodando "normal".

    Abraços.
  6. Avatar de Magnun
    Olá victoreng,

    Ainda estou por aqui sim! O problema na verdade era usando a conversão para int. Dessa forma a divisão é somente a parte inteira. Esse código dessa forma realmente está correto.

    Até mais...
  7. Avatar de Humildade
    Olá Magnun!

    Estou usando seu exemplo no IDLE :

    >>> n1 = raw_input("Digite o primeiro numero: ")
    Digite o primeiro numero:

    Mas o mesmo me retorna este erro:

    NameError: name 'raw_input' is not defined

    O que estou fazendo de errado?

    Abs
  8. Avatar de Magnun
    No Python 3 o raw_input deixou de existir e foi substituído pelo comando input (que agora tem a mesma funcionalidade do raw_input).
  9. Avatar de Humildade
    Hum!!!

    Agora entendi rs!

    Valeu mesmo em Magnun!

    Abs
  10. Avatar de fabraga
    :)
Página 1 de 2 12 ÚltimoÚltimo

+ Enviar Comentário