2013-01-05 60 views
1

输入的Python:无法摆脱类型错误的:不支持的操作数类型(S)为+: 'NoneType' 和 'NoneType'

[['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' 

我该如何解决这个问题?

+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

这不会完全解决它,'print_row()'也返回'None'。 –

+0

仍然返回TypeError:不支持的操作数类型为+:'NoneType'和'str' – Johnxl

+0

aight谢谢..帮助很多 – Johnxl

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 

相关文档

相关问题