İşaretsiz 32 bit, imzalı 16 bit vb. Bir değişkenin türünü nasıl görebilirim?
Nasıl görebilirim?
İşaretsiz 32 bit, imzalı 16 bit vb. Bir değişkenin türünü nasıl görebilirim?
Nasıl görebilirim?
Yanıtlar:
type()
Yerleşik işlevi kullanın :
>>> i = 123
>>> type(i)
<type 'int'>
>>> type(i) is int
True
>>> i = 123.456
>>> type(i)
<type 'float'>
>>> type(i) is float
True
Bir değişkenin belirli bir türde olup olmadığını kontrol etmek için şunu kullanın isinstance
:
>>> i = 123
>>> isinstance(i, int)
True
>>> isinstance(i, (float, str, set, dict))
False
Python'un sorunuz gibi görünen C / C ++ ile aynı tiplere sahip olmadığını unutmayın.
Yerleşik işlevi arıyor olabilirsiniz .type()
Aşağıdaki örneklere bakın, ancak Python'da tıpkı Java gibi "imzasız" bir tür yoktur.
Pozitif tamsayı:
>>> v = 10
>>> type(v)
<type 'int'>
Büyük pozitif tamsayı:
>>> v = 100000000000000
>>> type(v)
<type 'long'>
Negatif tamsayı:
>>> v = -10
>>> type(v)
<type 'int'>
Değişmez karakter sırası:
>>> v = 'hi'
>>> type(v)
<type 'str'>
Kayan nokta tamsayısı:
>>> v = 3.14159
>>> type(v)
<type 'float'>
Python'da değişken türü nasıl belirlenir?
Bir değişkeniniz varsa, örneğin:
one = 1
Türünü bilmek ister misin?
Python'da hemen her şeyi yapmanın doğru yolları ve yanlış yolları var. İşte doğru yol:
type
>>> type(one)
<type 'int'>
__name__
Nesnenin adını almak için özniteliği kullanabilirsiniz . (Bu, __dunder__
erişmek için adı kullanmanız gereken birkaç özel özellikten biridir - inspect
modülde bunun için bir yöntem bile yoktur .)
>>> type(one).__name__
'int'
__class__
Python'da alt çizgilerle başlayan adlar anlamsal olarak genel API'nın bir parçası değildir ve kullanıcıların bunları kullanmaktan kaçınmaları için en iyi uygulamadır. (Kesinlikle gerekli olduğu durumlar hariç.)
Yana type
bize nesnenin sınıfını verir, doğrudan bu almamak gerekir. :
>>> one.__class__
Bu genellikle insanların bir yöntemdeki bir nesnenin türüne erişirken sahip oldukları ilk fikirdir - zaten öznitelikleri arıyorlar, bu yüzden tür garip görünüyor. Örneğin:
class Foo(object):
def foo(self):
self.__class__
Yapma. Bunun yerine şunu yazın (self):
class Foo(object):
def foo(self):
type(self)
İşaretsiz 32 bit, imzalı 16 bit vb. Bir değişkenin türünü nasıl görebilirim?
Python'da bu özellikler uygulama detaylarıdır. Genel olarak Python'da bunun için endişelenmiyoruz. Ancak, merakınızı doyurmak için ...
Python 2'de int genellikle uygulamanın kelime genişliğine eşit olan işaretli bir tamsayıdır (sistem tarafından sınırlandırılır). Genellikle C olarak uzun bir süre uygulanır . Tamsayılar bundan daha büyük olduğunda, genellikle bunları Python uzunluğuna dönüştürürüz (sınırsız hassasiyetle, C uzunluğuyla karıştırılmamalıdır).
Örneğin, 32 bit Python 2'de int'in işaretli bir 32 bit tam sayı olduğunu belirleyebiliriz:
>>> import sys
>>> format(sys.maxint, '032b')
'01111111111111111111111111111111'
>>> format(-sys.maxint - 1, '032b') # minimum value, see docs.
'-10000000000000000000000000000000'
Python 3'te eski int ortadan kaybolur ve sınırsız hassasiyete sahip olan int kadar uzun süre (Python) kullanırız .
Ayrıca, genellikle C'de çift olarak uygulanan Python'un şamandıraları hakkında bilgi edinebiliriz :
>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15,
mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)
__class__
Bir değişkenin türünü almak için anlamsal olarak herkese açık olmayan bir API kullanmayın . type
Bunun yerine kullanın .
Ve Python'un uygulama detayları hakkında çok fazla endişelenmeyin. Bunun etrafındaki sorunlarla başa çıkmak zorunda kalmadım. Muhtemelen de yapmayacaksınız ve gerçekten yaparsanız, ne yapacağınız için bu cevaba bakmamaya yetecek kadar bilgi sahibi olmalısınız.
<type instance>
ama __class__
veriyor email.message.Message
- ben neyi yanlış yapıyorum?
object
?
import email
kendi buluşumun hiçbir sınıfını kullanmıyorum .
print type(variable_name)
Bunun gibi sorularla uğraşırken IPython interaktif tercümanı da şiddetle tavsiye ederim . Yazmanıza izin verir variable_name?
ve tür ve tür için doc dizesi de dahil olmak üzere nesne hakkında bir bilgi listesi döndürür.
Örneğin
In [9]: var = 123
In [10]: var?
Type: int
Base Class: <type 'int'>
String Form: 123
Namespace: Interactive
Docstring:
int(x[, base]) -> integer
Mümkünse, bir dize veya sayıyı tamsayıya dönüştürün. Kayan nokta bağımsız değişkeni sıfıra doğru kısaltılacaktır (bu, kayan nokta numarasının dize olarak temsil edilmesini içermez!) Bir dizeyi dönüştürürken, isteğe bağlı tabanı kullanın. Dizesi olmayan bir dönüştürürken bir taban sağlamak bir hatadır. Argüman tamsayı aralığının dışındaysa, bunun yerine uzun bir nesne döndürülür.
print type(str)
Python 3.6'da bir hata döndürür. Kullanımtype(str)
print(type(str))
print type(var)
Hatalı kodu gerçekten değiştirmelisiniz .
Kullanmanın bir yolu daha __class__
:
>>> a = [1, 2, 3, 4]
>>> a.__class__
<type 'list'>
>>> b = {'key1': 'val1'}
>>> b.__class__
<type 'dict'>
>>> c = 12
>>> c.__class__
<type 'int'>
Soru biraz belirsiz - "bakış" ile ne demek istediğinden emin değilim. Yerel bir Python nesnesinin türünü sorgulamaya çalışıyorsanız , @atzz'ın yanıtı sizi doğru yönde yönlendirecektir.
Eğer çalışıyorsanız, ancak oluşturmak (örneğin, temel C-tipleri, anlamlara sahip Python nesneleri uint32_t
, int16_t
) kullanımı struct
modülü. Belirli bir C tipi ilkeldeki bit sayısını böylece belirleyebilirsiniz:
>>> struct.calcsize('c') # char
1
>>> struct.calcsize('h') # short
2
>>> struct.calcsize('i') # int
4
>>> struct.calcsize('l') # long
4
Bu, array
aşağıdaki alt düzey türlerin dizilerini oluşturabilen modüle de yansır :
>>> array.array('c').itemsize # char
1
Desteklenen maksimum tam sayı (Python 2 int
) sys.maxint tarafından verilir .
>>> import sys, math
>>> math.ceil(math.log(sys.maxint, 2)) + 1 # Signedness
32.0
Ayrıca, artık bellekte Python nesnesinin gerçek boyutunu döndüren sys.getsizeof vardır :
>>> a = 5
>>> sys.getsizeof(a) # Residual memory.
12
Kayan noktalı veri ve hassas veriler için sys.float_info kullanın :
>>> sys.float_info
sys.floatinfo(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308, min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53, epsilon=2.2204460492503131e-16, radix=2, rounds=1)
Python'da mı yoksa ctypes mi kullanıyorsunuz ?
İlk durumda, yapamazsınız - çünkü Python'un imzalı / imzasız, 16/32 bit tamsayıları yoktur.
İkinci durumda şunları kullanabilirsiniz type()
:
>>> import ctypes
>>> a = ctypes.c_uint() # unsigned int
>>> type(a)
<class 'ctypes.c_ulong'>
Bir türü olan ctypes hakkında daha fazla bilgi için resmi belgelere bakın .
Python'un açıkladığınız gibi türleri yok. İntegral değerleri temsil etmek için kullanılan iki tip vardır: int
platformun C long
cinsinden int tipine karşılık gelen ve keyfi bir hassasiyet tamsayısıdır (yani gerektiğinde büyür ve bir üst limiti yoktur). Bir ifade, saklanamayan sonuç üretiyorsa int
sessizce dönüştürülür .long
int
Gerçekten ne demek istediğine bağlı. Python 2.x'de, tarihsel nedenlerle int
(sınırlandırılmış sys.maxint
) ve long
(sınırsız kesinlik) olmak üzere iki tamsayı türü vardır . Python kodunda, bu biraz fark yaratmamalıdır, çünkü bir sayı çok büyük olduğunda yorumlayıcı otomatik olarak uzunluğa dönüşür. Temel yorumlayıcıda kullanılan gerçek veri türleri hakkında bilgi edinmek istiyorsanız, bu uygulamaya bağlıdır. (CPython'lar Objects / intobject.c ve Objects / longobject.c'de bulunur.) Sistem türleri hakkında bilgi edinmek için struct modülünü kullanmak için cdleary yanıtına bakın.
Python2.x için şunu kullanın:
print type(variable_name)
Python3.x için şunu kullanın:
print(type(variable_name))
Sadece yapma. Bir şeyin türünü istemek kendi başına yanlıştır. Bunun yerine polimorfizm kullanın. Mümkün olan herhangi bir giriş türü için ne istediğinizi yapan yöntemi kendiniz tanımlayın veya gerekirse tanımlayın ve sadece hiçbir şey sormadan arayın. Bir üçüncü taraf kitaplığı tarafından tanımlanan yerleşik türlerle veya türlerle çalışmanız gerekiyorsa, her zaman bunlardan devralabilir ve bunun yerine kendi türevlerinizi kullanabilirsiniz. Veya bunları kendi sınıfınıza sarabilirsiniz. Bu tür sorunları çözmenin nesne yönelimli yoludur.
Tam türü kontrol etmek ve if
buraya kirli bazı yerleştirmek konusunda ısrar ederseniz , bunu yapmak için __class__
özellik veya type
işlevi kullanabilirsiniz, ancak yakında tüm bu if
s'yi her iki veya üç taahhütte bir ek vakalarla güncelleyeceğinizi göreceksiniz . Bunu OO yolunda yapmak bunu önler ve bunun yerine yeni bir giriş türü için yalnızca yeni bir sınıf tanımlamanızı sağlar.