2
\$\begingroup\$

This is my first program in Python: a stack implementation.

class Stack:
    items =[];
    index =-1;

    def isEmpty(self):
        return  self.index >=0;

    def push(self,item):
            self.index  +=1;
            print(self.index);
            self.items.insert(self.index,item);


    def pop(self):

        if self.index<0:
            raise Exception(" no items in list");
        else:    
            del self.items[self.index];
            self.index -=1;

    def peek(self):
        print(self.index);
        if self.index >-1:
            return self.items[self.index];



stackobj = Stack();
stackobj.push("solomon");
stackobj.push("helloworld")
stackobj.pop();

print(stackobj.peek())

Even though this program works I'm still confused as to whether I've written the program in the right way. I am also not sure when to use the self operator.

\$\endgroup\$
1
\$\begingroup\$

Welcome to the land of Python!

If you come from Java, think as self being the same as this in Java. It is a reference to the object, the difference being in Python, you have to explicitly pass self as a parameter to the class methods.

If you write in Java

class Stack{

    //constructor and class variables goes here

    void pop(){
       if(this.index < 0)
       //logic of the function goes here
    }
}

In Python you write like you did here

class Stack:
    # constructor and class variables goes here

    def pop(self):
        if self.index<0:
        # logic of the function goes here

You see that self and this serve the same purpose.

An another point, you should use documentation! As in PEP257 the format recommanded is like:

def complex(real=0.0, imag=0.0):
    """Form a complex number.

    Keyword arguments:
    real -- the real part (default 0.0)
    imag -- the imaginary part (default 0.0)
    """
    if imag == 0.0 and real == 0.0:
        return complex_zero
    ...
        '''

Another thing, to follow PEP8 it is better to write assignment and condition with a space after the operator. Write items = [] or self.index >= 0 instead of items =[] or self.index >=0.

Also you can drop ; in Python, it's not Java :)

Edit: Also look at @Jon's comments below

\$\endgroup\$
  • 1
    \$\begingroup\$ Some other things, items should be an instance attribute and not a class one, index is redundant as you can do len(items) and then you're not manually carrying it about somewhere else, and the pop might as well use items.pop(0) and optionally catch the exception and raise a more meaningful one - raising Exception is fairly broad... peek also doesn't seem to mirror its behaviour and returns None. Also - if items is sufficient for an empty check - no need to check its length there. \$\endgroup\$ – Jon Clements Jan 6 '18 at 14:06
  • \$\begingroup\$ Some very good points! \$\endgroup\$ – Julien Rousé Jan 6 '18 at 14:17
  • \$\begingroup\$ (and .append instead of .insert) :) \$\endgroup\$ – Jon Clements Jan 6 '18 at 14:20

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.