Làm thế nào tôi có thể đọc đầu vào dưới dạng số?


261

Tại sao xychuỗi thay vì ints trong đoạn mã dưới đây?

(Lưu ý: sử dụng Python 2.x. raw_input()Trong Python 3.x sử dụng input(). raw_input()Đã được đổi tên thành input()Python 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

Câu trả lời:


313

TLD

  • Python 3 không đánh giá dữ liệu nhận được bằng inputhàm, nhưng inputhàm của Python 2 thì có (đọc phần tiếp theo để hiểu hàm ý).
  • Hàm Python tương đương với Python 3 inputraw_inputhàm.

Python 2.x

Có hai chức năng để có được đầu vào của người dùng, được gọi inputraw_input. Sự khác biệt giữa chúng là, raw_inputkhông đánh giá dữ liệu và trả về như hiện tại, ở dạng chuỗi. Nhưng, inputsẽ đánh giá bất cứ điều gì bạn đã nhập và kết quả đánh giá sẽ được trả lại. Ví dụ,

>>> 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'>)

Dữ liệu 5 + 17được đánh giá và kết quả là 22. Khi nó đánh giá biểu thức 5 + 17, nó phát hiện ra rằng bạn đang thêm hai số và do đó kết quả cũng sẽ cùng intloại. Vì vậy, việc chuyển đổi loại được thực hiện miễn phí và 22được trả về là kết quả của inputvà được lưu trữ trong databiến. Bạn có thể nghĩ inputnhư là raw_inputsáng tác với một evalcuộc gọi.

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

Lưu ý: bạn nên cẩn thận khi sử dụng inputtrong Python 2.x. Tôi đã giải thích tại sao người ta nên cẩn thận khi sử dụng nó, trong câu trả lời này .

Nhưng, raw_inputkhông đánh giá đầu vào và trả về, như là một chuỗi.

>>> 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 inputvà Python 2.x raw_inputlà tương tự nhau và raw_inputkhông có sẵn trong 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'>)

Giải pháp

Để trả lời câu hỏi của bạn, vì Python 3.x không đánh giá và chuyển đổi loại dữ liệu, bạn phải chuyển đổi rõ ràng thành ints, với int, như thế này

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

Bạn có thể chấp nhận số của bất kỳ cơ sở nào và chuyển đổi chúng trực tiếp thành cơ sở 10 với intchức năng, như thế này

>>> 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

Tham số thứ hai cho biết đâu là cơ sở của các số được nhập và sau đó bên trong nó hiểu và chuyển đổi nó. Nếu dữ liệu nhập sai, nó sẽ ném a 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'

Đối với các giá trị có thể có thành phần phân số, loại sẽ floatthay vì int:

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

Ngoài ra, chương trình của bạn có thể được thay đổi một chút, như thế này

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

Bạn có thể thoát khỏi playbiến bằng cách sử dụng breakwhile True.


Có cách nào khác, như một hàm hoặc một cái gì đó để chúng ta không cần phải chuyển đổi sang int trong 3.x ngoài việc thực hiện chuyển đổi rõ ràng sang int ??
Shreyan Mehta

@ShreyanMehta evalsẽ hoạt động, nhưng đừng vì điều đó trừ khi bạn có lý do cấp bách.
thefourtheye

2
@thefourtheye ít nhất sử dụng ast.literal_evalcho điều đó. Nó không có mối quan tâm bảo mật eval.
quang phổ

4
Tôi sử dụng Q & A này làm mục tiêu dupe, nhưng có lẽ bạn có thể thêm TDLR với giải pháp python 3, tức là int(input()... ở trên cùng? Python 2 đã gần hết tuổi thọ và thông tin python 3 đã bị chôn vùi IMO
Chris_Rands

Phần cuối cùng về việc loại bỏ phát như một biến không thuận tiện vì việc phát biến làm cho mã dễ hiểu hơn. Và đưa ra gợi ý về cách mã có thể thay đổi mà không có lý do là không thực tế. Nếu không, đó là một câu trả lời hay :)
OuuGiii

44

Trong Python 3.x, raw_inputđã được đổi tên thành inputvà Python 2.x inputđã bị xóa.

Điều này có nghĩa là, giống như raw_input, inputtrong Python 3.x luôn trả về một đối tượng chuỗi.

Để khắc phục sự cố, bạn cần biến các đầu vào đó thành số nguyên một cách rõ ràng bằng cách đặt chúng vào int:

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

27

Đối với nhiều số nguyên trong một dòng, mapcó thể tốt hơn.

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

Nếu số đã được biết, (như 2 số nguyên), bạn có thể sử dụng

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

16

input()(Python 3) và raw_input()(Python 2) luôn trả về chuỗi. Chuyển đổi kết quả thành số nguyên rõ ràng với int().

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

11

Nhiều câu hỏi yêu cầu đầu vào cho một số nguyên trên một dòng. Cách tốt nhất là nhập toàn bộ chuỗi số một dòng và sau đó chia chúng thành số nguyên. Đây là phiên bản Python 3:

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

Ngoài ra một sự hiểu biết danh sách có thể được sử dụng

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

Và để chuyển đổi tất cả các đầu vào từ chuỗi sang int, chúng ta làm như sau

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

sẽ in các phần tử danh sách theo một đường thẳng.


6

Chuyển đổi sang số nguyên:

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

Tương tự cho các số dấu phẩy động:

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()))

vòng lặp for sẽ chạy số lần 'n'. 'n' thứ hai là chiều dài của mảng. câu lệnh cuối cùng ánh xạ các số nguyên vào một danh sách và nhận đầu vào ở dạng phân tách không gian. bạn cũng có thể trả về mảng ở cuối vòng lặp for.


3

Tôi gặp phải vấn đề lấy đầu vào số nguyên trong khi giải quyết vấn đề trên CodeChef , trong đó hai số nguyên - cách nhau bởi khoảng trắng - nên được đọc từ một dòng.

Mặc dù int(input())là đủ cho một số nguyên duy nhất, tôi không tìm thấy cách trực tiếp để nhập hai số nguyên. Tôi đã thử điều này:

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:])

Bây giờ tôi sử dụng num1 và num2 làm số nguyên. Hi vọng điêu nay co ich.


Điều này có vẻ rất thú vị. Tuy nhiên, không ibị phá hủy khi forvòng lặp được thoát?

@hosch250Khi một vòng lặp được thoát, giá trị của biến chỉ số (ở đây, i) vẫn còn. Tôi đã thử phần này, và nó hoạt động chính xác.
Aravind

1
Đối với loại thao tác nhập liệu này, bạn có thể hoặc num1, num2 = map(int, input().split())nếu bạn biết bạn sẽ gặp bao nhiêu số nguyên hoặc nums = list(map(int, input().split()))nếu bạn không.
301_Mond_P vĩnh viễn

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

Trong khi trong ví dụ của bạn, int(input(...))hiện các trick trong mọi trường hợp, python-future's builtins.inputlà giá trị xem xét vì đó đảm bảo công trình mã của bạn cho cả Python 2 và 3 hành vi mặc định vô hiệu hóa python2 của inputcố gắng để được 'thông minh' về kiểu dữ liệu đầu vào ( builtins.inputvề cơ bản chỉ cư xử như thế nào raw_input).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.