🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

1回答

6369閲覧

sendメソッドの使い方がわからない

mamicom2

総合スコア1

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

1クリップ

投稿2021/03/02 16:07

前提・実現したいこと

pythonを学習しています。
現在ジェネレーターについて学んでいるのですが、yield、sendメソッドの使い方やgeneratorオブジェクトについて、例として挙げられているコードが理解できません。

該当のソースコード

python

1def gen_com(): 2 while True: 3 n = yield input('名前を教えてください') 4 yield f'こんにちは{n}さん!' 5 6gen = gen_com() 7for name in gen: 8 res = gen.send(name.upper()) 9 print(res)

###実行結果
名前を教えてください yamada
こんにちはYAMADAさん!
名前を教えてください →control+cで終了

理解できない部分

gen = gen_com() for name in gen: res = gen.send(name.upper()) print(res)

この部分について、
3行目でnで代入された文字が大文字となったものが、sendメゾットでnに代入される。
という部分までは分かるのですが、次のyieldの戻り値がresに代入されることがよくわかりません。

また、2行目についてこのnameはこの場合最初のyieldを指していると理解したのですが、2つ目のyieldがこのnameになり得ないのはなぜなのでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

ジェネレーターはコルーチンの一種で、sendメゾットの仕様です、という説明もありますが。もう少し感覚的な説明をしてみます。

米国の道路標識にyieldというのがあります。日本の一時停止にあたるもので、一旦止まって本線の自動車に道を譲るという意味です。

genはジェネレータで、最初に呼び出されるとinput('名前を教えてください')の値を返して、そこで一時停止します。つまり、メインのプログラムに制御を譲ったのです。それがfor name in gen:の行で起こっていることです。戻り値はnameに代入されます。
次にメイン側でgen.send(name.upper())を実行すると、ジェネレータの中の最初のyieldの戻り値がname.upper()となってresに代入されます。その次に進んで次のyieldでf'こんにちは{n}さん!'を返して一時停止します。これがgen.send(name.upper())の戻り値なのでresに代入されます。
メイン側では、print(res)をしたあとfor name in gen:に戻り、再びgenが呼び出されて同じ事が続きます。

というように、ループという周回道路を走っているメイン側と、メイン側から呼び出されて一時停止しながら走るジェネレータ側という二台の自動車が荷物の受け渡しをしながら作業をしているのが頭の中に浮かべば理解できます。

そういう動画を提供できれば良いのですが手間がかかるので、文章による説明でがまんしてください。

投稿2021/03/02 17:43

ppaul

総合スコア24670

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

mamicom2

2021/03/02 23:29 編集

迅速なご回答ありがとうございます。2台の自動車というイメージを用いると全体の流れがよく理解できました。 2つ目のyieldがnameになり得ないのは、全体の流れから明らかなのですね。
ppaul

2021/03/03 01:44

コンピュータ技術が英語圏である米国で発達したため、yieldのように、米国人にとっては簡単に理解できることが他の言語(例えば日本語)を使う人にとって分かりにくくなって損をしている気がしますね。 公式マニュアルとかを読んでいても、日本語訳だと分からないことが原文の英語を読むととても簡単だったりします。英語を勉強しましょう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問