Python Forum
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
what is [o,]?
#1
I am studying following teaching me about composition of class objects. What is o doing here?    

def print_all_2(self):
        def gen(o):
            lAll = [o,]
from following codes:
class Node(object):
    def __init__(self,sName):
        self._lChildren = []
        self.sName = sName
    def __repr__(self):
        return "<Node '{}'>".format(self.sName)
    def append(self,*args,**kwargs):
        self._lChildren.append(*args,**kwargs)
    def print_all_1(self):
        print(self)
        for oChild in self._lChildren:
            oChild.print_all_1()
    def print_all_2(self):
        def gen(o):
            lAll = [o,]
            while lAll:
                oNext = lAll.pop(0)
                lAll.extend(oNext._lChildren)
                yield oNext
        for oNode in gen(self):
            print(oNode)     

oRoot = Node("root")
oChild1 = Node("child1")
oChild2 = Node("child2")
oChild3 = Node("child3")
oChild4 = Node("child4")
oChild5 = Node("child5")
oChild6 = Node("child6")
oChild7 = Node("child7")
oChild8 = Node("child8")
oChild9 = Node("child9")
oChild10 = Node("child10")

oRoot.append(oChild1)
oRoot.append(oChild2)
oRoot.append(oChild3)
oChild1.append(oChild4)
oChild1.append(oChild5)
oChild2.append(oChild6)
oChild4.append(oChild7)
oChild3.append(oChild8)
oChild3.append(oChild9)
oChild6.append(oChild10)
# specify output from here onwards

oRoot.print_all_1()
oRoot.print_all_2()
Quote:<Node 'root'>
<Node 'child1'>
<Node 'child4'>
<Node 'child7'>
<Node 'child5'>
<Node 'child2'>
<Node 'child6'>
<Node 'child10'>
<Node 'child3'>
<Node 'child8'>
<Node 'child9'>
<Node 'root'>
<Node 'child1'>
<Node 'child2'>
<Node 'child3'>
<Node 'child4'>
<Node 'child5'>
<Node 'child6'>
<Node 'child8'>
<Node 'child9'>
<Node 'child7'>
<Node 'child10'>
Reply
#2
short answer - o is argument of gen function. I assume it is short for object...
But I expect you actually want to understand what print_all_2 does, right?

def print_all_2(self):
    def gen(o):
        lAll = [o,]
            while lAll:
                oNext = lAll.pop(0)
                lAll.extend(oNext._lChildren)
                yield oNext
    for oNode in gen(self):
        print(oNode)
for oNode in gen(self): iterate over all elements yielded from generator gen which takes as argument self.
def gen(o) is generator that yields one Node at a time from a list lAll. lAll = [o,] initialize list to [self,]. Every time before gen yield one node [the one with index 0] it adds node's children to the end of the list. After it yield the first node (i.e. self), the lAll will hold all children of self and so on. In practice print_all_2 will print all nodes, starting from self.

hope this helps
Reply
#3
(Jan-21-2017, 08:48 AM)landlord1984 Wrote: I am studying following teaching me about composition of class objects. What is o doing here?
def print_all_2(self):         def gen(o):             lAll = [o,]
from following codes:
class Node(object):     def __init__(self,sName):         self._lChildren = []         self.sName = sName     def __repr__(self):         return "<Node '{}'>".format(self.sName)     def append(self,*args,**kwargs):         self._lChildren.append(*args,**kwargs)     def print_all_1(self):         print(self)         for oChild in self._lChildren:             oChild.print_all_1()     def print_all_2(self):         def gen(o):             lAll = [o,]             while lAll:                 oNext = lAll.pop(0)                 lAll.extend(oNext._lChildren)                 yield oNext         for oNode in gen(self):             print(oNode)     oRoot = Node("root") oChild1 = Node("child1") oChild2 = Node("child2") oChild3 = Node("child3") oChild4 = Node("child4") oChild5 = Node("child5") oChild6 = Node("child6") oChild7 = Node("child7") oChild8 = Node("child8") oChild9 = Node("child9") oChild10 = Node("child10") oRoot.append(oChild1) oRoot.append(oChild2) oRoot.append(oChild3) oChild1.append(oChild4) oChild1.append(oChild5) oChild2.append(oChild6) oChild4.append(oChild7) oChild3.append(oChild8) oChild3.append(oChild9) oChild6.append(oChild10) # specify output from here onwards oRoot.print_all_1() oRoot.print_all_2() 
Quote: <Node 'root'> <Node 'child1'> <Node 'child4'> <Node 'child7'> <Node 'child5'> <Node 'child2'> <Node 'child6'> <Node 'child10'> <Node 'child3'> <Node 'child8'> <Node 'child9'> <Node 'root'> <Node 'child1'> <Node 'child2'> <Node 'child3'> <Node 'child4'> <Node 'child5'> <Node 'child6'> <Node 'child8'> <Node 'child9'> <Node 'child7'> <Node 'child10'>

I was curious and am still curious about [o,]. I have deleted the comma, made it as [o] and run the program again, it still works same. Is the comma necessary?

(Jan-21-2017, 09:28 AM)buran Wrote: I was curious and am still curious about [o,]. I have deleted the comma, made it as [o] and run the program again, it still works same. Is the comma necessary?
I was curious and am still curious about [o,]. I have deleted the comma, made it as [o] and run the program again, it still works same. Is the comma necessary?
Reply
#4
(Jan-21-2017, 07:03 PM)landlord1984 Wrote: I was curious and am still curious about [o,]. I have deleted the comma, made it as [o] and run the program again, it still works same. Is the comma necessary?

no, comma is not necessary, anyway it is list.
>>> x=[1]
>>> type(x)
<type 'list'>
>>> y=[1,]
>>> type(y)
<type 'list'>
Reply
#5
Note that brackets [] define a list, and parentheses () define a tuple. A comma is not needed for a one item list, [o] works fine. But a comma is needed for a one item tuple. (o,) will be read as tuple, but (o) will be read as an expression that simplifies to o.
Craig "Ichabod" O'Brien - xenomind.com
I wish you happiness.
Recommended Tutorials: BBCode, functions, classes, text adventures
Reply
#6
(Jan-21-2017, 09:15 PM)ichabod801 Wrote: Note that brackets [] define a list, and parentheses () define a tuple. A comma is not needed for a one item list, [o] works fine. But a comma is needed for a one item tuple. (o,) will be read as tuple, but (o) will be read as an expression that simplifies to o.

Thanks. I see. When it is a single element, [o] would be problematic.
Reply
#7
[o] is fine - that's list, but (o) is problematic.
Reply


Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020