Python 2.7 отримує введення користувача та маніпулює як рядок без лапок


144

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

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

Чи є спосіб testVar бути рядком без того, щоб користувач вводив відповідь у лапки? тобто "Hello" vs. Hello

Якщо користувач набирає в Hello, я отримую таку помилку:

NameError: назва "Привіт" не визначено


Дивіться документацію . Станом на 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

Якщо ви хочете використовувати введення замість 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.