输入
[['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 :(得分: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
相关文档