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


261

ทำไม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

คำตอบ:


313

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


มีวิธีอื่นเช่นฟังก์ชั่นหรือบางสิ่งบางอย่างเพื่อที่เราไม่จำเป็นต้องแปลงเป็น int ใน 3.x นอกเหนือจากการทำการแปลงที่ชัดเจนเป็น int หรือไม่?
Shreyan Mehta

@ShreyanMehta evalจะทำงานได้ แต่อย่าไปทำแบบนั้นเว้นแต่คุณจะมีเหตุผลเร่งด่วน
thefourtheye

2
@thefourtheye อย่างน้อยใช้ast.literal_evalสำหรับสิ่งนั้น evalมันไม่ได้มีความกังวลด้านความปลอดภัยของ
spectra

4
ฉันใช้คำถามและคำตอบนี้เป็นเป้าหมายล่อลวง แต่บางทีคุณสามารถเพิ่ม TDLR ด้วยโซลูชัน python 3 นั่นคือint(input()... ที่ด้านบน? Python 2 ใกล้จะจบชีวิตแล้วและข้อมูลของ Python 3 ถูกฝังอยู่เกินไป IMO
Chris_Rands

บิตสุดท้ายเกี่ยวกับการลบการเล่นเป็นตัวแปรนั้นไม่สะดวกอย่างที่การเล่นตัวแปรทำให้รหัสนั้นเข้าใจได้ง่ายขึ้น และการให้คำแนะนำว่ารหัสสามารถเปลี่ยนแปลงได้อย่างไรโดยไม่มีเหตุผลไม่ใช่วิธีปฏิบัติที่ดี มิฉะนั้นจะเป็นคำตอบที่ดี :)
35445

44

ใน 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: "))

27

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

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

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

num1, num2 = map(int, raw_input().split())

16

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

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

11

คำถามหลายข้อต้องการอินพุตสำหรับจำนวนเต็มจำนวนมากในบรรทัดเดียว วิธีที่ดีที่สุดคือการป้อนสตริงทั้งหมดของตัวเลขหนึ่งบรรทัดแล้วแยกให้เป็นจำนวนเต็ม นี่คือเวอร์ชั่น 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

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

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

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

my_decimalnumber = float(input("enter the number"))

4
n=int(input())
for i in range(n):
    n=input()
    n=int(n)
    arr1=list(map(int,input().split()))

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


3

ฉันพบปัญหาในการรับอินพุตจำนวนเต็มขณะที่แก้ปัญหาใน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 เป็นจำนวนเต็ม หวังว่านี่จะช่วยได้


มันดูน่าสนใจมาก อย่างไรก็ตามจะไม่iถูกทำลายเมื่อforออกจากลูปหรือไม่

@hosch250เมื่อออกจากลูปแล้วค่าของตัวแปรดัชนี (ที่นี่i) จะยังคงอยู่ ฉันลองใช้งานชิ้นนี้และทำงานได้อย่างถูกต้อง
Aravind

1
สำหรับการจัดการอินพุตแบบนี้คุณสามารถทำได้num1, num2 = map(int, input().split())ถ้าคุณรู้ว่าคุณจะพบจำนวนเต็มเท่าไรหรือnums = list(map(int, input().split()))ถ้าไม่
301_Moved_Permanently

3
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

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

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