Python 2.7 ได้รับการป้อนข้อมูลของผู้ใช้และจัดการเป็นสตริงโดยไม่มีการเสนอราคา


144

ฉันต้องการรับสายจากผู้ใช้แล้วจัดการมัน

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

มีวิธีให้ testVar เป็นสตริงโดยที่ฉันไม่ได้ให้ผู้ใช้พิมพ์คำตอบของเขาในเครื่องหมายคำพูด? เช่น "Hello" กับ Hello

หากผู้ใช้พิมพ์ใน Hello ฉันได้รับข้อผิดพลาดต่อไปนี้:

NameError: ชื่อ 'Hello' ไม่ได้ถูกกำหนดไว้


เอกสารดู ในฐานะของหลาม 2.7 inputโทรอัตโนมัติeval()
0x45

คำตอบ:


261

ใช้raw_input()แทนinput():

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

input()จริง ๆ ประเมินการป้อนข้อมูลเป็นรหัสหลาม ฉันแนะนำว่าอย่าใช้มัน raw_input()ส่งคืนสตริง verbatim ที่ป้อนโดยผู้ใช้


107
แม้ว่าสำหรับทุกคนที่อ่านข้อความนี้ใช้งูหลาม3 , inputตอนนี้ทำงานด้วยวิธีนี้และ raw_input จะหายไป
โทมัส K

3
สถานการณ์ใดที่คุณต้องการให้ผู้ใช้แทรกรหัสไพ ธ อนลงในโค้ดของคุณเอง?
JFA

1
@JFA: ฉันไม่คิดว่าinput()เป็นฟังก์ชันที่มีประโยชน์และฉันไม่แนะนำให้ใช้
Sven Marnach

11

ฟังก์ชั่นinputจะประเมินข้อมูลที่เพิ่งอ่านเป็นรหัสไพ ธ อนซึ่งไม่ใช่สิ่งที่คุณต้องการ

วิธีการทั่วไปคือการปฏิบัติต่อการป้อนข้อมูลผู้ใช้ (จากsys.stdin) เช่นไฟล์อื่น ๆ ลอง

import sys
sys.stdin.readline()

หากคุณต้องการให้มันสั้นคุณสามารถใช้raw_inputซึ่งเหมือนกันinputแต่ละเว้นการประเมิน


2
นอกจากนี้หากคุณกำลังเขียนโปรแกรมแบบอินเทอร์แอคทีฟลองนำเข้าreadline- นี่จะให้คุณสมบัติที่คล้ายกับทุบตี (ประวัติออกนอกกรอบการกรอกข้อมูลอัตโนมัติจะต้องใช้งานบางอย่าง)
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)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.