简体   繁体   English

Python - 传递函数参数

[英]Python - Passing Function Arguments

I am struggling on how to work out how I pass arguments from a function so that I can populate a list in another function - my code is: 我正在努力研究如何从函数中传递参数,以便我可以在另一个函数中填充列表 - 我的代码是:

 infinity = 1000000 
 invalid_node = -1 
 startNode = 0

#Values to assign to each node 
class Node:
     distFromSource = infinity
     previous = invalid_node
     visited = False

#read in all network nodes 
def network():
    f = open ('network.txt', 'r')
    theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]
    print theNetwork

    return theNetwork

#for each node assign default values 
def populateNodeTable(): 
    nodeTable = []
    index = 0
    f = open('network.txt', 'r')
    for line in f: 
      node = map(int, line.split(',')) 
      nodeTable.append(Node())

      print "The previous node is " ,nodeTable[index].previous 
      print "The distance from source is " ,nodeTable[index].distFromSource 
      index +=1
    nodeTable[startNode].distFromSource = 0 

    return nodeTable

#find the nearest neighbour to a particular node 
def nearestNeighbour(currentNode, theNetwork):
     nearestNeighbour = []
     nodeIndex = 0
     for node in nodeTable:
          if node != 0 and currentNode.visited == false:
             nearestNeighbour.append(nodeIndex)
             nodeIndex +=1

     return nearestNeighbour

  currentNode = startNode

if __name__ == "__main__":
    nodeTable = populateNodeTable()
    theNetwork = network()
    nearestNeighbour(currentNode, theNetwork)

So, I am trying to fill the nearestNeighbour list in my nearestNeighbour function with a list of nodes nearest to the other nodes. 所以,我试图在最近的邻居函数中填充最近的邻居列表,其中包含最接近其他节点的节点列表。 Now, the all the other functions work correctly, with all argument passing functioning as it should. 现在,所有其他函数都正常工作,所有参数传递都应该正常运行。 However, my nearestNeighbour function throws up this error message: 但是,my nearestNeighbour函数会抛出此错误消息:

if node != 0 and theNetwork[currentNode].visited == false: AttributeError: 'list' object has no attribute 'visited' if node!= 0和theNetwork [currentNode] .visited == false:AttributeError:'list'对象没有属性'visited'

(Apologies for the layout, haven't quite fathomed the use of the code quotes yet) (对于布局道歉,还没有完全理解代码报价的使用)

That's because theNetwork[currentNode] returns a list. 那是因为theNetwork[currentNode]返回一个列表。 In other words: theNetwork is a list of lists. 换句话说: theNetwork是一个列表列表。

This is the line where it is done: 这是它完成的路线:

theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]
class Node(object):
    def __init__(self, me, dists):
        super(Node,self).__init__()
        self.me = me
        self.dists = dists
        _inf = Network.INF
        self.neighbors = sorted((i for i,dist in enumerate(self.dists) if i!=me and dist!=_inf), key=dists.__getitem__)
        self.clear()

    def clear(self):
        self.dist = None
        self.prev = None

    def nearestNeighbor(self):
        try:
            return self.neighbors[0]
        except IndexError:
            return None

    def __str__(self):
        return "{0}: {1}".format(self.me, self.dists)

class Network(object):
    INF     = 10**6

    @classmethod
    def fromFile(cls, fname, delim=None):
        with open(fname) as inf:
            return cls([[int(dist) for dist in line.split(delim)] for line in inf])

    def __init__(self, distArray):
        super(Network,self).__init__()
        self.nodes = [Node(me,dists) for me,dists in enumerate(distArray)]

    def __str__(self):
        return '\n'.join(self.nodes)

    def floodFill(self, fromNode):
        _nodes = self.nodes
        for n in _nodes:
            n.clear()
        _nodes[fromNode].dist = 0
        # left as an exercise ;-)

    def distances(self):
        return [n.dist for n in self.nodes]

def main():
    nw = Network.fromFile('network.txt', delim=',')
    print(nw)

    nw.floodFill(fromNode=0)
    print(nw.distances())

if __name__=="__main__":
    main()
 theNetwork = [[int(node) for node in line.split(',')] for line in f.readlines()]

theNetwork is a list of lists. theNetwork是一个列表列表。 A list ( theNetwork[currentNode] ) doesn't have a visited attribute. 列表( theNetwork[currentNode] )没有visited属性。

Perhaps you intended something like: 也许你想要的东西:

for line in f.readlines():
     theNetwork.extend((int(node) for node in line.split(',')))

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM