2016-09-13 9 views
2

newbie here。誰かがなぜこのコードの最後に 'none'が表示されているのかを私に説明してもらえますか?python - リストを印刷し終わると 'none'になる

背景: は、私はいくつかのリストを含む変数(share_data)を持っている:

share_data = 
[['Date', 'Ticker', 'Company', 'Mkt Cap', 'VM Rank', 'Value Rank', 'Momentum Rank'], 
['2016-08-27', 'BEZ', 'Beazley', '2,063', '89', '72', '76'], 
['2016-08-30', 'BEZ', 'Beazley', '2,063', '89', '72', '76'], 
['2016-08-31', 'BEZ', 'Beazley', '2,050', '89', '72', '75'], 
['2016-09-01', 'BEZ', 'Beazley', '2,039', '96', '73', '93'], 
['2016-09-02', 'BEZ', 'Beazley', '2,069', '90', '72', '77'], 
['2016-09-03', 'BEZ', 'Beazley', '2,120', '96', '70', '94'], 
['2016-09-06', 'BEZ', 'Beazley', '2,106', '90', '71', '77'], 
['2016-09-07', 'BEZ', 'Beazley', '2,085', '89', '71', '76'], 
['2016-09-08', 'BEZ', 'Beazley', '2,091', '89', '72', '77'], 
['2016-09-09', 'BEZ', 'Beazley', '2,114', '89', '71', '77'], 
['2016-09-10', 'BEZ', 'Beazley', '2,084', '94', '71', '89'], 
['2016-09-12', 'BEZ', 'Beazley', '2,084', '94', '71', '89']] 

私は最後の5行を印刷するに興味を持っています。

私はメインプログラムでこれを使用する場合:

for row in share_data[-5:]: 
    print(row) 

私は正しいデータを取得:

['2016-09-07', 'BEZ', 'Beazley', '2,085', '89', '71', '76'] 
['2016-09-08', 'BEZ', 'Beazley', '2,091', '89', '72', '77'] 
['2016-09-09', 'BEZ', 'Beazley', '2,114', '89', '71', '77'] 
['2016-09-10', 'BEZ', 'Beazley', '2,084', '94', '71', '89'] 
['2016-09-12', 'BEZ', 'Beazley', '2,084', '94', '71', '89'] 

...しかし、私はこれを行うための関数を作成したとき:

def share_details(share_data, n=5): 
    ''' Prints the last n rows of a share's records''' 
    for row in share_data[-n:]: 
     print(row) 
    return 

このように関数を呼び出しました。

print(share_details(share_data)) 

...私はこれが(末尾の「なし」に注意していない)され得るもの:

['2016-09-07', 'BEZ', 'Beazley', '2,085', '89', '71', '76'] 
['2016-09-08', 'BEZ', 'Beazley', '2,091', '89', '72', '77'] 
['2016-09-09', 'BEZ', 'Beazley', '2,114', '89', '71', '77'] 
['2016-09-10', 'BEZ', 'Beazley', '2,084', '94', '71', '89'] 
['2016-09-12', 'BEZ', 'Beazley', '2,084', '94', '71', '89'] 
None 

私はそれをトリガー関数の最後に「復帰」の文だと思うが、どのように/なぜか分からない。

EDIT - 私のエラーが何だったかはっきりしています(つまり、内部にの機能を印刷し、戻り値も外にしています)。 すべての印刷を関数に委譲することをお勧めしますか?余分な読みやすさのために、呼び出され多分機能:

print_share_details(share_data) 

それともニシキヘビ/読みやすく、より良い方法はありますか?

+0

これはREPLから実行していますか? REPLは実行された式の値を表示/表示/表示します(この場合は..です)。これは、メソッド自体で使用されるprint文の副作用出力とは異なります。 – user2864740

答えて

1

print(share_details(share_data))と書くと、share_details fuから返された値が表示されます。 nction。この関数は、値を出力した後にNoneを返します。

機能を印刷する必要は何も返さない場合、printを省略し、同じように関数を呼び出す方が良いです。ちょうど外側のprint文を削除

share_details(share_data) 
4

Pythonのすべての関数は、何も返しません。デフォルトの戻り値はNoneです。だから、

print(share_details(share_data)) 

share_datashare_detailsshare_details版画最後の5行、None(デフォルトでは)share_details戻り値を返し、その後、printプリントを呼び出します。

+0

なぜdownvote(+ 3/-1)? –

2

print(share_details(share_data))は、そのメソッド呼び出しの戻り値を出力します。あなたの方法の中では、単にreturnがあり、それはNoneを返します。単純にやって:

return 

Nonereturnなしメソッドによって返されるので、リターンを持っていないのと等価である、Noneを返します。

メソッド呼び出しに対する応答として返すものを決定する必要があります。何も返さず、単にメソッド内から印刷するだけであれば、実際にはreturnを明示的に呼び出す必要はなく、メソッド呼び出しをprintする必要はありません。だから、

、代わりにこのやって:

share_details(share_data) 

をそして、あなたが持つことになりますので、あなたの方法の最後にリターンを削除します:単純に印刷することなく、それを呼び出す

print(share_details(share_data)) 

def share_details(share_data, n=5): 
    ''' Prints the last n rows of a share's records''' 
    for row in share_data[-n:]: 
     print(row) 
1

。それは役に立たず、空のreturn文からNone値を出力しています。

関連する問題