Python 2.7 recebendo entrada do usuário e manipulando como string sem aspas

144

Quero obter uma string de um usuário e depois manipulá-la.

testVar = input("Ask user for something.")

Existe uma maneira de testVar ser uma string sem que o usuário digite sua resposta entre aspas? ou seja, "Olá" vs. Olá

Se o usuário digitar Olá, eu recebo o seguinte erro:

NameError: o nome 'Hello' não está definido

Mike Lee
fonte
Veja a documentação . A partir de Python 2.7 inputchama automaticamenteeval()
0x45

Respostas:

261

Use em raw_input()vez de input():

testVar = raw_input("Ask user for something.")

input()realmente avalia a entrada como código Python. Sugiro nunca usá-lo. raw_input()retorna a sequência literal digitada pelo usuário.

Sven Marnach
fonte
107
Embora para quem lê isso usando o Python 3 , inputagora funcione dessa maneira, e o raw_input se foi.
Thomas K
3
Em que situação você gostaria de deixar o usuário inserir o código python no seu próprio código?
JFA 26/01
1
@JFA: Não acho que input()seja uma função útil e não recomendo usá-la.
Sven Marnach
11

A função inputtambém avaliará os dados que acabou de ler como código python, o que não é exatamente o que você deseja.

A abordagem genérica seria tratar a entrada do usuário (de sys.stdin) como qualquer outro arquivo. Experimentar

import sys
sys.stdin.readline()

Se você quiser mantê-lo breve, poderá usar raw_inputo mesmo valor, inputmas omitir a avaliação.

mandril
fonte
2
Além disso, se você estiver escrevendo um programa interativo, considere importar readline- isso fornecerá recursos semelhantes ao bash (histórico pronto para uso, o preenchimento automático exigirá algum trabalho)
Foo Bah
Bem feito! Eu uso a mesma função há muito tempo e sempre funcionou bem.
CFV 16/02
11

Podemos usar a raw_input()função no Python 2 e a input()função no Python 3. Por padrão, a função input recebe uma entrada no formato string. Para outro tipo de dados, você deve converter a entrada do usuário.

No Python 2, usamos a raw_input()função Ele espera que o usuário digite alguma entrada e pressione returne precisamos armazenar o valor em uma variável, lançando como nosso tipo de dados desejado. Tenha cuidado ao usar a conversão de tipo

x = raw_input("Enter a number: ") #String input

x = int(raw_input("Enter a number: ")) #integer input

x = float(raw_input("Enter a float number: ")) #float input

x = eval(raw_input("Enter a float number: ")) #eval input

No Python 3, usamos a função input () que retorna um valor de entrada do usuário.

x = input("Enter a number: ") #String input

Se você digitar uma string, int, float, eval será usada como entrada de string

x = int(input("Enter a number: ")) #integer input

Se você digitar uma string para int cast ValueError: invalid literal for int() with base 10:

x = float(input("Enter a float number: ")) #float input

Se você digitar uma sequência para a conversão de flutuação ValueError: could not convert string to float

x = eval(input("Enter a float number: ")) #eval input

Se você digitar uma cadeia de caracteres para eval cast, NameError: name ' ' is not defined esses erros também se aplicam ao Python 2.

Projesh Bhoumik
fonte
5

Se você deseja usar entrada em vez de raw_input no python 2.x, esse truque será útil

    if hasattr(__builtins__, 'raw_input'):
      input=raw_input

Após o qual,

testVar = input("Ask user for something.")

vai funcionar muito bem.

Prav001
fonte
2
testVar = raw_input("Ask user for something.")
Artur Gaspar
fonte
0

Meu código de trabalho com correções:

import random
import math
print "Welcome to Sam's Math Test"
num1= random.randint(1, 10)
num2= random.randint(1, 10)
num3= random.randint(1, 10)
list=[num1, num2, num3]
maxNum= max(list)
minNum= min(list)
sqrtOne= math.sqrt(num1)

correct= False
while(correct == False):
    guess1= input("Which number is the highest? "+ str(list) + ": ")
    if maxNum == guess1:
        print("Correct!")
        correct = True
    else:
        print("Incorrect, try again")

correct= False
while(correct == False):
guess2= input("Which number is the lowest? " + str(list) +": ")
if minNum == guess2:
     print("Correct!")
     correct = True
else:
    print("Incorrect, try again")

correct= False
while(correct == False):
    guess3= raw_input("Is the square root of " + str(num1) + " greater than or equal to 2? (y/n): ")
    if sqrtOne >= 2.0 and str(guess3) == "y":
        print("Correct!")
        correct = True
    elif sqrtOne < 2.0 and str(guess3) == "n":
        print("Correct!")
        correct = True
    else:
        print("Incorrect, try again")

print("Thanks for playing!")
st_443
fonte
0

Este é o meu trabalho para evitar falhas no caso de precisar mudar para o python 3 no futuro.

def _input(msg):
  return raw_input(msg)
Mak
fonte
-6

O problema parece ter sido resolvido no Python versão 3.4.2.

testVar = input("Ask user for something.")

Vai funcionar bem.

Sanjay Ursal
fonte
3
O Python 3.x inputé equivalente ao Python 2.x raw_input(consulte docs.python.org/3.0/whatsnew/3.0.html#builtins ); esse é um problema específico do 2.x.
jonrsharpe