我是Python 2.7的新手,并且一直在学习从图书馆借用可能过于先进的python书籍,但他们就是他们所拥有的。我试图通过O' Reilly分解来自 Think Compexity 的代码,关于字典词典如下:
class Graph(dict):
"""A Graph is a dictionary of dictionaries. The outer
dictionary maps from a vertex to an inner dictionary.
The inner dictionary maps from other vertices to edges.
For vertices a and b, graph[a][b] maps
to the edge that connects a->b, if it exists."""
def __init__(self, vs=[], es=[]):
"""Creates a new graph.
vs: list of vertices;
es: list of edges.
"""
for v in vs:
self.add_vertex(v)
for e in es:
self.add_edge(e)
def add_vertex(self, v):
"""Add a vertex to the graph."""
self[v] = {}
def add_edge(self, e):
"""Adds and edge to the graph by adding an entry in both directions.
If there is already an edge connecting these Vertices, the
new edge replaces it.
"""
v, w = e
self[v][w] = e
self[w][v] = e
我无法理解括号内的代码,例如def __init__(self, vs=[], es=[])
。我得到它分配属性," vs"和" es"列表,但为什么这些在函数内声明?为什么"自我"那里? def add_vertex(self, v)
和def add_edge(self, e)
相同。
是否可以使用以下内容在函数内声明列表?
vs = {}
答案 0 :(得分:0)
vs
和es
是初始化Graph
类的实例时使用的参数。如果在__init__
中定义它们,则在初始化实例时它们将始终相同。 []
是用户未传递参数时的默认值。例子:
d1 = Graph(vs=[1,2]) #Creates a graph with 2 vertices, no edges
d2 = Graph(vs=[1,2,3], es=[(1,3)]) #Creates a graph with 3 vertices, 1 edge
如果您在初始化时无法指定vs
和es
,则必须执行以下操作:
d1 = Graph() #Creates blank graph
d1.add_vertex(1) #Adds vertex 1
d1.add_vertex(2) #Adds vertex 2
d1 == Graph(vs=[1,2]) #Returns True
d2 = Graph()
d2.add_vertex(1) #Adds vertex 1
d2.add_vertex(2) #Adds vertex 2
d2.add_vertex(3) #Adds vertex 3
d2.add_edge((1,3)) #Adds edge between vertex 1 and 3
d2 == Graph(vs=[1,2,3], es=[(1,3)]) #Returns True
答案 1 :(得分:0)
self
包含在这个函数声明中,其他因为Python没有像大多数其他对象语言那样隐式传递self
,而是像Perl一样明确地传递它:
def __init__(self, vs=[], es=[]):
vs
和es
只是函数的形式参数,可以这样想:
def __init__(self, vs, es):
=[]
部分是默认值,只是空列表,以便在未提供可选参数的情况下防止代码中断。
答案 2 :(得分:0)
if(horizontalBoundary && verticalBoundary){
if(pattern == 1){
diagonalDown(getWidth()-100,365);
}else if(pattern == 2){
diagonalDown(getWidth(),150);
} else { // added this else block
ballX = 30;
ballY = 30;
pattern = 1;
}
}
和vs=[]
是带有默认值的参数声明。如果在es=[]
的调用中忽略其中任何一个,它将默认为空列表。 __init__
是实例本身。你看,self
不是构造函数,而是初始化函数;在调用 __init__
之前构造实例。
(名称__init__
是常规名称;可能是self
或任何内容。所有实例方法都会将实例作为第一个参数接收。)
参数this
和vs
分别是顶点列表和构造时提供的边缘列表(即es
)。对代码进行粗略检查可以认为边是一个元组Graph(...)
,其中(v1, v2)
和v1
是顶点。 v2
是一个字典,其键是来自顶点;每个顶点映射到其键为到顶点的字典。与Graph
相关联的值的存在意味着存在边self[a][b]
;代码暗示a->b
。
否则
self[a][b] == self[b][a] == (a,b)
会创建一个本地名称 vs={}
引用一个空字典(vs
会使vs=[]
引用一个空列表)。形式参数也是本地名称,但它是在呼叫时初始化的本地名称 。