February 12, 2011 - Tagged as: python, tr.
Son dönem aramda Land of Lisp okumaya başlamıştım, bu sabah biraz daha kurcalayayım dedim ve common lisp’deki circular list olayını öğrendim.
Kısaca, listenin son hücresinin cdr
ının listenin car
ını gösterdiği liste. Bu durumda örneğin liste 3 elemanlıysa, 4. eleman listenin 1. elemanını ve 5. eleman listenin 2. elemanını gösteriyor.
Hazır Python’da magic methodları yeni yeni kullanmaya başlamışken, bu Python’da nasıl olur diye düşündüm. Şu şekilde basit bir CircularList sınıfı oluşturabildim:
class CircularList():
def __init__(self, *args):
self.members = list(args)
def __getitem__(self, member):
return self.members[member % len(self.members)]
def __setitem__(self, member, value):
self.members[member] = value
return value
def __delitem__(self, member):
return self.members.remove(member)
def __len__(self):
return len(self.members)
def __contains__(self, item):
return item in self.members
def __iter__(self):
= 0
i while True:
yield self.members[i]
+= 1
i if i >= len(self.members):
= 0
i
def __repr__(self):
= str(self.members)
s return s.split(']')[^0]+ ', ...]'
def append(self, value):
self.members.append(value)
def remove(self, value):
self.members.remove(value)
Birkaç test:
>>> cl = CircularList(1, 3, 5, -10, 'doh')
>>> cl[^124]'doh'
>>> cl[^4]'doh'
>>> cl.append('fuuu')
>>> cl
1, 3, 5, -10, 'doh', 'fuuu', ...]
[>>> cl.remove(-10)
>>> cl
1, 3, 5, 'doh', 'fuuu', ...]
[>>> i = iter(cl)
>>> i.next()
1
>>> i.next()
3
>>> cl.remove(5)
>>> cl.remove('fuuu')
>>> i.next()
'doh'
>>> i.next()
1
Mümkün olduğunda Python’ın list
veri yapısına benzetmeye çalıştım(append, remove, repr falan). Ne işe yarar henüz hiçbir fikrim yok :)