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

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

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

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

Q&A

解決済

2回答

786閲覧

assert文を機能させたい

874-3175-8...

総合スコア6

Python

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

0グッド

0クリップ

投稿2021/05/13 02:11

目的

大学の自由課題で、1000以下の素数を表示するプログラムを書きました。そこで、素数と非素数の個数の和が1000になることを確認するために、assert文を使ってみました。ただ、素数表示のプログラムは機能するのですが、assert文のところでエラーが発生してしまうので、解決策をお願いします。

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

入力したプログラム全体を最初に書きます。長いですがすいません。

# 1000未満の素数を表示する import math # 素数判定関数 def prime(num): if num < 2: return False # 2未満の数字は非素数 elif num == 2: return True # 2は素数 elif num % 2 == 0: return False # 偶数は非素数 # その数の平方根以下の奇数で割り切れるか調べる for i in range(3, math.floor(math.sqrt(num))+1, 2): if num % i == 0: return False # 途中で割り切れるものは非素数 else: return True # 素数 # 素数表示関数 def showprime(input_num=1000): numbers = [] # 素数を探してリストに追加 for i in range(1, input_num): if prime(i): numbers.append(i) return numbers   ok = 0 # 素数の個数をカウント   ng = 0 # 非素数の個数をカウント   if numbers == prime(num):   ok += 1   else:     ng += 1   assert ok + ng == input_num # 素数と非素数の個数の総和 print(showprime(1000))
File "<ipython-input-37-d2c806c85a86>", line 29 ok = 0 # 素数の個数をカウント ^ SyntaxError: invalid character in identifier

該当のソースコード

ok = 0 # 素数の個数をカウント

試したこと

余分な空白があるということなのですが、それをなくすとassert文のところで、

File "<ipython-input-44-3122a612f2a9>", line 33
else:

SyntaxError: invalid character in identifier

と表示されてしまいます。
そこでelseをなくしてみると、

NameError Traceback (most recent call last)
<ipython-input-46-0c313c81ab68> in <module>()
29 ok = 0 # 素数の個数をカウント
30 ng = 0 # 非素数の個数をカウント
---> 31 if numbers == prime(num):
32 ok += 1
33

NameError: name 'numbers' is not defined

となってしまいました。

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

Google Colaboratory を使っています。

###最後に

Python初心者でありかつ初質問なので、至らない点があるかもしれません。その際は今後のためにも教えてもらえると非常に助かります。長くなりましたがよろしくお願いします。

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

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

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

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

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

guest

回答2

0

ベストアンサー

とりあえず2つ問題があります。

showprime関数は途中でruternしていてassertが実行されません。

python

1 return numbers

ただ、それ以降の処理は意味が不明です。

python

1  ok = 0 # 素数の個数をカウント 2  ng = 0 # 非素数の個数をカウント 3  if numbers == prime(num): 4   ok += 1 5  else6    ng += 1 7  assert ok + ng == input_num # 素数と非素数の個数の総和

ok と ng に0を入れて、どちらかに1を足して、assertしているので、足してもかならず1ですし、また、判定の numbers == prime(num) も、リストとブール値を比較しているのでエラーになるし、この比較何がしたいのでしょう。

ここでは何かを数えたいのでしょうが、何を数えるのか再検討して作り直す必要がありますね。

投稿2021/05/13 04:44

TakaiY

総合スコア12801

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

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

874-3175-8...

2021/05/13 04:58

ありがとうございます。よく考えるとassertする必要ないと思ったのでやめようと思います。
guest

0

全角スペースが入っているためです。
具体的には以下の箇所に入っています。全角スペースを□として記載しています。

□□ok = 0 # 素数の個数をカウント □□ng = 0 # 非素数の個数をカウント □□if numbers == prime(num): □□ok += 1 □□else: □□□□ng += 1 □□assert ok + ng == input_num # 素数と非素数の個数の総和 print(showprime(1000))

投稿2021/05/13 02:17

yamap55

総合スコア1376

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

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

874-3175-8...

2021/05/13 02:44

ありがとうございます。エラー表示されなくなりました。これからは全角を使っていないか気を付けようと思います。 ただ、assert文が正確に機能していないようで、 ok = 0 と ng = 0 を ok = 100 と ng = 100 に変えてみました。 こうするとエラーになると思うのですが、何も問題なく表示されてしまいます。まだ何か問題点があるのでしょうか。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問