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

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

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

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

Q&A

解決済

4回答

542閲覧

Pythonのif文の条件式において、演算子が必要な時といらない時の違いがわからない

kamogi

総合スコア1

Python

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

0グッド

0クリップ

投稿2021/05/27 01:46

編集2021/05/27 03:08

Pythonのif文における条件式を書くときに、演算子を用いて、True又は、Falseと比較する時もあれば、比較しないで変数名だけを条件式に入れたりすることがあると思います。
その違いがいまいちわからないです。

Python3.7.5です。

Python

1a = 'True' 2 3if a: 4 print('aはTrueです。') 5else: 6 print('aはTrueではないです。')

上記のコードの出力結果は、もちろん「aはTrueです。」になります。
しかし下記のパターンだと、idはseleniumの画面上に存在しないのに、「aはTrueです。」となってしまいます。
※指定のidはseleniumの画面上に存在しないです。

画面上に存在しない場合は、指定のidまでスクロールしたいと考えています。
画面内に存在する場合は、スクロールしない処理を行いたいと思っています。

Python

1a = self.driver.find_element_by_id('id名') # 存在しないID 2 3if a: 4 print('aはTrueです。') 5else: 6 print('aはTrueではないです。')

上記のプログラムの結果は、「aはTrueではないです」になります。
僕の認識では、idは存在すしないので、「aはTrueではないです」が結果になるという認識でいるのですが、なぜ「aはTrueです」になるのかを教えていただきたいです。

ちなみに、下記のプログラムに変更すると、「aはTrueではないです」になります。

Python

1a = self.driver.find_element_by_id('id名') # 存在しないID 2 3if a == True: 4 print('aはTrueです。') 5else: 6 print('aはTrueではないです。')

優しく教えていただけますと、助かります。
よろしくお願いします。

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

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

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

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

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

quickquip

2021/05/27 02:25

if a: と if a == True: の結果が逆なように感じられるのですが合っていますか。 (コードは第三者が試せる状態にした方がいいと思います)
kamogi

2021/05/27 02:40

すみません、逆でした。。 修正します。。
meg_

2021/05/27 03:01

> ※指定のidは存在しないです。 エラーになりませんか?
kamogi

2021/05/27 03:07

すみません、書き方が悪かったです。。 修正します。 画面上に要素がないということが言いたかったです。 画面上に要素がなければ、idの要素があるところまでseleniumでスクロールして、id画面上にあれば、スクロールしないという判定を行いたいと思っています。
guest

回答4

0

ベストアンサー

そもそも例外投げるなりしないとエラー起こりそうですがそれは置いといて

上記のプログラムの結果は、「aはTrueではないです」になります。
僕の認識では、idは存在すしないので、「aはTrueではないです」が結果になるという認識でいるのですが、

認識している結果と一致しているので問題ないのでは??
何をそんなに悩んでいるんでしょう??

「aはTrueです」になるのかを教えていただきたいです

ならないと思います。

webdriverで考えるから話がややこしくなっているだけなのでは?

find_element_by_idの戻り値は「リスト型」なので、
「存在しないエレメントを検索」 = 空のリストが返ってきた。
と置き換えて考えると分かりやすいのではないでしょうか。

python

1elm = []; #要素が存在しなかったfind_element_by_idの返り値の代わり 2 3if elm: 4 print("true"); 5else : 6 print("false"); #リストの中身は空なので当然こちらが実行される 7 8if elm == True: 9 print("true"); 10else : 11 print("false"); #リストとTrueではそもそも型が違う(リストはList型、TrueはBool型)ので当然こちら 12 13elm.append('hoge'); #要素が存在した場合(実際返ってくるのはWEBElementのリスト) 14 15if elm: 16 print("true"); #リストの中身は空じゃないので当然こちらが実行される 17else : 18 print("false"); 19 20if elm == True: 21 print("true"); 22else : 23 print("false"); #リストとTrueではそもそも型が違う以下略

ifが比較している対象の型は何なのかもしっかり確認する事です。

投稿2021/05/27 03:24

編集2021/05/27 03:28
tmsw

総合スコア97

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

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

kamogi

2021/05/27 03:48

丁寧なご回答ありがとうございます。 とてもわかりやすかったです。 最初の質問からだいぶ離れているのですが、僕の知りたかったことは下記になります。 ``` print(bool(self.driver.find_element_by_id('id名'))) ->True if self.driver.find_element_by_id('id名'): print('Trueです') else: print('Trueではないです。') ``` 上記の実行結果は、「Trueです」になります。 ですが、下記の書き方だと、「Trueではないです」になります。 ``` print(bool(self.driver.find_element_by_id('id名'))) ->True if self.driver.find_element_by_id('id名') == True: print('Trueです') else: print('Trueではないです。') ``` なぜ、ここに差が生まれるのかを知りたいです。 もしよろしければ教えていただけないでしょうか??
tmsw

2021/05/27 04:15 編集

>なぜ、ここに差が生まれるのかを知りたいです。 回答にも書いてますが前提として【戻り値がList型】であると言う認識をする必要があります。 >print(bool(self.driver.find_element_by_id('id名'))) ではオブジェクトの真偽判定のみなので、要素があれば True,無ければFalseになります。 self.driver.find_element_by_id('id名') == True: 一方、こちらは【型の比較】も行われてます。 【List型に対してBool型を比較】しているので要素があろうとなかろうとFalseになります。 つまるところ、型も比較しているしていないの差といった感じでしょうか。 ======== 根本的な話は変わりませんが、私の思っていた所と知りたい部分が違ったのかもと思ったので捕捉です。 self.driver.find_element_by_id('id名')に要素がである(True)前提で ①if self.driver.find_element_by_id('id名'): ②if self.driver.find_element_by_id('id名') == True: に差があるのは【型比較があるかないかの差】です。 ①は中身があるかどうかしか見ていないの対し、 ②は型も比較しています。比較しているのは【==演算子】です。 書き換えるならば if List型(中身があるので条件式的にはTrue) == Bool型(True)となり、違うので当然Falseになります。
kamogi

2021/05/27 04:13

とてもわかりやすい回答ありがとうございます。 大変助かりました。 もっと、勉強します。 ありがとうございました。
guest

0

すみません、ちょっと自分の方でもう一度整理してみます。

投稿2021/05/27 03:13

kamogi

総合スコア1

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

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

0

aがFalseかNoneでなければelseに遷移します。

投稿2021/05/27 03:03

goto_yuta_

総合スコア211

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

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

0

僕の認識では、idは存在するので、「aはTrueです」が結果になるという認識でいるのですが、なぜ「aはTrueではないです」になるのかを教えていただきたいです。

どうしてそう認識したのでしょうか。
その認識をちゃんと確認してみるべきです。

関数やメソッドを複数回実行したときの結果が同じになる保証はありません。

if文の真偽については、Pythonにおける真偽値(真理値)の判定を一度通読された方が良いと思います。

また、”True"とTrueは同じではないということは理解しておいてください。

投稿2021/05/27 02:03

編集2021/05/27 02:08
ppaul

総合スコア24666

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

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

kamogi

2021/05/27 02:46

すみません、色々と勘違いしていました。 参考記事等、丁寧に回答していただのに、申し訳ないです。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問