ฉันจะอ่านอินพุตเป็นตัวเลขได้อย่างไร

Dec 08 2013

เหตุใดจึงเป็นสตริงxและyแทนที่จะเป็น ints ในโค้ดด้านล่าง

(หมายเหตุ: ในการใช้งาน 2.x หลามraw_input(). ในหลามใช้ 3.x input(). raw_input()ถูกเปลี่ยนชื่อinput()ในหลาม 3.x)

play = True

while play:

    x = input("Enter a number: ")
    y = input("Enter a number: ")

    print(x + y)
    print(x - y)
    print(x * y)
    print(x / y)
    print(x % y)

    if input("Play again? ") == "no":
        play = False

คำตอบ

328 thefourtheye Dec 08 2013 at 10:08

TLDR

  • Python 3 ไม่ได้ประเมินข้อมูลที่ได้รับด้วยinputฟังก์ชัน แต่inputฟังก์ชันของ Python 2 ทำ (อ่านหัวข้อถัดไปเพื่อทำความเข้าใจความหมาย)
  • Python 2 เทียบเท่ากับ Python 3 inputคือraw_inputฟังก์ชัน

Python 2.x

มีสองฟังก์ชั่นที่จะได้รับการป้อนข้อมูลของผู้ใช้ที่เรียกว่าเป็นและinput raw_inputความแตกต่างระหว่างพวกเขาคือraw_inputไม่ได้ประเมินข้อมูลและส่งคืนตามที่เป็นอยู่ในรูปแบบสตริง แต่inputจะประเมินสิ่งที่คุณป้อนและผลการประเมินจะถูกส่งกลับ ตัวอย่างเช่น,

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

ข้อมูลที่ได้รับการประเมินและผลที่ได้คือ5 + 17 22เมื่อประเมินนิพจน์5 + 17ตรวจพบว่าคุณกำลังเพิ่มตัวเลขสองตัวดังนั้นผลลัพธ์จะเป็นintประเภทเดียวกันด้วย ดังนั้นการแปลงประเภทจึงทำได้ฟรีและ22ส่งคืนเป็นผลลัพธ์inputและเก็บไว้ในdataตัวแปร คุณสามารถคิดinputเป็นraw_inputประกอบกับevalการโทร

>>> data = eval(raw_input("Enter a number: "))
Enter a number: 5 + 17
>>> data, type(data)
(22, <type 'int'>)

หมายเหตุ:คุณควรระมัดระวังเมื่อใช้inputใน Python 2.x ฉันอธิบายว่าเหตุใดจึงควรระมัดระวังเมื่อใช้งานในคำตอบนี้

แต่raw_inputไม่ได้ประเมินอินพุตและส่งคืนตามที่เป็นอยู่ในรูปแบบสตริง

>>> import sys
>>> sys.version
'2.7.6 (default, Mar 22 2014, 22:59:56) \n[GCC 4.8.2]'
>>> data = raw_input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <type 'str'>)

Python 3.x

Python 3.x inputและ Python 2.x raw_inputคล้ายกันและraw_inputไม่มีใน Python 3.x

>>> import sys
>>> sys.version
'3.4.0 (default, Apr 11 2014, 13:05:11) \n[GCC 4.8.2]'
>>> data = input("Enter a number: ")
Enter a number: 5 + 17
>>> data, type(data)
('5 + 17', <class 'str'>)

วิธีการแก้

เพื่อตอบคำถามของคุณเนื่องจาก Python 3.x ไม่ได้ประเมินและแปลงประเภทข้อมูลคุณต้องแปลงเป็นints อย่างชัดเจนด้วยintเช่นนี้

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))

คุณสามารถยอมรับตัวเลขของฐานใดก็ได้และแปลงเป็นฐาน 10 โดยตรงด้วยintฟังก์ชันเช่นนี้

>>> data = int(input("Enter a number: "), 8)
Enter a number: 777
>>> data
511
>>> data = int(input("Enter a number: "), 16)
Enter a number: FFFF
>>> data
65535
>>> data = int(input("Enter a number: "), 2)
Enter a number: 10101010101
>>> data
1365

พารามิเตอร์ที่สองบอกว่าอะไรคือฐานของตัวเลขที่ป้อนจากนั้นภายในจะเข้าใจและแปลงค่านั้น หากข้อมูลที่ป้อนไม่ถูกต้องมันจะส่งไฟล์ValueError.

>>> data = int(input("Enter a number: "), 2)
Enter a number: 1234
Traceback (most recent call last):
  File "<input>", line 1, in <module>
ValueError: invalid literal for int() with base 2: '1234'

สำหรับค่าที่สามารถมีส่วนประกอบเศษส่วนประเภทจะเป็นfloatมากกว่าint:

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

นอกเหนือจากนั้นโปรแกรมของคุณสามารถเปลี่ยนแปลงได้เล็กน้อยเช่นนี้

while True:
    ...
    ...
    if input("Play again? ") == "no":
        break

คุณจะได้รับการกำจัดของplayตัวแปรโดยใช้และbreakwhile True

47 Noname Dec 08 2013 at 10:09

ใน Python 3.x raw_inputถูกเปลี่ยนชื่อเป็นinputและ Python 2.x inputถูกลบออก

ซึ่งหมายความว่าเช่นเดียวกับraw_input, inputในหลาม 3.x เสมอกลับวัตถุสตริง

ในการแก้ไขปัญหาคุณต้องทำให้อินพุตเหล่านั้นเป็นจำนวนเต็มอย่างชัดเจนโดยใส่ในint:

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
29 user1341043 Nov 11 2014 at 07:32

สำหรับจำนวนเต็มหลายรายการในบรรทัดเดียวmapอาจจะดีกว่า

arr = map(int, raw_input().split())

หากทราบจำนวนอยู่แล้ว (เช่นจำนวนเต็ม 2 จำนวน) คุณสามารถใช้

num1, num2 = map(int, raw_input().split())
18 MartijnPieters Dec 08 2013 at 10:09

input()(งูใหญ่ 3) และraw_input()(งูหลาม 2) เสมอกลับสตริง int()แปลงผลให้จำนวนเต็มอย่างชัดเจนด้วย

x = int(input("Enter a number: "))
y = int(input("Enter a number: "))
12 gumboy Jul 08 2014 at 07:13

คำถามหลายข้อต้องการการป้อนข้อมูลสำหรับจำนวนเต็มหลายตัวในบรรทัดเดียว วิธีที่ดีที่สุดคือป้อนสตริงทั้งหมดของตัวเลขหนึ่งบรรทัดจากนั้นแยกเป็นจำนวนเต็ม นี่คือ Python 3 เวอร์ชัน:

a = []
p = input()
p = p.split()      
for i in p:
    a.append(int(i))

นอกจากนี้ยังสามารถใช้ความเข้าใจในรายการ

p = input().split("whatever the seperator is")

และในการแปลงอินพุตทั้งหมดจากสตริงเป็น int เราทำสิ่งต่อไปนี้

x = [int(i) for i in p]
print(x, end=' ')

จะต้องพิมพ์องค์ประกอบรายการเป็นเส้นตรง

6 HemanthSavasere Apr 17 2016 at 23:20

แปลงเป็นจำนวนเต็ม:

my_number = int(input("enter the number"))

ในทำนองเดียวกันสำหรับตัวเลขทศนิยม:

my_decimalnumber = float(input("enter the number"))
4 ravitanwar Aug 03 2018 at 23:30
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

for loop จะต้องรันจำนวนครั้ง 'n' 'n' ที่สองคือความยาวของอาร์เรย์ คำสั่งสุดท้ายจะจับคู่จำนวนเต็มกับรายการและรับอินพุตในรูปแบบที่คั่นด้วยช่องว่าง คุณยังสามารถส่งคืนอาร์เรย์ที่ส่วนท้ายของสำหรับลูป

3 Aravind May 23 2014 at 18:32

ฉันพบปัญหาในการป้อนข้อมูลจำนวนเต็มในขณะที่แก้ปัญหาบนCodeChefซึ่งควรอ่านจำนวนเต็มสองจำนวน - คั่นด้วยช่องว่างจากหนึ่งบรรทัด

แม้ว่าint(input())จะเพียงพอสำหรับจำนวนเต็มเดียว แต่ฉันไม่พบวิธีโดยตรงในการป้อนจำนวนเต็มสองจำนวน ฉันลองสิ่งนี้:

num = input()
num1 = 0
num2 = 0

for i in range(len(num)):
    if num[i] == ' ':
        break

num1 = int(num[:i])
num2 = int(num[i+1:])

ตอนนี้ฉันใช้ num1 และ num2 เป็นจำนวนเต็ม หวังว่านี่จะช่วยได้

3 Sanyal Jun 30 2015 at 16:16
def dbz():
    try:
        r = raw_input("Enter number:")
        if r.isdigit():
            i = int(raw_input("Enter divident:"))
            d = int(r)/i
            print "O/p is -:",d
        else:
            print "Not a number"
    except Exception ,e:
        print "Program halted incorrect data entered",type(e)
dbz()

Or 

num = input("Enter Number:")#"input" will accept only numbers
2 TobiasKienzler Nov 23 2016 at 19:19

ในขณะที่ตัวอย่างของคุณint(input(...))ไม่หลอกลวงในกรณีใด ๆpython-future's builtins.inputเป็นมูลค่าการพิจารณาตั้งแต่ที่ทำให้แน่ใจว่าการทำงานของรหัสของคุณสำหรับทั้งงูหลามที่ 2 และ 3 และพฤติกรรมเริ่มต้นพิการ Python2 ของinputการพยายามที่จะ 'ฉลาด' เกี่ยวกับประเภทการป้อนข้อมูล ( builtins.inputพื้นเพียง มีพฤติกรรมเหมือนraw_input)