人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

Pythonのif文に関する質問です。

##########
x = 0
cities = ['大阪', '東京', '名古屋', '福岡']
numbers = [0,1]
for i in range(len(cities)):
for num in numbers:
if cities[i+num].startswith('大'):
break
x = x + 1

print(x)
##########

上記のコードだと、IndexErrorが出ます。
1つ目のforループでiが一番大きい値(3)をとり、かつ2つ目のforループでnumが1をとると、cities[i+num]はcitiesのインデックス4を見ようとするが、そんなものはないからです。
しかし、if notに変えた、

##########
x = 0
cities = ['大阪', '東京', '名古屋', '福岡']
numbers = [0,1]
for i in range(len(cities)):
for num in numbers:
if not cities[i+num].startswith('大'):
break
x = x + 1

print(x)
##########

というコードだと、エラーが出ません。
なぜエラーが出ないのでしょうか?

※なぜか半角スペースだとインデントが表示上反映されなかったので、全角スペースでインデントしてます。

●質問者: midnightseminar
●カテゴリ:コンピュータ ウェブ制作
○ 状態 :終了
└ 回答数 : 1/1件

▽最新の回答へ

1 ● a-kuma3
●100ポイント ベストアンサー

1つ目のforループでiが一番大きい値(3)をとり、かつ2つ目のforループでnumが1をとると、cities[i+num]はcitiesのインデックス4を見ようとするが、そんなものはないからです。

ここに書いてあるままが、if not に変えたときにエラーが出ない理由です。

二重のループで、i と num がどのように変わっているかを print してみると分かると思います。

# your code goes here
x = 0
cities = ['大阪', '東京', '名古屋', '福岡']
numbers = [0,1]
for i in range(len(cities)): 
 for num in numbers:
 print(i,num) # i と num を print してみる
 if not cities[i+num].startswith(''):
 break
 x = x + 1
 
print(x)

標準出力。

(0, 0)
(0, 1)
(1, 0) # 東京、名古屋、福岡には「大」がないから、
(2, 0) # num == 0 で内側のループを抜けてしまう
(3, 0)
4

midnightseminarさんのコメント
理解しました。ありがとう御座います。
関連質問

●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ