Python:无法摆脱TypeError:不支持的操作数类型+:'NoneType'和'NoneType'

时间:2013-01-05 22:12:28

标签: python

输入

[['1','2','3'],['a','b','c'],['6','7','8'],['e','f','g']]

输出应为:

1, 2, 3
a, b, c
6, 7, 8
e, f, g

代码:

def print_row(los):
    print ', '.join(los)


def print_table(los):
    lose = []
    if los  == []:
        return
    else:
        return print_row(los[0]) + print_table(los[1:]) 

目前:

print_table([['1','2','3'],['a','b','c'],['6','7','8'],['e','f','g']])

给出:

1, 2, 3
a, b, c
6, 7, 8
e, f, g

TypeError: unsupported operand type(s) for +: 'NoneType' and 'NoneType'

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:7)

您的函数返回None(空return语句)。改为返回一个空字符串:

if los == []:
    return ''

您还有一个从未使用的lose定义,您可以使用not los测试空列表。最后但同样重要的是,由于return提前退出函数,else:语句是可选的。

接下来,print_row()也会返回None,因为您不会从中返回任何。只需丢弃它的返回值:

def print_table(los):
    if not los:
        return ''
    print_row(los[0])
    return print_table(los[1:]) 

请注意,您永远不会使用print_table的返回值,因此您也可以不返回任何内容;只需测试是否有任何 打印:

def print_table(los):
    if los:
        print_row(los[0])
        print_table(los[1:]) 

现在你可以内联print_row函数(这只是一个单行):

def print_table(los):
    if los:
        print ', '.join(los[0])
        print_table(los[1:]) 

这仍然是递归的; Python在递归时不是那么强大,但它可以做得非常好的循环:

def print_table(los):
    for sublist in los:
        print ', '.join(sublist)

也可以简化为换行符的连接:

def print_table(los):
    print '\n'.join(', '.join(sublist) for sublist in los)

答案 1 :(得分:3)

另一个答案解释了为什么你的东西不起作用,但这是一种更简单的方法:

l = [['1','2','3'],['a','b','c'],['6','7','8'],['e','f','g']]

print '\n'.join(', '.join(j) for j in l)
1, 2, 3
a, b, c
6, 7, 8
e, f, g

相关文档