Thread View: pl.comp.lang.ruby
5 messages
5 total messages
Started by Jaroslaw Zabiello
Wed, 26 Jul 2006 09:47
Zakresy w Pythonie i Ruby
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 09:47
Date: Wed, 26 Jul 2006 09:47
80 lines
2682 bytes
2682 bytes
Na grupie Pythona padło pytanie:
>> Widzial ktos moze implementacje stricte matematycznego przedzialu
>> liczbowego? Uzycie widzialbym jako cos w rodzju:
>>
>>>>> p1 = przedzial(1,5)
>>>>> 3.14 in p1
>>>>> True
>>
>>>>> p2 = przedzial(3,7)
>>>>> p1 + p2
>>>>> (1,7)
>>>>> p1*p2
>>>>> (3,5)
>> itd...
Jako ciekawostkę porównałem sobie Pythona z Ruby. Pythonowa implementacja
mogłaby wyglądać:
class Range(object):
def __init__(self, start, end):
self.start, self.end = start, end
def included(self,value):
return self.start <= value <= self.end
def __add__(self, obj):
start, end = self.start, self.end
if obj.start < self.start: start = obj.start
if obj.end > self.end: end = obj.end
return Range(start, end)
def __mul__(self, obj):
start, end = self.start, self.end
if obj.start > self.start: start = obj.start
if obj.end < self.end: end = obj.end
return Range(start, end)
def __str__(self):
return "(%s,%s)" % (self.start, self.end)
>>>> p1 = Range(1,5)
>>>> p2 = Range(3,7)
>>>> print (p1+p2)
> (1,7)
>>>> print (p1*p2)
> (3,5)
>>>> print p1
>>>> print p1
> (1,5)
>>>> print p2
> (3,7)
>>>> print Range(10,20) * Range(12,30) * Range(15,18)
> (15,18)
Kod Rubiego jest krótszy bo zakresy są już wbudowane w język. Wystarczy
tylko rozszerzyć ją o dodatkowe możliwości:
class Range
def +(obj)
b, e = self.begin, self.end
b = obj.begin if obj.begin < b
e = obj.end if obj.end > e
Range.new(b,e)
end
def *(obj)
b, e = self.begin, self.end
b = obj.begin if obj.begin > b
e = obj.end if obj.end < e
Range.new(b,e)
end
end
p1 = 1..5
p2 = 3..7
p (1..5).include?(3.14) #=> true
p (1..5).include?(13.14) # => false
p p1 + p2 # => 1..7
p p1 * p2 # => 3..5
p p1 * p2 * (4..6) # => 4..5
--
Jarosław Zabiełło
http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 09:58
Date: Wed, 26 Jul 2006 09:58
16 lines
1109 bytes
1109 bytes
Zapomnialem o pythonowym __contains__. Po dodaniu do klasy Range:
def __contains__(self,value):
return self.included(value)
mozna wtedy wykonywac
>>> 3.14 in Range(1,10)
True
>>> 31.14 in Range(1,10)
Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie.
--
Jarosław Zabiełło
http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
Author: Daniel Owsiański
Date: Wed, 26 Jul 2006 11:36
Date: Wed, 26 Jul 2006 11:36
23 lines
1564 bytes
1564 bytes
Jaroslaw Zabiello napisał(a): > Zapomnialem o pythonowym __contains__. Po dodaniu do klasy Range: > > def __contains__(self,value): > return self.included(value) > > mozna wtedy wykonywac > > >>> 3.14 in Range(1,10) > True > >>>>31.14 in Range(1,10) > Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie. czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z ruby-way) byłaby konstrukcja: 31.15.in? 1..5 czyli dodanie metody 'in?' do Numeric -- daniel http://jarmark.org
Re: Zakresy w Pythonie i Ruby
Author: Jaroslaw Zabiello
Date: Wed, 26 Jul 2006 11:47
Date: Wed, 26 Jul 2006 11:47
20 lines
1586 bytes
1586 bytes
On Wed, 26 Jul 2006 13:36:41 +0200, Daniel Owsiański wrote: >> Nie wiem czy w Ruby mozna przeciazyc slowo "in". Chyba nie. > > czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z > ruby-way) byłaby konstrukcja: > > 31.15.in? 1..5 > > czyli dodanie metody 'in?' do Numeric Po co to tworzyć, skoro już mamy poprawną filozoficznie konstrukcję (1..5).include?(31.5) ? Ja proponowałem dodać trochę takiego lukru, bo Ruby też dodał "for x in y", więc "if x in y" byłoby równie naturalne. Albo, zgadzając się z Marcinem M., wywaliłbym "in" w ogóle ze składni Rubiego skoro takie podejście nie jest spójne z filozofią komunikatów. -- Jarosław Zabiełło http://blog.zabiello.com
Re: Zakresy w Pythonie i Ruby
Author: Daniel Owsiański
Date: Wed, 26 Jul 2006 12:37
Date: Wed, 26 Jul 2006 12:37
26 lines
2239 bytes
2239 bytes
Jaroslaw Zabiello napisał(a): > On Wed, 26 Jul 2006 13:36:41 +0200, Daniel Owsiański wrote: >>czy nie sądzisz, że bardziej czytelna (i przy okazji bardziej zgodna z >>ruby-way) byłaby konstrukcja: >> >>31.15.in? 1..5 >> >>czyli dodanie metody 'in?' do Numeric > Po co to tworzyć, skoro już mamy poprawną filozoficznie konstrukcję > (1..5).include?(31.5) ? Ja proponowałem dodać trochę takiego lukru, bo Ruby > też dodał "for x in y", więc "if x in y" byłoby równie naturalne. Albo, > zgadzając się z Marcinem M., wywaliłbym "in" w ogóle ze składni Rubiego > skoro takie podejście nie jest spójne z filozofią komunikatów. przeciez nic wielkiego do utworzenia to tu nie ma ot pare linijek... a uzyskany efekt może czasem poprawic czytelnosc kodu (oczywiscie to jak zwykle kwestia gustu). Co do "for x in y" - cos w tym jest, ja również odnosze wrażenie że ta konstrukcja została dodana, żeby nie można było powiedzieciec ze Ruby nie ma pętli for ;) W każdym razie ja nie przypominam sobie abym kiedykolwiek używał tej konstrukcji w Ruby. -- daniel http://jarmark.org
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads