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

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

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

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

Q&A

2回答

1275閲覧

Python のfor構文について教えてください。

mannah

総合スコア5

Python

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

0グッド

0クリップ

投稿2020/08/18 12:34

編集2020/08/18 12:54

下記動画を参照して、for文について勉強しています。
リンク内容

下記それぞれのソースコードを元に、質問させてください。

質問1 for文の num について
下記のfor文の中で、 num という カウンタ変数の中に、data のリストの中の値をはめこんで、一番左の値 である 0列目 (ここで言うと "70")をあてはめて右、for文回って右隣りである二列目("65")にズレる…という認識ですがあってますでしょうか。

リンク先の動画の 36:61 で、「カウンタ変数に数字が順次代入され」との説明があったので、 sum に 0,1,2,3,4…と足していくものと勘違いしていました。
連番なのか、リストの中身の取るかは、ソースによって違うのでしょうか。
(range の中に、連番が入っている?)

class Student: def __init__(self, name): self.name = name def calculate_avg(self, data): sum = 0 # data の 中身である[70,65,50,90,30]を num で左から格納する for num in data: sum += num avg =sum/len(data) return avg def judge(self, avg): if(avg >= 60): result = "passed" else: result = "failed" return result a001 = Student("sato") data = [70,65,50,90,30] avg = a001.calculate_avg(data) judge_result = a001.judge(avg) print(avg) print(a001.name) print(judge_result)

質問2 for文について
下記for 文の iカウンタ変数について質問です。
この "i" の部分は for 文が1週するごとに+1 していく認識なのですが、カウンタはソースの中で勝手に数を足し算できない認識であってますでしょうか。
(試しに、下記の3行目の += 10 を追加して、 "i" の中身を 表示させたのですが、for文が回るごとに、足した数がリセットされていました。)

for i in range(5): print(i) i += 10 print(i)

以上、よろしくお願いします。

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

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

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

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

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

raccy

2020/08/18 12:48 編集

ソースコードに"num"なるものが一切含まれていないため、なにを質問しているのかサッパリわかりません。質問に載せるソースコードが間違っていませんか?それとも"num"といっているのはソースコードには現れない別の何かですか?Pythonには"num"なる予約語もビルドインの型や関数もありませんので、"num"が一体何なのかサッパリわかりません。
meg_

2020/08/18 12:49

質問のコードと質問文の説明が一致していないかと思うのですが。質問文は動画についてですか?
guest

回答2

0

別の回答に対する質問に対する回答...になりますが, コメント欄だと読みづらいので回答として投稿させてください.

質問2
なのでリストや連番の元のデータと i はそこから次の要素に貼り直されるまで, 無関係になってしまいます.
↑これについては、10 に 元々の i(0)が貼り直される、という意味でしょうか。
二つ目のprint で10 が表示されるため、
for文の先頭に戻ったときにも、i の一列目に 10 が入ったままだが、
range の中身は [10,1,2,3,4]であり、
次の列のrange を参照しに行くため、次は 1 をみる、ということから、
「リストや連番の元のデータと i はそこから次の要素に貼り直されるまで, 無関係になってしまいます」
とおっしゃられている理解であっていますでしょうか…?

ちょっと違います.

まず, range() に「中身」があるとは限りません (実際, Python のバージョンによって「range() が呼ばれた時点ですべて生成する」動作だったり「range() は『イテレーションの決まりに従って連番を逐次生成するもの』を生成するだけで, その時点では連番そのものは生成しない」動作だったりします).

また, 連番リストだとしても,

Python

1renban = [0, 1, 2, 3, 4] 2for i in renban: 3 print(i) 4 i += 10 5 print(i)

このコードでは, renban の内容は変更されません.
矢印で 変数 → 参照先 を示すと

ループ初回, i += 10 より前:

renban → 連番リスト ├ [0] → 数値0 ← i ├ [1] → 数値1 ├ [2] → 数値2 ├ [3] → 数値3 └ [4] → 数値4

ループ初回, i += 10 より後:

renban → 連番リスト ├ [0] → 数値0 ←×― i → 10 ├ [1] → 数値1 ├ [2] → 数値2 ├ [3] → 数値3 └ [4] → 数値4

ループ2回目:

renban → 連番リスト ├ [0] → 数値0 i ―×→ 10 ├ [1] → 数値1 ←┘ ├ [2] → 数値2 ├ [3] → 数値3 └ [4] → 数値4

こんな動作になります.

投稿2020/08/19 03:05

kagilinn

総合スコア354

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

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

mannah

2020/09/09 13:38

返信遅れてしまい申し訳ありません。 i というカウンタ変数の参照先が、[0]→[1], [1]→[2]. ... という形で、[ ]の中を移動していくだけで、 じゃあ質問2の 10 がどこに行ったかというと、 [0] の中に代入された、という認識であってますでしょうか…!
kagilinn

2020/09/11 01:12

合っていません. まず i の参照先は [0] でも [1] でもなく数値の 0 や 1 そのものです. i が 0 のときに i += 10 したことで, 一旦 0 + 10 = 10 が計算され, i は 0 を見るのをやめ 10 を見るようになりました. しかし次のループの開始時に i は 10 を見るのをやめ 1 を見るようになるので, その時点で, 10 はどこからも見られなくなっています. 誰も 10 のことを見なくなってしまったので行方不明です. 10 がどこに行ったか. それは Python のみぞ知る状態です. 恐らくは, まもなく召されてしまうことでしょう. (ガベージコレクションで)
mannah

2020/09/11 11:26

理解しました。 i というカウンタ変数の参照先が、[0]→[1], [1]→[2]. ... という形で、[ ]の中を移動していくだけで、[0] にいるときは i は 10 を見てるままだけど、 じゃあ質問2の 10 がどこに行ったかというと、 [0] →[1] に変わった時点でiがリセットされ(というか[1] の中に入ったのでその中にある数値1 を持っている、という事なのですね。 ありがとうございました。
kagilinn

2020/09/11 11:42

10については分かってもらえたようで良かったです。 ただ「[1]の中に入った」と言う表現はやや気になります。 renban[1]は数値である1を参照しているとして、ループ中でiが参照するのはrenban[1]ではありません。 renban[1]とiはどちらも、メモリ上のどこかにある1を指しているのであって、i自身はループの中を実行しているときrenbanとは何の関係もないのです。 数値1はrenban[1]とiの2つから参照されているので両方と関係を持っていますが。
guest

0

動画を観てないので想像ですが, 恐らく for 【num】 in 【data】: のような説明だったのではないでしょうか.

(range の中に、連番が入っている?)

まさにここがポイントです.
for文を一言で言うと

Python

1for 変数 in イテレーションできる式: 2 処理

なのですが, イテレーションとは何ぞやと思うので例を挙げると, 代表的なものはリストです.

「データを次々と列挙するときの決まり事」があり, それに従って作られたものは「イテレーションできる」のです.
for文はinの後にリストが渡されると, 決まり事に従ってリストから1つずつデータを見ては, そこに変数 (例えば i) というラベルを貼り付けてから繰り返しの中の処理を実行していきます.

もうお察しかも知れませんが, range() は連番を作ってくれるものです.
そして range() が作ってくれる連番もイテレーションできるようになっているので, for文で次々と連番が作られては変数というラベルを貼られ, 処理を実行していきます.

for文はあくまでイテレーションの決まり事に従っているだけで, そこで毎回, 変数が何に貼られるのかは in の後に置かれたもの次第なんです.

また i += 10 は実は i + 10 を計算した結果の数値を用意して, その新しい数値に i を貼り直すという意味です.
なのでリストや連番の元のデータと i はそこから次の要素に貼り直されるまで, 無関係になってしまいます.

投稿2020/08/18 13:16

kagilinn

総合スコア354

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

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

mannah

2020/08/18 13:35

kagilinnさん ありがとうございます。 質問1は下記で理解できました。 そして range() が作ってくれる連番もイテレーションできるようになっているので, for文で次々と連番が作られては変数というラベルを貼られ, 処理を実行していきます. in の 後の中身を参照して、0列目から順番に変数として参照しているのですね。 質問2 なのでリストや連番の元のデータと i はそこから次の要素に貼り直されるまで, 無関係になってしまいます. ↑これについては、10 に 元々の i(0)が貼り直される、という意味でしょうか。 二つ目のprint で10 が表示されるため、 for文の先頭に戻ったときにも、i の一列目に 10 が入ったままだが、 range の中身は [10,1,2,3,4]であり、 次の列のrange を参照しに行くため、次は 1 をみる、ということから、 「リストや連番の元のデータと i はそこから次の要素に貼り直されるまで, 無関係になってしまいます」 とおっしゃられている理解であっていますでしょうか…?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問