1

入力

[['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:+のサポートされていないオペランドタイプ:'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_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)
于 2013-01-05T22:13:48.793 に答える
3

もう1つの答えは、自分が持っているものが機能しない理由を説明していますが、これを行う簡単な方法は次のとおりです。

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

関連ドキュメント

于 2013-01-05T22:18:25.650 に答える