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

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

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

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

Q&A

解決済

2回答

479閲覧

pythonにて、素数判定のプログラムが上手く動作しない原因を教えてください。

kanon_2155103

総合スコア7

Python

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

0グッド

1クリップ

投稿2021/11/28 05:09

前提・実現したいこと

お世話になります。

以下のpythonの関数で、どんな数字を引数にしても "素数でも合成数でもありません" と返ってきます。どういった原因が考えられますか?

どうぞよろしくお願いいたします。

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

エラーは特に発生していません。

該当のソースコード

python

1def prime(n): 2 if n == 0 or 1: return print("素数でも合成数でもありません") 3 for i in range(2, int(n ** 0.5) + 1): 4 if n % i == 0: 5 return print("合成数です") 6 return print("素数です")

試したこと

print関数の部分を、True, False の判定に置き換えたら成功したのですが……。
また、インデントを加えたり引いたりと構造を変えてみてもだめでした。

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

1T2R3M4

2021/11/28 05:11

if 1: の意味は分かりますか。
kanon_2155103

2021/11/28 05:14

ありがとうございます。 2行目の部分でしょうか?
1T2R3M4

2021/11/28 05:16

2行目に絡むことですがpythonで単純に if 1: としたときの振る舞いに関してです。
kanon_2155103

2021/11/28 05:18

1の場合、という意味でしょうか……。 あまり自信がございません。
meg_

2021/11/28 06:42

「python if 複数条件」で検索すると複数条件の書き方が分かるかと思います。
kanon_2155103

2021/11/28 12:59

ありがとうございます。 調べてみます!
guest

回答2

0

ベストアンサー

(n == 0) or 1 は常に真だからです。

なぜそうなるかというと、Pythonの演算子の優先順位では、orは==よりも優先順位が低いからです。

そのためn == 0 or 1(n == 0) or 1と同じになります。

優先順位については公式ドキュメント 6.17. 演算子の優先順位をお読み下さい。

そして1とTrueは等しいものです。

python

1>>> True == 1 2True

もっとも、これが1でなくても0でない整数はこういう場合いはTrueとして扱うことになっています。

公式ドキュメント 6.11. ブール演算 (boolean operation)には以下のように書かれています。

Document

1ブール演算のコンテキストや、式が制御フローの文で使われる際には、次の値は偽だと解釈されます: 2False 、 None 、すべての型における数値の 0、空の文字列、空のコンテナ (文字列、タプル、 3リスト、辞書、集合、凍結集合など)。 それ以外の値は真だと解釈されます。

投稿2021/11/28 05:16

編集2021/11/28 08:55
ppaul

総合スコア24666

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

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

kanon_2155103

2021/11/28 05:20

ご回答ありがとうございます。 なるほど、0 or 1 が数値ではなく真偽値として受け取られてしまっているのですね……。
kanon_2155103

2021/11/28 05:34

重ねて失礼いたします。 はじめの if 文の条件を、"n == int(0) or int(1)" と変えてみたのですが、結果が変わりません。 宜しければ、どうすれば良いかご教示いただけませんか?
ppaul

2021/11/28 08:41

0 or 1 が数値ではなく真偽値として受け取られてしまっているのですね……。 違います。
kanon_2155103

2021/11/28 13:06

ありがとうございます! 優先順位があるとは盲点でした。それを視野に入れて、もう一度コードを見直して参ります。
guest

0

恐らく、「nの値が0か1なら」と書きたいのでしょうけど、if n == 0 or 1:では意味が全く違ってきますよ。

if n == 0 or 1 だと、

p: n == 0 q: 1 条件: p∨q

となっています。

pでは、単純に n == 0 かどうかで判断しますが、qでは、「常に真」、つまり「絶対に満たす」です。
よって、「nの値が0かそれ以外なら」ということになってしまいます。

具体的に2を入れてみましょう。本来なら素数となるはずです。少なくとも。
でも「nの値が0かそれ以外なら」です。つまり、0 or それ以外 のどちらかであれば処理します。
n = 2のとき、2は0ではありませんが、「それ以外」の方を満たししてしまいます。
よって、return print("素数でも合成数でもありません")が処理されます。

if (n == 1) or (1):と考えてみるといい気がします。
他の方も仰っているように「0か空でない場合は真になる」のですから、if 1:if true: と同じになります。(厳密には違うだろうけど)

投稿2021/11/28 11:30

BeatStar

総合スコア4958

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

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

kanon_2155103

2021/11/28 13:24

ご回答ありがとうございます。 if文の内容を "(n == 0) or (n == 1)" としてみたのですが、今度は2以上の数を引数にした時、何も返ってこなくなってしまいました。 なかなか理解が及ばず恐縮ですが、今一度どこが間違っているのかご教示頂けましたら幸いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問