Python #1

Pisałem w poprzednim poście o tym, że zacząłem interesować się językiem Python. Jestem w trakcie lektury „Python od podstaw” dodatkowo na jednym z przedmiotów do wyboru używamy tego języka. No i tak na początek dostaliśmy parę łatwych programików do napisania. Jednym z nich było zrobienie swojej klasy do przechowywania liczb zespolonych. Tak wygląda kod w Pythonie:

[python]

class MyComplex:
def __init__(self, re=0.0, im=0.0):
self.re = re
self.im = im

def __str__(self):
”’String representation of MyComplex”’
if self.im > 0:
return ‚(%.2f + %.2fi)’ % (self.re,self.im)
else:
return ‚(%.2f – %.2fi)’ % (self.re,-self.im)

def __eq__(self, other):
”’Equal operator (==)”’
if(type(other)==type(self)):
if self.im == other.im and self.re == other.re:
return True
else:
return False
elif(type(other)==type(1j)):
if self.im == other.imag and self.re == other.real:
return True
else:
return False
def __ne__(self, other):
”’NotEqual operator (!=)”’
if(type(other)==type(self)):
if self.im == other.im and self.re == other.re:
return False
else:
return True
elif(type(other)==type(1j)):
if self.im == other.imag and self.re == other.real:
return False
else:
return True

def __add__(self,other):
”’Add operator (+)”’
if(type(other)==type(self)):
tmp = MyComplex(self.re, self.im)
tmp.re += other.re
tmp.im += other.im
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re += other
return tmp
def __sub__(self,other):
”’Sub operator (-)”’
if(type(other)==type(self)):
tmp = MyComplex(self.re, self.im)
tmp.re -= other.re
tmp.im -= other.im
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re -= other
return tmp
def __div__(self,other):
”’Div operator (/)”’
if(type(other)==type(self)):
tmp = MyComplex()
tmp.re = (self.re*other.re + self.im*other.im)*1.0/(other.re*other.re + other.im*other.im)
tmp.im = (self.im*other.re – self.re*other.im)*1.0/(other.re*other.re + other.im*other.im)
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re /= other
tmp.im /= other
return tmp
def __mul__(self,other):
”’Mul operator (*)”’
if(type(other)==type(self)):
tmp = MyComplex()
tmp.re = self.re*other.re – self.im*other.im
tmp.im = self.re*other.im + self.im*other.re
return tmp
if(type(other)==type(0.0) or type(other)==type(0)):
tmp = MyComplex(self.re, self.im)
tmp.re *= other
tmp.im *= other
return tmp
def __iadd__(self,other):
”’Operator (+=)”’
tmp = MyComplex()
tmp = self+other
return tmp
def __isub__(self,other):
”’Operator (-=)”’
tmp = MyComplex()
tmp = self-other
return tmp
def __imul__(self,other):
”’Operator (*=)”’
tmp = MyComplex()
tmp = self*other
return tmp
def __idiv__(self,other):
”’Operator (/=)”’
tmp = MyComplex()
tmp = self/other
return tmp

[/python]

W klasie MyComplex przeładowałem kilka operatorów tj =,-,*,/,+=,-=,*=,/= .

  • __add__ przeładowanie +
  • __sub__ przeładowanie –
  • __div__ przeładowanie /
  • __mul__ przeładowanie *
  • __iadd__ przeładowanie +=
  • __isub__ przeładowanie -=
  • __idiv__ przeładowanie /=
  • __imul__ przeładowanie *=
  • __eq__ przeładowanie ==
  • __ne__ przeładowanie !=

Funkcja __str__ odpowiada za wyświetlanie obiektu – taki odpowiednik Javovego toString(). __init__ natomiast jest konstruktorem klasy. Jak pewnie od razu wszyscy zauważyli Python nie wymaga określania typu zmiennych co wydaje się być niekiedy plusem.

Widzę że formatowanie kodu Pythona w wordpress pozostawia sporo do życzenia ;/ W Pythonie istotne są wcięcia, które tu zniknęły.

Leave a Reply

Your email address will not be published.