Girişleri sayı olarak nasıl okuyabilirim?


261

Neden aşağıdaki kodda ints yerine xve ydizeleri var?

(Not: Python 2.x kullanımında raw_input(). Python 3.x kullanımında input(). Python 3.x'te raw_input()yeniden adlandırılmıştır input())

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

Yanıtlar:


313

TLDR

  • Python 3, inputişlevle alınan verileri değerlendirmez , ancak Python 2'nin inputişlevi yapar (anlamını anlamak için bir sonraki bölümü okuyun).
  • Python 3 yılların Python 2'nin eşdeğer inputolduğunu raw_inputişlevi.

Python 2.x

inputVe olarak adlandırılan kullanıcı girdisini almak için iki işlev vardı raw_input. Aralarındaki fark raw_input, verileri değerlendirmez ve dize biçiminde olduğu gibi döndürür. Ancak, inputgirdiğiniz her şeyi değerlendirecek ve değerlendirme sonucu iade edilecektir. Örneğin,

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

Veriler 5 + 17değerlendirilir ve sonuç değerlendirilir 22. İfadeyi değerlendirdiğinde, 5 + 17iki sayı eklediğinizi algılar ve sonuç da aynı inttürde olur. Bu nedenle, tür dönüştürme ücretsiz olarak yapılır ve 22sonuç olarak döndürülür inputve datadeğişkente saklanır . Bir çağrı ile bestelenmiş inputolarak düşünebilirsiniz .raw_inputeval

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

Not:input Python 2.x kullanırken dikkatli olmalısınız . Bu cevapta kişinin onu kullanırken neden dikkatli olması gerektiğini anlattım .

Ancak, raw_inputgirdiyi değerlendirmez ve olduğu gibi bir dize olarak döndürür.

>>> 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'ler inputve Python 2.x'ler raw_inputbenzerdir ve Python 3.x'te raw_inputmevcut değildir.

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

Çözüm

Python 3.x değerlendirmek ve veri türüne dönüştürmek olmadığından, açıkça dönüştürmek zorunda sorunuzu cevaplamak için intbirlikte s intböyle,

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

Herhangi bir tabanın numaralarını kabul edebilir ve intbu gibi bir işlevle doğrudan taban-10'a dönüştürebilirsiniz.

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

İkinci parametre, girilen sayıların tabanının ne olduğunu söyler ve sonra dahili olarak onu anlar ve dönüştürür. Girilen veriler yanlışsa bir atar 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'

Kesirli bir bileşene sahip olabilen değerler için, tür floatyerine int:

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

Bunun dışında, programınız biraz değiştirilebilir, bu şekilde

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

Sen kurtulabilirsiniz playkullanarak değişken breakve while True.


Başka bir yolu var mı, bir işlev ya da bir şey gibi biz int için açık dönüşüm yapmak dışında 3.x int dönüştürmek gerekmez?
Shreyan Mehta

@ShreyanMehta evalişe yarar , ancak acil nedenleriniz olmadıkça bunu yapmayın.
thefourtheye

2
@thefourtheye en azından ast.literal_evalbunun için kullanın . Güvenlik kaygısı yoktur eval.
spectras

4
Ben bu soru-cevap bir dupe hedef olarak kullanın, ama belki python 3 çözüm ile bir TDLR ekleyebilirsiniz, yani int(input()... üstte? Python 2 ömrünün sonuna yaklaşıyor ve python 3 bilgisi çok gömüldü IMO
Chris_Rands

Değişken olarak oynatmanın kaldırılmasıyla ilgili son bit, değişken oynatma kodu daha anlaşılır hale getirdiğinden, uygun değildir. Ve neden olmadan kodun nasıl değişebileceğine dair önerilerde bulunmak iyi bir uygulama değildir. Aksi takdirde, güzel bir cevaptır :)
OuuGiii

44

Python 3.x raw_inputiçinde yeniden adlandırıldı inputve Python 2.x inputkaldırıldı.

Bu raw_input, inputPython 3.x'te olduğu gibi her zaman bir dize nesnesi döndürdüğü anlamına gelir .

Sorunu çözmek için, bu girişleri tam olarak içine koyarak tamsayılara dönüştürmeniz gerekir int:

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

27

Tek bir satırda çoklu tamsayı mapiçin daha iyi olabilir.

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

Sayı zaten biliniyorsa (2 tamsayı gibi),

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

16

input()(Python 3) ve raw_input()(Python 2) her zaman dizeleri döndürür. Sonucu açıkça ile tamsayıya dönüştürün int().

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

11

Birden çok soru, tek satırda birden fazla tamsayı için girdi gerektirir. En iyi yol, tüm sayı dizesini bir satır girmek ve daha sonra tamsayılara bölmektir. İşte bir Python 3 sürümü:

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

Ayrıca bir liste kavrayışı kullanılabilir

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

Ve tüm girdileri dizeden int'e dönüştürmek için aşağıdakileri yaparız

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

liste elemanlarını düz bir çizgide basacaktır.


6

Tamsayılara dönüştür:

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

Benzer şekilde kayan nokta sayıları için:

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 döngüsü 'n' sayısını kaç kez çalıştırmalıdır. ikinci 'n' dizinin uzunluğudur. son ifade, tamsayıları bir listeyle eşler ve girdiyi boşlukla ayrılmış biçimde alır. diziyi for döngüsü sonunda da döndürebilirsiniz.


3

CodeChef , boşlukla ayrılmış iki tamsayı bir satırdan okunması gereken bir sorunu çözerken tamsayı girişi alma ile ilgili bir sorunla karşılaştım .

int(input())Tek bir tamsayı için yeterli olsa da , iki tamsayı girmek için doğrudan bir yol bulamadım. Bunu denedim:

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

Şimdi num1 ve num2'yi tamsayı olarak kullanıyorum. Bu yardımcı olur umarım.


Bu çok ilginç görünüyor. Ancak, döngüden çıkıldığında iyok olmaz formı?

@hosch250Bir döngüden çıkıldığında, indeks değişkeninin değeri (burada i) kalır. Bu parçayı denedim ve düzgün çalışıyor.
Aravind

1
Bu tür bir giriş manipülasyonu için, num1, num2 = map(int, input().split())ne kadar tamsayılarla karşılaşacağınızı biliyorsanız veya nums = list(map(int, input().split()))bilmiyorsanız yapabilirsiniz.
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

Sizin örnekte, iken int(input(...))her durumda hile yapar, python-future'ın builtins.inputyapar beri dikkate değer hem Python 2 ve 3 için emin kod çalışır ve bir devre dışı bırakır Python2 varsayılan davranışı inputgiriş veri türü hakkında 'zeki' olmaya çalışıyorum ( builtins.inputtemelde sadece gibi davranır raw_input).

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.