Natural Language Processing

Laboratorul 3

(Deadline: 04.05.2024 23:59:59)

Daca nu sunteti logati exercitiile nu se mai afiseaza.

Module

Crearea modulelor proprii

Orice program este de fapt un modul.

Un modul poate fi importat in alt program cu instructiunea import nume_modul

Din acest moment putem folosi clasele si functiile definite in modul.

Putem importa si un singur element din modul: from nume_modul import element

In momentul importarii unui modul, acesta se si executa. Putem verifica daca se executa codul in cadrul modulului (si nu printr-un import) testand: if __name__ = "__main__":

Clase

Pentru a crea clase folosim cuvantul cheie class.

class Dreptunghi:

Constructorul este metoda __init__(). Ca si alte functii ce tin de instanta, va primi ca parametru chiar obiectul curent. Rolul constructorului e sa initializeze obiectul.

Pentru a accesa proprietati in interiorul metodelor de instanta (cum e si constructorul) folosim identificatorul self. Atentie, aceasta e doar o conventie, putem sa ii dam orice nume, insa pentru o intelegere mai buna a codului folosim self. Acest lucru se intampla deoarece in metodele de instanta primul parametru este mereu obiectul.

Tot o astfel de conventie avem si pentru metodele de clasa unde folosim prin conventie identificatorul cls pentu parametrul care ar trebui sa primeasca clasa.

Daca dorim sa stergem proprietati ale obiectelor sau chiar obiecte folosim del.

class Dreptunghi:
    """O clasa care memoreaza un dreptunghi format din caractere"""
    #atribute de clasa (statice)
    liniiSeparatoare=True;
    simbolSeparator="-"
    dimLinieSeparatoare=15
    
    
    def __init__(self, inaltime, latime, simbolContinut, simbolContur=None):
        #atribute de instanta
        self.inaltime = inaltime
        self.latime = latime
        self.simbolContinut = simbolContinut
        self.simbolContur = "#" if simbolContur is None else simbolContur
        
    def arie(self):
        return self.inaltime*self.latime;
    
    @classmethod
    def afisSimbolContur(cls):
        print('Simbol separator: '+ cls.simbolSeparator)

    @classmethod
    def afisNumeClasa(cls):
        print('Nume clasa:\n'+ cls.__name__)

    
    @classmethod
    def afisDoc(cls):
        print('Informatii clasa:\n'+ cls.__doc__)
        
        

        
        
    @staticmethod
    def afisLinie(n,simbol):
        print(n*simbol)

        
    #operatori
    
    def __eq__(self, dr):
        return (self.inaltime==dr.inaltime and self.latime==dr.latime)
    
    #observati ca nu trebuie sa ne raportam la aceleasi criterii, chiar daca in general nu este indicat
    def __lt__(self, dr):
        return self.arie()<dr.arie()
        

    def __lte__(self, dr):
        return self.arie()<=dr.arie()
        
    def __gt__(self, dr):
        return self.arie()>dr.arie()        
        
        
        
        
        
    #definesc ce va returna repr(obiect)
    def __repr__(self):
        sir="Prop clasa:\n"
        for (k,v) in self.__class__.__dict__.items() :
            sir+="{} = {}\n".format(k,v)
        sir="Prop instanta:\n"
        for (k,v) in self.__dict__.items() :
            sir+="{} = {}\n".format(k,v)
        return(sir)
        
    #definesc ce va returna str(obiect)    
    def __str__(self):
        sir=self.simbolContur*self.latime+"\n";
        for i in range(self.inaltime-2):
            sir+=self.simbolContur+self.simbolContinut*(self.latime-2)+self.simbolContur+"\n"
        sir+=self.simbolContur*self.latime+"\n"
        return(sir)
        
    def afis(self):
        if (self.liniiSeparatoare):
            self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
        print(d)
        if (self.liniiSeparatoare):
            self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
    


class Secventa:
    secventa=0
    def __init__(self):
        self.secventa+=1
        
        
class HartaJoc(Dreptunghi,Secventa):
    
    simbolObstacol="@"
    __matrice__=[]
    
    def __init__(self,nume,inaltime, latime, simbolContinut, simbolContur=None):
        Dreptunghi.__init__(self,inaltime, latime, simbolContinut, simbolContur)
        Secventa.__init__(self)
        sirDr=str(self)
        __matrice__=[[] for i in range(inaltime)]
        self.nume=nume
    
            
    def afis(self):
        if (self.liniiSeparatoare):
            self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)
        for linie in __matrice__ :
            print(linie.join())
        if (self.liniiSeparatoare):
            self.afisLinie(self.dimLinieSeparatoare,self.simbolSeparator)        
            
if __name__=="__main__":
    d1=Dreptunghi(5,10,'.')
    print("Am creat dreptunghiul d1=Dreptunghi(5,10,'.')")
    ##########################################
    print("Ce afiseaza print(d1)")
    print(d1)
    ##########################################
    print("Ce afiseaza print(str(d1))")
    print(str(d1))
    ##########################################
    print("Ce afiseaza print(repr(d1))")
    print(repr(d1))
    ##########################################
    d2=Dreptunghi(4,4,'.')
    ##########################################
    Dreptunghi.afisSimbolContur()
    Dreptunghi.afisNumeClasa()
    Dreptunghi.afisDoc()
    ##########################################
    print("Am creat harta h=HartaJoc('campie',5,10,'.')")
    h=HartaJoc('campie',5,10,'.')
    ##########################################
    print("Ce afiseaza print(h)")
    print(h)
    ##########################################
    print("Ce afiseaza print(repr(h))")
    print(h)

Mostenirea claselor se face prin: class ClasaDerivata(ClasaBaza):

Functia dir()

Functia dir() afiseaza toate proprietatile si metodele unui obiect.

>>> x=range(1,10)
>>> x
range(1, 10)
>>> dir(x)
['__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__', '__lt__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__reversed__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'count', 'index', 'start', 'step', 'stop']
>>>

Expresii regulate

https://docs.python.org/3/library/re.html

Fisiere si directoare (modulul os)

https://docs.python.org/2/library/os.html

Modulul sys

https://docs.python.org/2/library/sys.html

Modulul datetime

https://docs.python.org/3/library/datetime.html

Tema