1

输入

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

输出应该是:

1、2、3
甲,乙,丙
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
甲,乙,丙
6、7、8
e, f, g

类型错误:+ 不支持的操作数类型:“NoneType”和“NoneType”

我该如何解决?

4

2 回答 2

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_tableanyway的返回值,所以你最好不要返回任何东西;只需测试是否有任何打印的内容:

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)
于 2013-01-05T22:13:48.793 回答
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
甲,乙,丙
6、7、8
e, f, g

相关文件

于 2013-01-05T22:18:25.650 回答