質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

8回答

2224閲覧

for文の因果関係について

okahijiki

総合スコア404

for

for文は、様々なプログラミング言語で使われている制御構造です。for文に定義している条件から外れるまで、for文内の命令文を繰り返し実行します。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2020/07/15 08:07

基本的な質問にて失礼します。

以下のfor文ですが、1回目のループでnに入ったtaroが出力され、同様に2回めのループではjiro、3回めではsaburo、4回目ではshiroが出力されるのは直感的に、なにも違和感がありません。

python

1for n in ['taro','jiro','saburo','shiro']: 2 print(n) 3 4taro 5jiro 6saburo 7shiro

しかし、たとえば、以下のようにHelloが4回出力されるケースについて、素直になれないのです。たしかに、inのリストの数が4つ、なのでhelloも4つなのですが..もう少し、突っ込んだ因果関係を知りたいと思ったりしています。どうぞ、よろしくお願いいたします。

for n in ['taro','jiro','saburo','shiro']: print('Hello') hello hello hello hello

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

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

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

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

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

ozwk

2020/07/19 01:52

helloが4回のケースは、あなたとしてはどうなったら「直感的」なんですか?
okahijiki

2020/07/19 01:56

コメント、ありがとうございます。 エラーが出る、とかですかね。
ozwk

2020/07/19 23:42

直感に対して「なぜ」を聞くのもおかしな話ですが、 なぜエラーが出ると直感的に正しそうに思えますか?
okahijiki

2020/07/20 01:02

直感について、「なぜ」と言うのは..ちょっと、お応えするのが、むつかしいかもです。
ozwk

2020/07/20 01:33

「エラーが出る、とか」 とのことなので、エラー以外に直感的な動作ありますか?
okahijiki

2020/07/20 01:38

はっきりしませんねぇ。
ozwk

2020/07/20 01:45

疑問は Helloが4回出力される処理の仕組みですか? それとも「ループ内で列挙したもの(n)を使わなくてもエラーにならない」という言語仕様を定めた理由ですか?
okahijiki

2020/07/20 01:50

たぶん、両方ですー。
nto

2020/07/20 07:17 編集

ご自身の中で「値を必ず使用しなければならない」と潜在的に既成概念化しまっている様なので、『Pythonでは、for文で取り出した値は必ずしも使用しなくてもいいものである』という風に認識を改めましょう。 まだあまりご納得されていない様子ですが、まずはpythonのfor文に関する自身の抱いていた印象や認識が正しいものではなかったということから受け入れて頂ければ理解と納得が早まるかもしれません。
guest

回答8

0

理屈ではなくイメージとして想像しやすい様に
シンプルですがこれではいかがですか?
理解できる部分と、理解し難い部分の中間を取ったコードだと思いますが。。。

python

1for n in ['taro','jiro','saburo','shiro']: 2 print('hello' + n) 3 4>> hello taro 5>> hello jiro 6>> hello saburo 7>> hello shiro

for文では、何も必ず取り出した要素(n)を使用しなければならないというルールはありません。
従ってhelloのみが出力されます。

python

1for n in ['taro','jiro','saburo','shiro']: 2 print('hello') 3 4>> hello 5>> hello 6>> hello 7>> hello

投稿2020/07/16 04:01

nto

総合スコア1438

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

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

okahijiki

2020/07/19 00:46

コメント遅くなってしまいました。 最初の「hello」4回に頭がとらわれてしまい、なかなか、頭が切り替えられない状況でした。 >> hello taro >> hello jiro >> hello saburo >> hello shiro よりイメージしやすくなりました。ありがとうございますー。
guest

0

太郎さん、次郎さん、三郎さん、四郎さんが列に並んでいて、

「一人ずつ前に進んで紙にお名前をお書きください」とお願いしたら紙には

太郎 次郎 三郎 四郎

と残るでしょうが
「お名前はけっこうですので前に進んで一人ずつ紙に✓を書き入れてください」とお願いしたら紙には

✓✓✓✓

と残りますよね。


(追記)

現実で「お名前はけっこうですので前に進んで一人ずつ紙に✓を書き入れてください」って言われたら「誰が並んでいたかは気にしてなくて、人数だけ知りたいんだな」って思いますよね。
それと同じでfor文でイテラブルから取り出した値が代入されている変数nがあって、でも「for文の本体でその変数を使っていない」と判明したら「どんな値がイテラブルから取り出されたかは気にしてなくて、個数だけが必要なんだな」とプログラマは思うわけです。


よいプログラマは

python

1for unused in ['taro','jiro','saburo','shiro']: 2 print('Hello')

として名前に意図を込めるとか、

python

1for _n in ['taro','jiro','saburo','shiro']: 2 print('Hello')

として命名規則で意図を込めるとか(値を使わない変数は_で始めるという慣習はPython界隈では通用します)、

python

1for n in ['taro','jiro','saburo','shiro']: 2 # 中身に関係なく個数分出力する 3 print('Hello')

としてコメントにwhyを残すとかします。

投稿2020/07/15 08:43

編集2020/07/15 09:13
quickquip

総合スコア11235

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

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

okahijiki

2020/07/15 22:55

「本来、取り出される要素がないため、スイート内( :  後に記述した処理)がなされた」というふうに解釈してみましたー。 >「どんな値がイテラブルから取り出されたかは気にしてなくて、 >個数だけが必要なんだな」とプログラマは>思うわけです。 なるほど、です。
quickquip

2020/07/16 02:19

「本来、取り出される要素がないため、」の意味が通じないです。 「本来」とは? 「取り出される要素がない」とは? イテラブルから値は取り出されていますよ。
okahijiki

2020/07/19 00:43

コメントが遅くなってしまいました。恐縮です。 「本来取り出される要素」とは ['taro','jiro','saburo','shiro']を言っています。 本件の場合、 本来なら ['taro','jiro','saburo','shiro']が出力されるのですが、 print(n)ではなく、print(' hello')としているため、 「'hello'」が4回、printされているといったニュアンスとなります。 name =['taro','jiro','saburo','shiro'] print('__iter__' in dir(name)) true 1)リストやタプルといった、いわゆるシーケンスには、 イテレータオブジェクトが用意されいる。 2)イテレータにより 「次の要素を取り出し、要素が終わったかどうか知らせる処理」が行われている。 ということで、こちらの機能を見据えてみると、質問前より感じがつかめたようにも思えます。 要は、「hello」の出力に、とらわれていかというか...
quickquip

2020/07/19 01:05

「本来、取り出される要素がないため、」 ではなくて 「取り出された要素を本来出力してるのだがそれがないため、」 ですか? 「本来、取り出される要素がないため、」という語順だと「本来」の係り先は「取り出される」だと思うのが自然です。 また「取り出される要素がない」だと普通は「取り出す操作をしたがそこになかった」だと思いうのが自然です。 全体的に、整理されていない概念を日本語として表出する作業がぞんざいなせいで、概念を掴めなずに終わっているのでは? という印象です。 日本語の論理構造を注意すると「取り出す」のが何で「取り出される」対象が何で、「取り出された」ものが何か、の区別が出来るようになるはずです。 for文「が」イテレータ「から」['taro','jiro','saburo','shiro']の要素「を」一つずつ取り出していくわけですからね。
okahijiki

2020/07/19 01:40

「概念がつかめず」というのは、ご指摘の通りだと思います。そのため、言葉使いがクリアになっていなかったりして。失礼しました。 本件から外れ恐縮ですが、全般的に、分からないことに対し、言葉で試行錯誤していくうちに、概念の理解に近づけるのではないかという、思いや願いのようなものがあるように思ったりもしています。 >for文「が」イテレータ「から」['taro','jiro','saburo','shiro']の要素「を」一つずつ取り出していくわけですからね。 このへんのニュアンスが、うまくつかめません。そして、このポイントに近づけないことが、理解の、さまたげになっているように思えます。どうぞ、宿題にさせてくださいませー。
quickquip

2020/07/19 01:57

> 言葉で試行錯誤していくうちに、概念の理解に近づけるのではないかという、思いや願いのようなものがあるように思ったり その通りだと思います。一方で、間違った言葉使いを指摘されることで修正されていくものでもあるので、必要以上に口酸っぱくなっていますがご容赦を。
okahijiki

2020/07/19 02:03

いえいえ。助かっていますー。
guest

0

仕組み

仕組みについては残念ながらあなたの直感はどうでもいい話です。
事実は動かしようがないので、直感と事実が違うならあなたの直感の方を事実に寄せてください。

for..in...がどういうモノなのかはy_shinodaさんの回答にもありますこちらを参照します。
8. 複合文 (compound statement) — Python 3.8.4 ドキュメント
これをものすごく簡単に要約すると

python

1for n in ['taro','jiro','saburo','shiro']: 2 何か

python

1n = 'taro' 2何か 3n = 'jiro' 4何か 5n = 'saburo' 6何か 7n = 'shiro' 8何か

と同じです。(breakcontinueとかあったら話は別ですが。)
「何か」(suite)の部分で、列挙したもの:n(target_list)を無視してはならないとはどこにも書いてませんし、
実際無視してもエラーにはならないので、質問文のnを使わないコードは合法です。

そう言語仕様が定まった理由

「なぜ列挙したものを無視してもいい言語仕様になっているか」についてはpythonを作った人に聞くしか無いので正確には言えませんが、
無視できなければ例えば「リストxsの個数だけ'hello'と表示する」という
「リストの中身はどうでもいいけど個数分だけ繰り返したい」場合にfor...in...で書けなくなって困るな、ということはわかります。

他の言語を見てみると、変数を置いておきながら使わないと、「使ってないけど大丈夫?」と気を遣って警告を出してくれる言語はいくつかあります。
例えばswiftは「使わないならそうと分かるように変数名を_にしろ」と警告を出してきます。

swift

1for i in 0..<10 { 2 print("hello") 3}
main.swift:2:5: warning: immutable value 'i' was never used; consider replacing with '_' or removing it for i in 0..<10 { ^ _

投稿2020/07/20 02:30

ozwk

総合スコア13553

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

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

okahijiki

2020/07/20 02:36

ご回答ありがとうございます。参考にします。
guest

0

見える化しましたw

http://pythontutor.com

n には毎回代入が行われていますが、使用する箇所がないためスルーされています。
ってのが、視覚的に分かるかと。

投稿2020/07/15 08:37

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

okahijiki

2020/07/15 22:59

皆様のご回答を拝読したあと、やってみると、「お!」という感じです。ありがとうございます。
guest

0

元の回答

for 文のふるまいについて、こちらのドキュメントを参照すると良いかもしれません:
8. 複合文 (compound statement) — Python 3.8.4 ドキュメント

python

1for_stmt ::= "for" target_list "in" expression_list ":" suite 2 ["else" ":" suite]

expression_list の結果対するイテレータが生成されます。
その後、イテレータが与えるそれぞれの要素に対して、
イテレータから返された順に一度づつ、スイートが実行されます。
...
その後、スイートが実行されます。
全ての要素を使い切ったとき
(シーケンスが空であったり、イテレータが StopIteration 例外を送出したときは、即座に)、
else 節があればそれが実行され、ループは終了します。

リンク先の説明で分かりにくい表現がいくつかりますので補足します

イテラブルオブジェクト

くり返し可能なオブジェクトのことで、
list, dict などが該当します
用語集 — Python 3.8.4 ドキュメント

イテレーター

実際にくり返しを行うためのオブジェクトです
用語集 — Python 3.8.4 ドキュメント
組み込み型 — Python 3.8.4 ドキュメント

スイート

これは上記の for 文の構造の説明の中の suite の部分を示しています
ドキュメントが日本語訳されたときに
カタカナに変換されてしまっているため、わかりにくくなっています

追記

イテラブルオブジェクトには、要素を反復して取り出せるイテレータが付与されている。
この解釈は、合っていますでしょうか。

「要素を反復して取り出せるイテレータ」
この部分は正しいです

「イテラブルオブジェクトには、イテレータが付与されている」
付与されているとは限りません

イテラブルオブジェクトとイテレーターの関係については
次の記述が参考になるでしょう

用語集 — Python 3.8.4 ドキュメント

iterable
(list, str, tuple といった) 全てのシーケンス型や、 dict や ファイルオブジェクト といった幾つかの非シーケンス型、 あるいは Sequence 意味論を実装した iter() メソッドか getitem() メソッドを持つ任意のクラス

また、

組み込み関数 iter() の引数として渡すと、 オブジェクトに対するイテレータを返します

投稿2020/07/15 08:22

編集2020/07/16 02:57
y_shinoda

総合スコア3272

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

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

okahijiki

2020/07/15 08:38

貼っていただいたページをチェックしてみました。 「イテラブルオブジェクト」「イテレーター」「スイート」それぞれの言葉のコンセプトは分からないのですが、説明文の行間より理解が進んだように思います。
y_shinoda

2020/07/15 08:56

説明を追記しました
okahijiki

2020/07/15 22:50

イテラブルオブジェクトには、要素を反復して取り出せるイテレータが付与されている。この解釈は、合っていますでしょうか。
y_shinoda

2020/07/16 02:58

説明を追記しました
guest

0

もう少し、突っ込んだ因果関係を知りたいと思ったりしています。

何がわからないのでしょうか。ループに入ったnは、無視しても構いません。

投稿2020/07/15 08:12

maisumakun

総合スコア146018

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

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

maisumakun

2020/07/15 08:12

もう少し、わからない箇所を言語化していただけないでしょうか?
okahijiki

2020/07/15 08:17

申し訳ないのですが、なんども考え、現状ではこれ以上、言葉にならないんですー。
maisumakun

2020/07/15 08:22 編集

ループで来たnを無視して、固定された値を出力することも可能です。 (文法的にはコードが成立しているけど、「配列をループで回すけど中身を見ない」というのは不自然なので、現実的には書く機会はまずないとは思います)
maisumakun

2020/07/15 08:23

引っかかっているのは、「なんでこんなことをしているのだろう?」という違和感でしょうか?
maisumakun

2020/07/15 08:41 編集

プログラムは「書いたとおり」に動作します。人間にとって意味があるかどうかとは関係なく、書かれたとおりに実行されます。
okahijiki

2020/07/15 08:54

>(文法的にはコードが成立しているけど、「配列をループで回すけど中身を見ない」というのは不自然なの>で、現実的には書く機会はまずないとは思います) あるチュートリアルをみていて「?_」と思った次第です。現実的には、まず書かいないコードというご指摘、ありがとうございます。
guest

0

この場合の関係は、「リストの要素の個数分、繰り返し実行される」というだけですね。
繰り返される処理にnの値が使われないことに違和感があるのでしょうが、実世界でも、
「並んでいる人数分、握手して微笑む」みたいな繰り返し処理をすることがありますね。
この場合、相手が誰かは関係なく、並んでいる人数分、動作を繰り返すだけです。

投稿2020/07/15 08:37

Daregada

総合スコア11990

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

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

okahijiki

2020/07/15 22:56

「相手が誰かは関係なく、並んでいる人数分、動作を繰り返すだけです」  だんだん感じがつかめて来ました。ありがとうございます。
guest

0

見える化しました

for index, value in enumerate(['taro','jiro','saburo','shiro']): print('index:{}, value:{},'.format(index, value) + ' Hello')

投稿2020/07/15 08:14

hentaiman

総合スコア6426

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

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

okahijiki

2020/07/15 08:27

ん、indexと対応しているvalueが順次出力されていくということでしょうかー。
hentaiman

2020/07/15 08:30

4回出力されるのはindexの数だけループしてるからという事ですよーってこと 疑問に思う箇所がそこじゃないなら何を回答したら良いのか分からないな
okahijiki

2020/07/15 08:35

いえ、そこです。
okahijiki

2020/07/15 08:52

すみません、index、valueという言葉は適切ではなかったかも知れません〜。
hentaiman

2020/07/15 12:39

■これは分かるが for value in ['taro','jiro','saburo','shiro']: print(value) print(' Hello') ■これは分からない for value in ['taro','jiro','saburo','shiro']: #print(value) print(' Hello') という事? コメントアウトした瞬間に疑問が湧くということ?
hentaiman

2020/07/15 12:39

インデントなくなってもーた
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問