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

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

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

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

Q&A

解決済

2回答

242閲覧

ifの条件の書き方がわからない

soi_u

総合スコア1

Python

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

0グッド

0クリップ

投稿2022/01/15 19:04

def win1():
#勝ち手の列挙
winlist=[[0,1,2],[0,4,8],[2,4,6],[3,4,5],[6,7,8],[0,3,6],[1,4,7],[2,5,8]]
#勝ち手に当てはまるか確認

for i in range(0,len(winlist)): [a,b,c]=winlist[i] if board[a] and board[a]==board[b] and board[a]==board[c]: #あてはまる記号を入れる return board[a]

三目並べのプログラムを作成しているのですが、ifの条件を設定する際に、どうして
if board[a] and board[a]==board[b] and board[a]==board[c]:
で通る(実行できてしまう)のでしょうか?
if board[a]==board[b] and board[b]==board[c]and board[c]==board[a]:
という書き方は納得できたのですが...

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

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

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

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

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

y_waiwai

2022/01/15 22:55

なにが納得できないんでしょうか。 問題が見えません
quickquip

2022/01/15 23:35

うっかり書いちゃったコードがなぜ文法エラーにならなかったのか? という質問でしょうか
soi_u

2022/01/18 23:57

返信が遅くなってしまい申し訳ないです。 あるサイトを参考にしてコードを書いていたのですが、そのサイトに記載されていたコードが どうしてそのような書き方になるのか疑問を持ちました。(2行目のコード) その後、4行目のコードを思いつき、なぜ文法エラーにならなかったのかとも疑問に思った次第です。
guest

回答2

0

ベストアンサー

引っ掛かりそうなところ1 if board[a] の気持ち悪さ?

Trueの場合は比較対象を端折っても通ります。

Python3

1if True: 2 print("Hiya, guys!")

引っ掛かりそうなところ2 aは比較してないじゃないか!

if board[a] and board[a]==board[b] and board[a]==board[c]:

この式の一番初めのaを見るところは、先述の理由で「中身がTrueであれば」それだけで成立します。

ですので、この式が言いたいことは、

  • aがTrue
  • aとbが同じ(=bもTrue)
  • aとcが同じ(=cもTrue)

ならif文を通すよ、ということになります。

引っ掛かりそうなところ3 二つの式は本当に等価?

これが指すところは、表現は違いますが、

if board[a]==board[b] and board[b]==board[c]and board[c]==board[a]:

  • aとbが同じ
  • bとcが同じ
  • cとaが同じ

半分は同じになります。

初めの式はすべてTrueの時しか成立しませんが、あとの式はすべて同じの時に成立してしまいます。つまり、あとの式ではaもbもcも全てFalseなら成立してしまいます。

いかがでしょうか?

もっといい策? - all()を使うと全てTrueの時しか通りません。

Python3

1if all((board[a],board[b],board[c])): 2 print("Wazzup?") 3

投稿2022/01/15 23:50

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

soi_u

2022/01/19 04:49

回答が遅くなってしまい申し訳ないです。 単純に私のbool型とifの条件の勉強不足でした… ppaulさんが貼ってくださった記事と合わせて解決できました、ありがとうございました!
guest

0

まず、
Pythonの真偽値bool型(True, False)と他の型との変換・判定
Pythonの論理演算子and, or, not(論理積、論理和、否定)
を読んでみてください。
それでわからなければ、どこがわからないかを質問に追加してください。

投稿2022/01/15 23:42

ppaul

総合スコア24666

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

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

soi_u

2022/01/19 04:52

回答が遅くなってしまい、申し訳ないです。 fourteenlengthさんの回答と合わせて解決できました! ありがとうございました。 ベストアンサーはfourteenlengthさんの回答が分かりやすかったのでそちらにさせていただきます。 申し訳ないです…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問