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

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

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

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

Q&A

解決済

3回答

5014閲覧

ifとreturnのインデントの位置について

arisann50

総合スコア16

Python 3.x

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

0グッド

0クリップ

投稿2019/01/17 10:28

編集2019/01/17 11:14

前提・実現したいこと

インデントの使い方で困っています、ご回答いただけますと幸いです

具体的には{該当のソースコード}の5行目#( ↓ここのreturnの位置のことですの行)のreturn Trueのインデントの位置です
3行上のifに揃えないと実行できないのですが、なぜでしょうか?

if文が終わっている、if文を抜け出しているはずなのでreturn Trueの位置はどこでもよいと思うのですが納得できません。

もし
else return True
と書くならば、ifとelse return True のインデントは揃えないといけないのは理解しております

昔C言語を学校で学んでいた際、C言語はインデントは揃えていた記憶がありません(これは私の勘違いかもしれませんが)
ご回答いただけますと幸いです、よろしくお願いします

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

python

1 2def validate(hand): 3 if hand < 0 or hand > 2: 4 return False 5 # ↓ここのreturnの位置のことです 6 return True 7 8def print_hand(hand, name='ゲスト'): 9 hands = ['グー', 'チョキ', 'パー'] 10 print(name + 'は' + hands[hand] + 'を出しました') 11 12print('じゃんけんをはじめます') 13player_name = input('名前を入力してください:') 14print('何を出しますか?(0: グー, 1: チョキ, 2: パー)') 15player_hand = int(input('数字で入力してください:')) 16 17if validate(player_hand): 18 if player_name == '': 19 print_hand(player_hand) 20 else: 21 print_hand(player_hand, player_name) 22else: 23 print('正しい数値を入力してください') 24 25

試したこと

return Trueの位置をいろいろ変えて実行しました
結果は上記にも記載の通り二行上のifに揃えたときのみ実行できました

補足情報(FW/ツールのバージョンなど)

コードはprogateと言うプログラミング学習サイトの[pythonコース]の[python3(レッスン3)]の[returnの性質]から引用しています

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

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

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

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

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

guest

回答3

0

ベストアンサー

if文が終わっている、if文を抜け出しているはずなのでreturn Trueの位置はどこでもよいと思うのですが納得できません。

ifブロックと同じ階層にあることが重要なのです。
次のように書いてエラーになるのと同じです。

Python

1print('hello') 2 print('world')

昔C言語を学校で学んでいた際、C言語はインデントは揃えていた記憶がありません(これは私の勘違いかもしれませんが)

構文の特徴の違いです。
C系の言語は過剰な空白文字を無視しますが、Pythonの場合インデントが深い意味を持ちます。

前者はフリーフォーマット、後者はオフサイドルールなんて呼ばれてますね。
Pythonがオフサイドルールを採用している理由については、このように述べられています。

####Python はなぜ文のグループ化にインデントを使うのですか?

...中略...
時折、C のプログラマはこのようなコード片に出くわします:

C

if (x <= y)
x++;
y--;
z++;

この条件文が真の時のみ実行されるのは x++ 文だけですが、このインデントでは誤解を招きます。経験を積んだ C プログラマでさえ、 y が x > y の時にもデクリメントされるのはなぜか分からず長いこと立ち止まることがあるでしょう。

引用元: Python よくある質問 » デザインと歴史 FAQ

投稿2019/01/17 10:34

編集2019/01/17 12:16
LouiS0616

総合スコア35660

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

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

arisann50

2019/01/17 12:15

修正後も回答してくださりありがとうございます! print('hello') print('world') の例はとても参考になりました。 簡潔かつ早く、私が知りたいことを教えてくださいました! ありがとうございました
guest

0

たぶん3パターンかなと思うので、列挙します。

質問文にある通りのインデント

Python

1def validate(hand): 2 if hand < 0 or hand > 2: 3 return False 4 5 return True
  1. (関数が呼び出されたとして)関数が呼び出されます。
  2. 関数の処理としてif文に入ります。

2-1. handが0未満もしくは2より大きければFalseが返ります。(このあとの処理はされない)
3. 関数の処理の続きでTrueが返ります。

質問文にあるインデントからもう1個足したもの(return Falseと同じ)

Python

1def validate(hand): 2 if hand < 0 or hand > 2: 3 return False 4 5 return True
  1. (関数が呼び出されたとして)関数が呼び出されます。
  2. 関数の処理としてif文に入ります。

2-1. handが0未満もしくは2より大きければFalseが返ります。(このあとの処理はされない)
(2-2.) 処理が続かないのでreturn Trueは実行されません。

この場合、handが0以上2以下ならNoneが返ります(たぶん)

質問文にあるインデントから1個抜いたもの(def validate(hand):)と同じ

Python

1def validate(hand): 2 if hand < 0 or hand > 2: 3 return False 4 5return True

** エラーとなります。 **

  1. (関数呼び出しが行われず)return Trueになりますが、関数外なのでエラーです。

※関数呼び出しの前にエラーになっているので関数呼び出し後の処理は省略

投稿2019/01/17 10:43

dice142

総合スコア5158

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

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

arisann50

2019/01/17 12:16

ご回答ありがとうございます! とても参考になりました!
guest

0

そのreturn Truedef以下のブロックに属します。なので、上のifと同じレベルに揃える必要があります(言語仕様上はスペース・タブ幾つであっても構いませんが、同一のブロック階層のものはすべて等しいレベルにないと動作しません。現実的には乱れると大変なので、スペース4つ単位をおすすめします)。

ちょっとむずかしいですが、言語リファレンスに説明が書いてあります。

2. 字句解析 — Python 3.6.5 ドキュメント | 2.1.8. インデント

投稿2019/01/17 10:40

hayataka2049

総合スコア30933

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

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

arisann50

2019/01/17 12:16

ご回答ありがとうございます! とても参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問