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

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

ただいまの
回答率

87.33%

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

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 387

score 1

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

Python3.7.5です。

a = 'True'

if a:
    print('aはTrueです。')
else:
    print('aはTrueではないです。')

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

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

a = self.driver.find_element_by_id('id名') # 存在しないID

if a:
    print('aはTrueです。')
else:
    print('aはTrueではないです。')


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

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

a = self.driver.find_element_by_id('id名') # 存在しないID

if a == True:
    print('aはTrueです。')
else:
    print('aはTrueではないです。')

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • kamogi

    2021/05/27 11:40

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

    キャンセル

  • meg_

    2021/05/27 12:01

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

    キャンセル

  • kamogi

    2021/05/27 12:07

    すみません、書き方が悪かったです。。
    修正します。

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

    キャンセル

回答 4

checkベストアンサー

+1

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

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

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

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

ならないと思います。

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

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

elm = []; #要素が存在しなかったfind_element_by_idの返り値の代わり

if elm: 
  print("true");
else :
  print("false");  #リストの中身は空なので当然こちらが実行される

if elm == True:
  print("true");
else :
  print("false"); #リストとTrueではそもそも型が違う(リストはList型、TrueはBool型)ので当然こちら

elm.append('hoge'); #要素が存在した場合(実際返ってくるのはWEBElementのリスト)

if elm: 
  print("true"); #リストの中身は空じゃないので当然こちらが実行される
else :
  print("false");

if elm == True:
  print("true");
else :
  print("false"); #リストとTrueではそもそも型が違う以下略

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/27 12: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ではないです。')
    ```
    なぜ、ここに差が生まれるのかを知りたいです。
    もしよろしければ教えていただけないでしょうか??

    キャンセル

  • 2021/05/27 13:01 編集

    >なぜ、ここに差が生まれるのかを知りたいです。

    回答にも書いてますが前提として【戻り値が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になります。

    キャンセル

  • 2021/05/27 13:13

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

    もっと、勉強します。
    ありがとうございました。

    キャンセル

  • 2021/05/27 19:55

    find_element_by_id(id_)の結果は単一のWebElement(idが存在する場合)ではありませんか?https://selenium-python.readthedocs.io/api.html#module-selenium.webdriver.remote.webelement

    キャンセル

0

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/05/27 11:46

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

    キャンセル

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.33%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る