2010-07-17 22 views
5

Ben bir Python newbie'yim. Bu küçük problemim var. Nesnelerin bir listesini yazdırmak istiyorum ama hepsi yazdırır, nesnenin bazı garip içsel temsilidir. __str__ yöntemini bile tanımladım, ancak yine de bu garip çıktıyı alıyorum. Burada neyi özlüyorum? Nesnelerin bir listesini yazdırma

class person(object): 
    def __init__(self, name, age): 
    self.name = name 
    self.age = age 

    def __str__(self): 
    return self.name + "(" + str(self.age) + ")" 

def partition(coll, pred): 
    left = [] 
    right = [] 
    for c in coll: 
    if pred(c): 
     left.append(c) 
    else: 
     right.append(c) 
    return left, right 


people = [ 
    person("Cheryl", 20), 
    person("Shemoor", 14), 
    person("Kimbala", 25), 
    person("Sakharam", 8) 
] 

young_fellas, old_fellas = partition(people, lambda p : p.age < 18) 
print(young_fellas) 
print(old_fellas) 

Ben for döngü ya da burada bir map işlevini kullanabilirsiniz biliyorum unutmayınız. Daha kısa ve daha idiyomik bir şey arıyorum. Teşekkürler.

DÜZENLEME:

Bir soru daha: maden Pythonic yukarıdaki kod mu?

cevap

0

deneyin geçersiz kılma repr

def __repr__(self): 
     return self.name + "(" + str(self.age) + ")" 

Düzenleme: Daha iyi yolu, Paul teşekkürler.

def __repr__(self): 
    return "%s(%d)" % (self.name, self.age) 
+1

Dize enterpolasyonu ""% s (% d) "% (self.name, self.age) veya" ".join (list_of_string_bits)", "karakter dizisini küçük dizeler ekleyerek öğrenmek için daha iyi stillerdir" +'. – PaulMcG

+0

ve @Paul: Öneriniz için teşekkür ederiz :-) –

+1

@Paul McGuire: Bu özel durumda değil gerçekten, yani troll etmeyin :) –

1

Sen yapabilirdi:

print(map(str,young_fellas)) 
+1

Soruyu tamamen okumalısınız. –

+0

Pitonik bölüm hakkında, dokümanlardaki bir bölüm var. Kendi hata ayıklama temsilinizi oluşturmak için repr (lib) kullanabilirsiniz. Bu durumda kişi ("ad", 1) kişiden daha iyi bir gösterimdir (ad, 1) çünkü bir nesneyi yeniden oluşturmak için kullanılabilecek geçerli bir Python ifadesi gibi görünmelidir. http://docs.python.org/reference/datamodel.html#object.__repr__ http://www.python.org/dev/peps/pep-0008/ – SiggyF

+0

Öneri için teşekkürler :-) –

2

Kişisel yapılan bu nesne:

person("Cheryl", 20) 

Bu repr oluşturulduktan sonra aynı olmalıdır anlamı:

def __repr__(self): 
return 'person(%r,%r)' % (self.name,self.age) 

Çıktı haline gelir:

[person('Shemoor',14), person('Sakharam',8)] 
[person('Cheryl',20), person('Kimbala',25)] 
+0

Öneri :-) –

+1

için teşekkür ederiz. Yazdığınız güzel işlev, bu bölüm. Ben kendim bir dize bölüm fanım ve kazarım. –

+0

++: Çıktının doğrudan python'a geri gönderilebileceği ikramiyeyle birlikte gelir (repr() fikri neyse) –

İlgili konular