[解決済み] Python Empty Generator 関数
質問
Pythonでは、yieldキーワードを関数本体に記述することで、以下のように簡単にイテレータ関数を定義することができます。
def gen():
for i in range(100):
yield i
どのようにすれば、値を生成しない(0値を生成する)ジェネレータ関数を定義できますか。以下のコードは、パイソンが通常の関数ではなくジェネレータであることを認識できないため、動作しません。
def empty():
pass
のようなことができる。
def empty():
if False:
yield None
しかし、それは非常に醜いでしょう。空のイテレータ関数を実現するいい方法はないでしょうか?
どのように解決するのですか?
この場合
return
これは何も得ずに反復を停止させるので、関数をスコープ外に出すことのない明示的な代替手段を提供します。そのため
yield
を使って関数をジェネレータに変えますが、その前に
return
を付けてジェネレータを終了させます。
>>> def f():
... return
... yield
...
>>> list(f())
[]
を置き換えるだけなので、今あるものよりずっといいとは思えません。
if
ステートメントを省略のない
yield
ステートメントを使用します。しかし、その方がよりイディオム的です。なお、単に
yield
を使うだけではうまくいかないことに注意してください。
>>> def f():
... yield
...
>>> list(f())
[None]
なぜ
iter(())
?
この質問は、特に空の ジェネレータ関数 . そのため、一般的に空のイテレータを作成する最良の方法についての質問というよりも、Pythonの構文の内部的な一貫性に関する質問であると私は考えています。
もし質問が実際に空のイテレータを作成する最良の方法についてのものであるなら、あなたは以下の意見に同意するかもしれません。
Zectbumo
を使うことについては
iter(())
を使うことにしました。しかし、重要なのは
iter(())
は関数を返さないということです。これは直接、空の反復処理可能ファイルを返します。という callable を期待する API で作業しているとします。
を返す
を返す呼び出し可能な API を期待しているとします。このようなことをしなければならないでしょう。
def empty():
return iter(())
(クレジットは ウントゥブ がこの答えの最初の正解を与えてくれました)。
さて、あなたは上記がより明確であると感じるかもしれませんが、私はそれがより明確でない状況を想像することができます。(作為的な) ジェネレーター関数の定義の長いリストのこの例を考えてみてください。
def zeros():
while True:
yield 0
def ones():
while True:
yield 1
...
その長いリストの最後には、むしろ何かで
yield
が入っていて、こんな感じ。
def empty():
return
yield
または、Python 3.3以上では(提案されているように) DSM によって提案されている)、これです。
def empty():
yield from ()
の存在は
yield
キーワードの存在によって、これが他のジェネレータ関数と全く同じであることが一目瞭然です。しかし
iter(())
バージョンが同じことを行っていることを理解するにはもう少し時間がかかります。
微妙な違いですが、正直なところ、この
yield
-ベースの関数の方が読みやすく、保守しやすいと思います。
この素晴らしい回答もご覧ください。
ユーザー3840170
を使用した
dis
を使って、この方法が望ましいもう一つの理由を示しています。それは、コンパイル時に最も少ない命令数で済むということです。
関連
-
[解決済み] 関数デコレータを作成し、それらを連鎖させるには?
-
[解決済み] 関数内でグローバル変数を使用する
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] Pythonで現在時刻を取得する方法
-
[解決済み] Pythonで2つのリストを連結する方法は?
-
[解決済み] リストが空かどうかを確認するにはどうすればよいですか?
-
[解決済み] Pythonで例外を手動で発生(スロー)させる
-
[解決済み】ネストされたディレクトリを安全に作成するには?
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み] オブジェクトのリストに特定の属性値を持つオブジェクトが含まれているかどうかをチェックする
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Pandasのデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] Django Rest Framework ファイルアップロード
-
[解決済み] Django 1.7で初期マイグレーションからマイグレートバックする方法は?
-
[解決済み] Pandasを使って、既存のExcelファイルに新しいシートを保存する方法は?
-
[解決済み] Pythonの検索パスを他のソースに展開する
-
[解決済み] Pythonでファイルの読み込みと上書きをする
-
[解決済み] djangoのQueryDictをPythonのDictに変更するには?
-
[解決済み] pandasプロットでX軸の目盛りラベルを回転させる方法
-
[解決済み] pipがvirtualenvの代わりにグローバルなsite-packagesにインストールする。