2017-07-22 12 views
0

私は本当に小さなコンセプトをここに紛失していることを知っています。ループの最初の反復の後に `return`が関数を終了します

ここに私がやろうとしていることがあります: - ディレクトリ内の "* .html"拡張子を持つファイルのすべてのタイトルを返します。

しかし、私が書いた関数は最初のファイルのタイトルしか生成しませんでした。しかし、もし私が "print"を使うと、すべてを印刷します。

def titles(): 
    for file_name in glob.glob(os.path.join(dir_path, "*.html")): 
     with open(file_name) as html_file: 
      soup = BeautifulSoup(html_file) 
      return str(soup.title.get_text().strip()) 
titles() 
+2

あなたは何をすることを期待していますか? –

+0

戻り、関数を終了します。あなたはたぶんループに戻りたくありません。 – Carcigenicate

+0

おそらく、 'yield'を使いたいでしょう。 –

答えて

2

戻り値は関数内で終了し、最初の反復の結果のみを返します。関数が復帰すると、制御は呼び出し側に戻されます。それは再開しません。

解決策として2つの選択肢があります。

オプション1(大量のデータのために推奨):yieldに変更return

def titles(): 
    for file_name in glob.glob(os.path.join(dir_path, "*.html")): 
     with open(file_name) as html_file: 
      soup = BeautifulSoup(html_file) 

     yield soup.title.get_text().strip() # yield inside the loop, happens multiple times 

for s in titles(): 
    print(s) 

オプション2:ストア、リスト内のすべての出力と最後にリストを返す:

yieldを使用すると、その戻り値は全体で発電することができますから、ループにあなたの関数を変換し、
def titles(): 
    data = [] 
    for file_name in glob.glob(os.path.join(dir_path, "*.html")): 
     with open(file_name) as html_file: 
      soup = BeautifulSoup(html_file) 
     data.append(soup.title.get_text().strip()) 

    return data # return outside the loop, happens once 

print(titles()) 
+0

ええ、ありがとうcoldspeed。 – lpt

1

2つの選択肢があります。それぞれの結果をループ内のローカルデータ構造(例えば、リスト)に追加し、ループの後にリストを返します。このファンクションをジェネレータとして作成し、ループ内の各結果(戻り値なし)を生成します。

小規模なデータセットの場合、リターンアプローチは問題ありません。ジェネレータのアプローチは、大規模なデータセットに対しては、よりやさしく、必要でさえあります。

関連する問題