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


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.


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.


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.


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.



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!")

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)

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.