Python 2.7 получает пользовательский ввод и манипулирует как строка без кавычек

144

Я хочу получить строку от пользователя, а затем манипулировать ею.

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

Есть ли способ для testVar быть строкой без того, чтобы пользователь вводил свой ответ в кавычках? то есть "Привет" против Привет

Если пользователь вводит Hello, я получаю следующую ошибку:

NameError: имя 'Hello' не определено

Майк Ли
источник
Смотрите документацию . По состоянию на Python 2.7 inputавтоматически вызываетeval()
0x45

Ответы:

261

Используйте raw_input()вместо input():

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

input()фактически оценивает ввод как код Python. Я предлагаю никогда не использовать это. raw_input()возвращает дословную строку, введенную пользователем.

Свен Марнах
источник
107
Хотя для тех, кто читает это с использованием Python 3 , inputтеперь работает таким образом, и raw_input пропал.
Томас К
3
В какой ситуации вы хотели бы позволить пользователю вставлять код Python в ваш собственный код?
JFA
1
@JFA: Я не думаю, что input()это полезная функция, и я не рекомендую ее использовать.
Свен Марнах
11

Функция inputтакже будет оценивать данные, которые она только что прочитала, как код Python, что на самом деле не то, что вам нужно.

Общий подход заключается в обработке пользовательского ввода (из sys.stdin), как и любой другой файл. Пытаться

import sys
sys.stdin.readline()

Если вы хотите, чтобы оно было коротким, вы можете использовать raw_inputто же самое, что inputи оценка, но опускается.

зажимной патрон
источник
2
также, если вы пишете интерактивную программу, подумайте об импорте readline- это даст функции, аналогичные bash (история из коробки, автозаполнение потребует некоторой работы)
Foo Bah
Отлично сработано! Я использовал одну и ту же функцию целую вечность, и она всегда работала хорошо.
CFV
11

Мы можем использовать raw_input()функцию в Python 2 и input()функцию в Python 3. По умолчанию функция ввода принимает ввод в строковом формате. Для другого типа данных вы должны привести пользовательский ввод.

В Python 2 мы используем raw_input()функцию. Он ждет, пока пользователь наберет какой-нибудь ввод и нажмет, returnи нам нужно сохранить значение в переменной, приведя его к типу данных, который нам нужен. Будьте осторожны при использовании литья типов

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

В Python 3 мы используем функцию input (), которая возвращает пользовательское значение ввода.

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

Если вы введете строку, int, float, eval, то она будет принимать в качестве ввода строки

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

Если вы введете строку для int cast ValueError: invalid literal for int() with base 10:

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

Если вы введете строку для бросания с плавающей точкой ValueError: could not convert string to float

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

Если вы введете строку для eval cast NameError: name ' ' is not defined Эти ошибки также применимы для Python 2.

Проеш Бхумик
источник
5

Если вы хотите использовать input вместо raw_input в python 2.x, этот трюк пригодится

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

После которого,

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

будет работать просто отлично.

Prav001
источник
2
testVar = raw_input("Ask user for something.")
Артур Гаспар
источник
0

Мой рабочий код с исправлениями:

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
источник
0

Это моя работа по отказоустойчивости на случай, если в будущем мне понадобится перейти на python 3.

def _input(msg):
  return raw_input(msg)
Mak
источник
-6

Кажется, проблема решена в Python версии 3.4.2.

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

Будет работать нормально.

Санджай Урсал
источник
3
Python 3.x inputэквивалентен Python 2.x raw_input(см. Docs.python.org/3.0/whatsnew/3.0.html#builtins ); это проблема, специфичная для 2.x.
Джоншарп