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

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

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

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

Q&A

解決済

4回答

13051閲覧

Python:elseの無いif文について

rapid_aoba

総合スコア13

if

if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

Python

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

0グッド

1クリップ

投稿2018/09/30 05:28

編集2018/09/30 05:56

前提・実現したいこと

Pythonの勉強で、独学プログラマー(コーリー・アルソフ著 NIKKEI BP)を読んでいたら、178ページ目からelseが無いのにその役割を果たしていると思われる箇所が現れました。これは文法的にOKなのでしょうか。

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

言語名:Python ()内は本のソースコードが掲載されているURL
本をお持ちなら179ページの上部、コードの後半
(#http://tinyurl.com/jj22qv4)
抜粋:

def

1 if self.value < c2.value: 2 return True 3 if self.value == c2.value: 4 if self.suit < c2.suit: 5 return True 6 else: 7 return False 8 return False

181ページのコードの最後(http://tinyurl.com/jz8zfz7)
抜粋:

  def rm_card(self): if len(self.cards)==0: return return self.cards.pop() (←ここが該当箇所)

183ページのコード本:27〜30行目、サイト33〜35行目(http://tinyurl.com/huwq8mw)

  def play_game(self): cards = self.deck.cards print("beginning War!") while len(cards) >= 2: m = "q to quit. Any " + \ "key to play:" response = input(m) if response == 'q': break p1c = self.deck.rm_card() (ここが該当箇所) p2c = self.deck.rm_card() p1n = self.p1.name p2n = self.p2.name
が該当します。 特に183ページ目は、後の方にelseが使われており、使われていない場合とどう違うのか分かりませんでした。 ### 試したこと elseを付けて上のコードを打ってみようとすると15分以上かかりそうなので質問してます。 ### 補足情報(FW/ツールのバージョンなど) なし

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

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

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

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

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

maisumakun

2018/09/30 05:31

Pythonはインデントが意味を持つ言語なので、コードブロックで囲んでインデントまで再現するようにしてください。
rapid_aoba

2018/09/30 05:33

あれ、書いた時はインデントしてたのに回答者に見える文がインデントなしになってますね
pepperleaf

2018/09/30 05:36 編集

コードの挿入(<code>アイコン)で入力しないと、行頭の空白は削除されるみたいです。
rapid_aoba

2018/09/30 05:37

1個目のCodeだけインデントつきにしました。2、3つ目努力中です
rapid_aoba

2018/09/30 05:57

やっとまともな体裁の質問文になりました
guest

回答4

0

ifreturnする条件を変える場合、ifが成立している場合はreturnしてしまって、
もともとあとのコードは実行されないので、elseがあってもなくても意味合い的には同じです。

python

1def gt(self,c2): 2 3 if self.value==c2.calue: 4 if self.suite >c2.suit: 5 return True 6 else: 7 return False 8 # self.value==c2.calueが成立する場合は、 9 # 上のどちらかのreturnで戻ってしまうため、ここまで来ない 10 # elseを付けてもいいけど、意味はない 11 return False

なお、183ページの方はインデントが崩れて意味をとるのも困難なので、いったん割愛します。

投稿2018/09/30 05:36

maisumakun

総合スコア145121

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

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

rapid_aoba

2018/09/30 05:49

なるほど、そういう場合もあるのですね。自分が書く場合は統一するためelseを付けたいです。
maisumakun

2018/09/30 05:49

もともとelseが不要な場合書く必要はありませんし、「ある条件を満たしたときだけさっさと脱出させて、残りのインデントを下げずに書く」というのは「ガード節」と名前もついているテクニックです。
rapid_aoba

2018/09/30 05:57

テクニックなんですね。検索してみます
rapid_aoba

2018/09/30 06:02

183頁の方もbreakで「脱出」してしまうので、・・・という同じ理屈なんでしょうか?
maisumakun

2018/09/30 06:50

そうですね、breakするのでifが成立する場合はそれ以下のコードは実行されません。
guest

0

ベストアンサー

コードの内容については他の方がすでに回答されているので、

これは文法的にOKなのでしょうか

についてだけ。


OKです。

ドキュメントから構文の定義を引用します。

if 文は、条件分岐を実行するために使われます:

if_stmt ::= "if" expression ":" suite
( "elif" expression ":" suite )*
["else" ":" suite]

if 文は、式を一つ一つ評価してゆき、真になるまで続けて、真になった節のスイートだけを選択します (真: true と偽: false の定義については、 ブール演算 (boolean operation) 節を参照してください); 次に、選択したスイートを実行します (そして、 if 文の他の部分は、実行や評価をされません)。全ての式が偽になった場合、 else 節があれば、そのスイートが実行されます。

8. 複合文 (compound statement) — Python 3.6.5 ドキュメント | 8.1. if 文

EBNFという書式で書かれているので、ご存知でないとしんどいかもしれません。私も日常的にこれを使うような生活はしていないので、しんどいです。

とはいえ、これが構文を表していますから、読み解いていきましょう。

EBNF - Wikipedia

expressionとかsuiteにはまたそれに対応する文法の定義があり、それに則って書いてね、ということになっています。それ以外の部分が純粋なifの書式です。

()で囲まれているelif節に該当する部分はグループ化されていて、この()によって後ろのアスタリスク*が及ぶ範囲を規定しています。*は0回以上の繰り返しかな、たぶん。

そして[]で囲まれているelse節に該当する部分ですが、[]で囲むことであってもなくても良い、ということを表現しています。

なので、文法的にはelse節はあってもなくても良いものです、が答えになります。

投稿2018/09/30 08:49

編集2018/09/30 09:18
hayataka2049

総合スコア30933

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

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

0

次のコードとその実行結果をご覧ください。
if_else.py

python3

1def foo(x): 2 if x == 0: 3 return True 4 else: 5 return False 6 7 8def foo_1(x): 9 if x == 0: 10 return True 11 return False 12 13def foo_2(x): 14 return True if x == 0 else False 15 16def foo_3(x): 17 return x == 0 18 19def foo_4(x): 20 ans = None 21 if x == 0: 22 ans = True 23 else: 24 ans = False 25 return ans 26 27def foo_5(x): 28 ans = False 29 if x == 0: 30 ans = True 31 return ans 32 33def foo_6(x): 34 ans = True if x == 0 else False 35 return ans 36 37def foo_NG(x): 38 if x == 0: 39 return True 40 41for x in (0, 1): 42 print(x, ": ", foo(x), foo_1(x), foo_2(x), foo_3(x), foo_4(x), foo_5(x), foo_6(x), foo_NG(x))

実行結果:
イメージ説明

メソッドで return が実行されなければ、 None が返ります。(foo_NG() を見てください)
必ず reitu を実行させるとして、どのように書くかもバリエーションがあります。

  • return を 2つ書くか、1つで済ませるか
  • return True, return False のように書くか
  • 結果を変数に設定し、メソッドの最後でその変数を return するか.

投稿2018/09/30 07:07

katoy

総合スコア22324

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

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

0

183ページ目ですが、breakはwhileループから抜け出すことになるので、else節を置くのとはまた違う意味合いになる(結果として限りなく実質的に同じになることはある)と思います。

breakとelseの使い方について正にピンポイントな解説をしてくれているページがあったので紹介しておきます。
http://programming-study.com/technology/python-break/

投稿2018/09/30 09:53

KojiDoi

総合スコア13669

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問