Qual é a diferença entre `raw_input ()` e `input ()` no Python 3?

362

Qual é a diferença entre raw_input()e input()no Python 3?

pkumar
fonte
3
Como você cria um programa que aceita entradas compatíveis com Python 2 e Python 3?
Solomon Ucko 04/04
2
Para fazer isso você tentar definir inputa raw_inpute ignorar erros de nome.
Solomon Ucko
3
Procure a biblioteca 'six' para compatibilidade com python 2 e 3.
21417 Jack Homan #

Respostas:

418

A diferença é que raw_input()não existe no Python 3.x, enquanto existe input(). Na verdade, o antigo raw_input()foi renomeado para input()e o antigo input()se foi, mas pode ser facilmente simulado usando eval(input()). (Lembre-se de que isso eval()é mau. Tente usar maneiras mais seguras de analisar sua opinião, se possível.)

Sven Marnach
fonte
93
"Qual é a diferença entre raw_input...?" - "A diferença é que não há raw_input." ... Uma diferença drástica, eu diria!
21415 ivan_pozdeev
9
No Python 2, acho que eles assumiram que os programadores realmente queriam "executar" como um comando que a entrada do usuário, pois inicialmente (eu acho) solicitar a entrada do usuário pode ser apenas para isso. Mas quando perceberam que os programadores também podem querer obter a entrada "bruta", eles projetaram outra função chamada "raw_input". No Python 3, eles perceberam o que era estúpido e simplesmente excluíram a execução do padrão de entrada original, produzindo apenas uma função simples.
JC Rocamonde
11
Repl.it, a execução do Py3.5.1 tem raw_input () como uma palavra-chave.
OldBunny2800
2
É preciso dizer que eval(e exec) geralmente deve ser evitado, porque eles podem ser um risco à segurança. Para detalhes, consulte Eval é realmente perigoso pelo veterano do SO Ned Batchelder. E é claro que esse conselho também se aplica ao antigo Python 2 input.
PM 2Ring
11
@ PM2Ring Adicionei um aviso à resposta. É claro que existem casos de uso válidos para ambos eval()e exec(), mas primeiro você precisa entender por que não usar eval()antes de decidir usá-lo.
precisa saber é o seguinte
192

No Python 2 , raw_input()retorna uma string e input()tenta executar a entrada como uma expressão Python.

Como obter uma string quase sempre era o que você queria, o Python 3 faz isso input(). Como diz Sven, se você quiser o comportamento antigo, eval(input())funciona.

Thomas K
fonte
7
Você deve adicionar que o Python 3 não possui raw_input().
5133 Martin Thoma #
qual é a utilidade da execução de entrada como expressão python?
Akshay Vijay Jain
11
@AkshayVijayJain, provavelmente foi destinado a inserir números. Mas é totalmente inseguro.
MarSoft
112

Python 2:

  • raw_input() pega exatamente o que o usuário digitou e passa de volta como uma string.

  • input()primeiro pega o raw_input()e depois executa um eval()nele também.

A principal diferença é que input()espera uma declaração python sintaticamente correta, onde raw_input()não.

Python 3:

  • raw_input()foi renomeado para input()agora input()retorna a string exata.
  • Antigo input()foi removido.

Se você deseja usar o antigo input(), o que significa que você precisa avaliar uma entrada do usuário como uma instrução python, é necessário fazê-lo manualmente usando eval(input()).

brilho da tela
fonte
26

No Python 3, raw_input()não existe o que já foi mencionado por Sven.

No Python 2, a input()função avalia sua entrada.

Exemplo:

name = input("what is your name ?")
what is your name ?harsha

Traceback (most recent call last):
  File "<pyshell#0>", line 1, in <module>
    name = input("what is your name ?")
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

No exemplo acima, o Python 2.x está tentando avaliar harsha como uma variável e não como uma string. Para evitar isso, podemos usar aspas duplas em torno de nossa entrada como "harsha":

>>> name = input("what is your name?")
what is your name?"harsha"
>>> print(name)
harsha

raw_input ()

A função raw_input () `não avalia, apenas lê o que você digita.

Exemplo:

name = raw_input("what is your name ?")
what is your name ?harsha
>>> name
'harsha'

Exemplo:

 name = eval(raw_input("what is your name?"))
what is your name?harsha

Traceback (most recent call last):
  File "<pyshell#11>", line 1, in <module>
    name = eval(raw_input("what is your name?"))
  File "<string>", line 1, in <module>
NameError: name 'harsha' is not defined

No exemplo acima, eu estava apenas tentando avaliar a entrada do usuário com a evalfunção

Harsha Vardhan
fonte
7

Gostaria de adicionar um pouco mais de detalhes à explicação fornecida por todos para os usuários do python 2 . raw_input(), que, a essa altura, você sabe que avalia os dados inseridos pelo usuário como uma sequência. Isso significa que o python nem tenta entender os dados inseridos novamente. Tudo o que consideraremos é que os dados inseridos serão string, independentemente de ser uma string ou int real ou algo assim.

Enquanto, input()por outro lado, tenta entender os dados inseridos pelo usuário. Assim, a entrada like helloworldmostraria o erro como ' helloworld is undefined'.

Concluindo, para o python 2 , para inserir uma string também, é necessário inseri-la como ' helloworld', que é a estrutura comum usada no python para usar strings.

Rubal
fonte
3

Se você deseja garantir que seu código esteja sendo executado com python2 e python3, use a função input () no seu script e adicione-a ao início do seu script:

from sys import version_info
if version_info.major == 3:
    pass
elif version_info.major == 2:
    try:
        input = raw_input
    except NameError:
        pass
else:
    print ("Unknown python version - input function not safe")
Josef Klotzner
fonte