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

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

新規登録して質問してみよう
ただいま回答率
85.35%
データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

Q&A

解決済

2回答

804閲覧

Python for in range

lovely

総合スコア28

データ構造

データ構造とは、データの集まりをコンピュータの中で効果的に扱うために、一定の形式に系統立てて格納する形式を指します。(配列/連想配列/木構造など)

Python

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

0グッド

1クリップ

投稿2021/09/03 12:52

下記のコードの構造が理解できません。
range(len(x))は、xの中に入っている数字の個数を数えた数字を0から代入していっているのはわかります。
ほかにもいろいろな個数の組み合わせで試したのですが全く理解できません。

python

1x=[1,2] 2y=[3,4,5] 3for i in range(len(x)): 4 for p in range(len(y)): 5 d=i+p 6 print(d)

実行結果
0
1
2
1
2
3

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

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

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

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

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

meg_

2021/09/03 13:32

> range(len(x))は、xの中に入っている数字の個数を数えた数字を0から代入していっているのはわかります。 では何が分からないのでしょうか?
guest

回答2

0

どこがどう分らないのか分かりませんが…
デバッグとかも同様ですが、その時点の変数の値が何であるかをよく観察したら動作が理解できる事が多いです。

以下のように変数をプリントするのが一番手っ取り早いです。

python

1x=[1,2] 2y=[3,4,5] 3for i in range(len(x)): 4 for p in range(len(y)): 5 d=i+p 6 print(f"{i=}\n{p=}\n{d=}\n---")

output

1i=0 2p=0 3d=0 4--- 5i=0 6p=1 7d=1 8--- 9i=0 10p=2 11d=2 12--- 13i=1 14p=0 15d=1 16--- 17i=1 18p=1 19d=2 20--- 21i=1 22p=2 23d=3 24---

追記
あっと・・・
print(f"{i=}\n{p=}\n{d=}\n---")
はpython3.8以降じゃないと動かない気がします。
print(f"i={i}\np={p}\nd={d}\n---")
と書くと、3.6以降なら動くと思います。
それ以前は別の書き方になりますが省略します(勉強していないので正しく書ける自信無しw)

投稿2021/09/03 13:22

編集2021/09/03 13:37
udon-ken

総合スコア657

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

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

0

ベストアンサー

多分ですけど、もしかして「ロジックの読み方がわからない」ってことですかね?

コードを読みましょう。

コードを読むコツは、「一行レベルで、何をしているかを考えながら読む」ですね。
たとえばコメントにするとかです。

今回の場合、

# リスト x を用意し, { 1, 2 } を入れる x=[1,2] # リスト y を用意し, { 3, 4, 5 } を入れる y=[3,4,5] # xにある個数分(= 2) ループしながら i にセットする for i in range(len(x)): # yにある個数分(= 3) ループしながら p にセットする for p in range(len(y)): # d は i + p したものである d=i+p # とりま、表示 print(d)

ですね。

これを日本語でも英語でもなんでもいいので、自分が読み書きできる言語で書き下す。

1. リスト x を用意して { 1, 2 } を入れる 2. リスト y を用意して { 3, 4, 5 } を入れる 3. x の長さ分ループしながら i にセット 3.1. y の長さ分ループしながら p にセット 3.1.1. d は i + p したものである 3.1.2. dの値を表示

これを疑似コードとします。

この疑似コードを現実世界でシミュレーションしてみてください。

つまり、手作業で、たとえば算数や数学とかをやるような感じでやってみてください。

こういう場合は変数やリストの値を意識するといいです。

(1), (2) は定義なのでスルー。(注目してもわかりきっていることなので)

(3)からが勝負です。

xの長さは何でしょうか。今回ははっきりと { 1, 2 } の 二個しかないので 要素数 = 2 となる。

なので、range( 0, 2 ) と同じになる。(今回の場合)

つまり、0~1 ですね。

最初は 0から開始しているので i = 0 となる。

同じように(3.1)も yの長さは 3 なので range( 0, 3 ) と同じになる。

よって p = 0 となる。

で、

x = { 1, 2 } y = { 3, 4, 5 } i = 0 p = 0

となっています。

で、(3.1.1) で d = i + p をします。

i + p = 0 + 0 = 0

となり、d = 0 となる。

で、さらに(3.1)に戻って、pを進ませたもの、つまり p = 1 となる。
(入れ子のforだと、内側から処理されていくので)

よって、

x = { 1, 2 } y = { 3, 4, 5 } i = 0 p = 1

で、d = i + p なので、

i + p = 0 + 1 = 1

となる。

さらに (3.1)に戻って、p を進ませる。つまり p = 2。

d = i + p を計算するので、d = 2。

で、(3.1)に戻ろうとしますが、条件は満たさない(もう要素数分やったので)ので、
このループから抜けます。

でもまだ (3)のループ内にあるので、(3)に戻る。

そうすると、(3)に戻って i を進ませる。そう、i = 1。

で、また(3.1)に行って p = 0 の状態からスタート。

よって、

x = { 1, 2 } y = { 3, 4, 5 } i = 1 p = 0 d = i + p ↓ i + p = 1 + 0 = 1

で、同じように 三回 (3.1)を繰り返して、(3)に戻り……とやります。

なので、質問にあるような結果になるのです。

投稿2021/09/03 14:46

BeatStar

総合スコア4962

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

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

BeatStar

2021/09/03 15:05

ただ、このサンプルの目的がよくわからないですね。 リストを用意しているけど、中身は使わないって… (それならいっそ、リストではなく直に指定したほうがマシだし)
udon-ken

2021/09/03 16:05

> リストを用意しているけど、中身は使わないって… ですよねえ。 まあ、引っかけ問題とかじゃないですかね。 コードだけ示して、コンピュータ無しで「これの実行結果はどうなるか?」みたいな。 自分は引っ掛かって「楽勝やん。最初が1+3,次が1+4…こんなの間違うヤツ居るのかよ?」って考える自信ありますw あ・・・質問者さん、これは単なる雑談でもなくて、こうじゃないからこういう間違いをしないようにっていうヒントも含んでいます。
BeatStar

2021/09/04 00:13

@ udon-kenさん > 自分は引っ掛かって... 私も回答するときに同じミスしてました。 流石に『定義しておいて、一切使わない』とは思わないじゃないですか。 でも実行結果では0,1,2...ってなっているので、よくよく読むと… まあ、いやらしい問題ですよね
javahack

2021/09/04 00:43

@BeatStarさん、@ udon-kenさん > このサンプルの目的がよくわからない もしかすると質問者さんはここに引っかかってるのかもしれませんね。 回答者になるような性悪(笑)な人は「引っかけ問題」「誤植」等裏読みしますが、初心者だと提示されているコードが全てで一所懸命に何か意味があるんじゃないかと悩んでしまっているのではないかと。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問