2011-08-29 44 views
0

有人可以解释为什么我得到这个错误吗?我的代码:无法理解TypeError

def x(n): 
    if n == 1: n = 4 
    elif n == 2: n = 3 
    elif n == 3: n = 2 
    elif n == 4: n = 1 
    return n 

def y(n): 
    if n == 1: n = 2 
    elif n == 2: n = 1 
    elif n == 3: n = 4 
    elif n == 4: n = 3 
    return n 

def query_x(i, j, quadrants): 
    quadrants[i-1:j] = map(x, quadrants[i-1:j]) 

def query_y(i, j, quadrants): 
    quadrants[i-1:j] = map(y, quadrants[i-1:j]) 

def query_c(i, j, quadrants): 
    count = [quadrants[i-1:j].count(n) for n in range(1,5)] 
    print "%d %d %d %d" % (count[0], count[1], count[2], count[3]) 

def process_queries(queries, quadrants): 

    for query in queries: 
     if query[0] == "X": query_x(query[1], query[2], quadrants) 
     elif query[0] == "Y": query_y(query[1], query[2], quadrants) 
     elif query[0] == "C": query_c(query[1], query[2], quadrants) 

if __name__ == "__main__": 

    N = int(raw_input()) 

    quadrants = [] 
    for i in xrange(N): 
     pair = map(int, raw_input().split()) 
     x, y = pair 

     if x > 0 and y > 0: quadrants.append(1) 
     elif x < 0 and y > 0: quadrants.append(2) 
     elif x < 0 and y < 0: quadrants.append(3) 
     elif x > 0 and y < 0: quadrants.append(4) 

    Q = int(raw_input()) 

    queries = [] 
    for i in xrange(Q): 
     query = raw_input().split() 
     queries.append([query[0], int(query[1]), int(query[2])]) 

    process_queries(queries, quadrants) 

输出:

4 
1 1 
-1 1 
-1 -1 
1 -1 
5 
C 1 4 
X 2 4 
C 3 4 
Y 1 2 
C 1 3 
1 1 1 1 
Traceback (most recent call last): 
    File "QuadrantQueries_dev.py", line 53, in <module> 
     process_queries(queries, quadrants) 
    File "QuadrantQueries_dev.py", line 28, in process_queries 
     if query[0] == "X": query_x(query[1], query[2], quadrants) 
    File "QuadrantQueries_dev.py", line 16, in query_x 
     quadrants[i-1:j] = map(x, quadrants[i-1:j]) 
    TypeError: 'int' object is not callable 
+1

欢迎使用Code Review!此网站适用于需要改进的工作代码。堆栈溢出将是这个问题更好的网站。 –

+0

所以我们再次见面:)正如你可能可以告诉我仍然在解决同样的问题。另外,还有更多关于主题的内容,我发现在CodeReview,StackOverflow和程序员之间做出决定非常困难。在我看来,他们应该都只是卷入一个站点。 –

+1

我不喜欢这些网站被分裂的方式。但是,我不觉得难以对问题进行分类。代码审查仅适用于需要风格/性能改进的工作代码。涉及不起作用的代码的问题总是属于StackOverflow。如果没有涉及的代码,那么它可能属于程序员。 –

回答

3
pair = map(int, raw_input().split()) 
x, y = pair 

在第39行,你正在重新定义x和y的对象是整数。 x和y不再引用您在顶部定义的函数。你的“主要”代码块不是一个单独的函数范围,你仍然在全局命名空间。

http://docs.python.org/tutorial/classes.html#python-scopes-and-namespaces

+0

谢谢!我会赞成这一点,但我还没有所需的声望。 –

0

我觉得你的代码进行一些改进。我决定重写整个事情。也许你会喜欢我的一些变化。

首先,我们可以使用字典处理象限数字的重新映射。其次,我们可以做一个帮助函数来计算象限数字。然后我们可以建立象限数字列表并处理它。而不是阅读查询,建立它们的列表,然后再处理它们,这段代码只是读取查询并处理它们。

dmapx = {1:4, 2:3, 3:2, 4:1} 
dmapy = {1:2, 2:1, 3:4, 4:3} 

def quadnum(x, y): 
    if x >= 0 and y >= 0: 
     return 1 
    elif x < 0 and y >= 0: 
     return 2 
    elif x < 0 and y < 0: 
     return 3 
    else: 
     return 4 


def rewrite_x(quadrants, i, j): 
    quadrants[i-1:j] = [dmapx[x] for x in quadrants[i-1:j]] 

def rewrite_y(quadrants, i, j): 
    quadrants[i-1:j] = [dmapy[y] for y in quadrants[i-1:j]] 

def print_counts(quadrants, i, j): 
    count = [quadrants[i-1:j].count(n) for n in range(1,5)] 
    print "%d %d %d %d" % tuple(count) 

def parse_quadrants(): 
    n = int(raw_input()) 
    for _ in xrange(n): 
     yield [int(s) for s in raw_input().split()] 

def parse_queries(): 
    n = int(raw_input()) 
    for _ in xrange(n): 
     code, i, j = raw_input().split() 
     i = int(i) 
     j = int(j) 
     yield (code, i, j) 

if __name__ == "__main__": 
    # parse quadrants from input, and build list of quadrant numbers 
    quadrants = [quadnum(x, y) for x, y in parse_quadrants()] 

    # parse and handle queries 
    for code, i, j in parse_queries(): 
     if code == "X": 
      rewrite_x(quadrants, i, j) 
     elif code == "Y": 
      rewrite_y(quadrants, i, j) 
     elif code == "C": 
      print_counts(quadrants, i, j) 
     else 
      raise ValueError, "bad code: %s" % str(code)