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

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



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

0

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

def _input(msg):
  return raw_input(msg)

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.