No Python 2.x nós temos 2 modos de entrada de dados o
input() e
raw_input()Primeiro vamos entender como cada um funciona pra depois sabermos como ficou agora e porque a mudança no Python 3
raw_input()o raw_input() captura pela entrada padrão (sys.stdin.readline) tudo o que você digita (até apertar "enter") e lhe retorna como uma string, mais simples que isso impossivel, opcionalmente você pode também colocar uma mensagem quando chama o raw_input()
ex:
>>> raw_input()
1, 2, 3 # <-- usuario digita
'1, 2, 3'
raw_input retornou a string "1, 2, 3"
Se quisermos avisar o que tipo de dado estamos esperando podemos fazer:
>>> raw_input("Digite seu nome: ")
Digite seu nome: Larry # <-- usuario digita
'Larry'
Simples sem misterios.
input()o input por outro lado é muito mais "esperto", tão esperto que a maioria embora acha que saiba, na verdade não tem noção de como ele funciona (eu já estive nesta lista)
muitos o input() é muito parecido com o raw_input() com a diferenca dele "avaliar" os tipo de dados e retornar os tipo "certo"
ex:
>>> x = input()
1
>>> type(x)
#input avalia a entrada como um inteiro
>>> input()
1, 2, 3
(1, 2, 3) # input retornava uma tupla de 3 inteiros
>>> input()
1, haha, 4.8
(1, 'haha', 4.8) #input retornava uma tupla com um inteiro uma string e um float
Então você pensa: "esse é o kra que eu vou usar sempre"
Mas o buraco é mais embaixo do que você pensa
ex:
>>> input("usuario digita: ")
usuario digita: if x
Traceback (most recent call last):
File "", line 1, in ;
File "", line 1
if x
^
SyntaxError: invalid syntax
WTF???
Sim amigo ele faz mais do que você pensa.
O "esperado" seria uma string "if x"
Na verdade o input() pega o que você digita, roda e da um retorno como uma expressão python, na verdade você disponibiliza um "terminal" python e pega o retorno
ex:
>>> x = 2
>>> input("usuario digita: ")
usuario digita: x + 3
5 #retorno de input() sera o valor da variavel x mais o int 3
>>> input("usuario digita: ")
usuario digita: x == 4 and "ola" or "NAUM e PAH"
"NAUM e PAH"
Se não for bem tratado isso pode ser MUITO perigoso.
Enquanto isso no Python 3...No python 3.0 isso foi mudado, o raw_input() foi renomeado para input() se tornando o input padrão
- E o input() antigo?
Foi sumariamente REMOVIDO, exterminado, jogaram ele no marmore do inferno
Mas nem tudo está perdido, se você prestou atenção deve ter percebido que existe alguém que praticamente a mesma coisa que o antigo input com um pequena diferença. Eu estou falando do
eval():
O eval() recebe um string faz e o mesmo que o antigo input() (na verdade seria o contrario, o input() faz o mesmo que o eval()), ele
avalia a string no interpretador python e retorna o resultado da expressão, da mesma forma que o console python faz.
Entao para se ter o mesmo efeito do antigo input basta chamar a funcao eval() pro retorno de input
>>> input()
1, 2, 3 # <-- usario digita
'1, 2, 3" # <-- string
>>> eval('1, 2, 3")
(1, 2, 3)
#portanto
>>> eval(input())
1, 2, 3 # <-- usario digita
(1, 2, 3) # <-- tupla
Quando você for converter seus programas python 2.x para 3 bastar usar
eval(input()) e você terá o mesmo efeito (mas agora você sabe o motivo ;-) )
mais posts sobre Python:
1 -
Vantagens do novo print do Python 32 -
Diferencas entre o Python 3 vs Python 2.x3 -
Edje / QEdje (usando Python)
4 -
Receitas com Python5 -
Mini Curso PyGame - JED 2008