Python 2.7 otrzymuje dane wejściowe użytkownika i manipuluje jako ciąg znaków bez cudzysłowów

144

Chcę uzyskać ciąg znaków od użytkownika, a następnie nim manipulować.

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

Czy istnieje sposób, aby testVar był ciągiem znaków bez konieczności wpisywania przeze mnie odpowiedzi w cudzysłowie? tj. „Hello” vs. Hello

Jeśli użytkownik wpisze Hello, pojawia się następujący błąd:

NameError: nazwa „Hello” nie jest zdefiniowana

Mike Lee
źródło
Zobacz dokumentację . Od wersji Pythona 2.7 inputautomatycznie wywołujeeval()
0x45

Odpowiedzi:

261

Użyj raw_input()zamiast input():

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

input()w rzeczywistości ocenia dane wejściowe jako kod Pythona. Radzę nigdy go nie używać. raw_input()zwraca dosłowny ciąg znaków wprowadzony przez użytkownika.

Sven Marnach
źródło
107
Chociaż dla każdego, kto czyta to przy użyciu Pythona 3 , inputteraz działa w ten sposób, a raw_input zniknął.
Thomas K,
3
W jakiej sytuacji chciałbyś pozwolić użytkownikowi wstawić kod Pythona do własnego kodu?
JFA
1
@JFA: Myślę, że nie input()jest to użyteczna funkcja i nie polecam jej używania.
Sven Marnach
11

Funkcja inputoceni również dane, które właśnie odczytała, jako kod Pythona, co nie jest tym, czego chcesz.

Ogólnym podejściem byłoby traktowanie danych wejściowych użytkownika (z sys.stdin) jak każdego innego pliku. Próbować

import sys
sys.stdin.readline()

Jeśli chcesz, aby był krótki, możesz użyć raw_inputtego samego co inputocena, ale pomija.

głaskanie pod brodę
źródło
2
także, jeśli piszesz program interaktywny, rozważ importowanie readline- da to funkcje podobne do bash (historia po wyjęciu z pudełka, automatyczne uzupełnianie będzie wymagało trochę pracy)
Foo Bah
Dobra robota! Używam tej samej funkcji od wieków i zawsze działała dobrze.
CFV
11

Możemy użyć raw_input()funkcji w Pythonie 2 i input()funkcji w Pythonie 3. Domyślnie funkcja wejściowa przyjmuje dane wejściowe w formacie łańcucha. W przypadku innych typów danych musisz przesłać dane wejściowe użytkownika.

W Pythonie 2 używamy raw_input()funkcji. Czeka, aż użytkownik wpisze jakieś dane wejściowe i naciśnie, returna my musimy zapisać wartość w zmiennej, rzutując jako nasz pożądany typ danych. Zachowaj ostrożność podczas używania rzutowania czcionek

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

W Pythonie 3 używamy funkcji input (), która zwraca wartość wprowadzoną przez użytkownika.

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

Jeśli wprowadzisz string, int, float, eval, przyjmie to jako ciąg wejściowy

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

Jeśli wprowadzisz ciąg dla int cast ValueError: invalid literal for int() with base 10:

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

Jeśli wprowadzisz ciąg dla rzutowania typu float ValueError: could not convert string to float

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

Jeśli wprowadzisz ciąg dla rzutowania eval NameError: name ' ' is not defined Ten błąd dotyczy również Pythona 2.

Projesh Bhoumik
źródło
5

Jeśli chcesz użyć input zamiast raw_input w pythonie 2.x, ta sztuczka się przyda

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

Po czym,

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

będzie działać dobrze.

Prav001
źródło
2
testVar = raw_input("Ask user for something.")
Artur Gaspar
źródło
0

Mój działający kod z poprawkami:

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
źródło
0

To jest moja praca, aby uniknąć awarii w przypadku, gdy będę musiał przejść na Python 3 w przyszłości.

def _input(msg):
  return raw_input(msg)
Mak
źródło
-6

Wydaje się, że problem został rozwiązany w wersji 3.4.2 języka Python.

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

Będzie działać dobrze.

Sanjay Ursal
źródło
3
Python 3.x inputjest odpowiednikiem Pythona 2.x raw_input(patrz docs.python.org/3.0/whatsnew/3.0.html#builtins ); jest to problem specyficzny dla wersji 2.x.
jonrsharpe