[解決済み] for x in y(): これはどのように動作するのでしょうか?重複
質問
ターミナルでカーソルを回転させるコードを探していて、これを見つけました。私はこのコードで何が起こっているのか不思議に思っていました。特に
for c in spinning_cursor():
この構文は見たことがありません。私がジェネレータから一度に1つの要素を返すために
yield
で、これがcに代入されるからでしょうか?y()使用のxのためのこれの他の例はあるか。
import sys
import time
def spinning_cursor():
cursor='/-\|'
i = 0
while 1:
yield cursor[i]
i = (i + 1) % len(cursor)
for c in spinning_cursor():
sys.stdout.write(c)
sys.stdout.flush()
time.sleep(0.1)
sys.stdout.write('\b')
どのように解決するのですか?
使用方法
yield
を使うと、関数を
ジェネレータ
. ジェネレータは
イテレータ
.
for
は常にイテレータブルをループし、順番に各要素を取り、リストされた名前にそれを割り当てます。
spinning_cursor()
はジェネレータを返し、その中のコードは
spinning_cursor()
の中のコードは、ジェネレータに対する反復処理を開始するまで実際には実行されません。ジェネレータを繰り返し実行するということは、関数内のコードが
yield
文に出会うまで実行され、そこで式の結果が次の値として返され、実行は再び一時停止されます。
は
for
ループはまさにこれを行います。
next()
をジェネレータ上で呼び出します。
StopIteration
を上げることで終了を知らせるまで(関数が戻ったときに起こります)。の各戻り値は
next()
のそれぞれの戻り値は、順番に
c
.
Pythonプロンプトでジェネレータをオンに作成することで確認することができます。
>>> def spinning_cursor():
... cursor='/-\|'
... i = 0
... while 1:
... yield cursor[i]
... i = (i + 1) % len(cursor)
...
>>> sc = spinning_cursor()
>>> sc
<generator object spinning_cursor at 0x107a55eb0>
>>> next(sc)
'/'
>>> next(sc)
'-'
>>> next(sc)
'\\'
>>> next(sc)
'|'
この特定のジェネレータは決して返さないので
StopIteration
が発生することはなく
for
のループはスクリプトを終了させない限り永遠に続くでしょう。
より退屈な(しかしより効率的な)代替案としては
itertools.cycle()
:
from itertools import cycle
spinning_cursor = cycle('/-\|')
関連
-
[解決済み] プログラムの実行やシステムコマンドの呼び出しはどのように行うのですか?
-
[解決済み] for'ループでインデックスにアクセスする?
-
[解決済み] Pythonには文字列の'contains'サブストリングメソッドがありますか?
-
[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?
-
[解決済み】if __name__ == "__main__": は何をするのでしょうか?
-
[解決済み】forループを使った辞書の反復処理
-
[解決済み】Pythonに三項条件演算子はありますか?
-
[解決済み】2つの辞書を1つの式でマージする(辞書の和をとる)には?)
-
[解決済み] 範囲指定された浮動小数点数のランダムな配列を生成します。
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。
最新
-
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のデータフレームでタプルの列を分割するにはどうしたらいいですか?
-
[解決済み] googletransがエラー 'NoneType' オブジェクトに 'group' 属性がない、と言って動かなくなった。
-
[解決済み] dict を txt ファイルに書き、それを読み取る?
-
[解決済み] PythonからSMTPを使用してメールを送信する
-
[解決済み] ファブリック経由でデプロイユーザとしてvirtualenvを有効化する
-
[解決済み] SQLAlchemy - テーブルのリストを取得する
-
[解決済み] Cythonのコードを含むPythonパッケージはどのように構成すればよいのでしょうか?
-
[解決済み] Python Empty Generator 関数
-
[解決済み] PySparkでデータフレームのカラムをString型からDouble型に変更する方法は?
-
[解決済み] Python 言語を決定するには?