パイソンのエラーの原因と対処法を教えて下さい。

このQ&Aのポイント
  • パイソンのプログラムを組んだ際にエラーが発生しました。エラーの原因と修正法について教えてください。
  • プログラムの内容は、生成した乱数が素数か否か判定し、素数でなかった場合は0を、素数ならば1/(試行回数)を足し合わせる試行の中で、素数が出た回数を表示するものです。
  • プログラムが完成した場合、CPUを多くの回数試行させて、1から1000000000000000000までの数の中に含まれる素数の個数を推測することが目標ですが、エラーが発生しています。
回答を見る
  • ベストアンサー

パイソンのエラーの原因と対処法を教えて下さい。

写真のようなパイソンの プログラムを組んだのですが、 エラーが出てきてしまいます。 試行錯誤しましたが素人の 僕には原因が全く分かりません。 以下に、作ろうとしていた プログラムの内容を示します。 (num_num)は試行回数です。 生成した乱数が素数か否か判定し 素数でなかった場合は 0を、 素数ならば1/(num_num)を 足し合わせていく・・・ という試行の中で何回素数が 出たか表示するプログラムです。 これが完成した暁には、 C P Uに膨大な回数を試行させ、 1~1000000000000000000・・・ までの数の中に素数がいくつ 含まれているかを確率論的に 推測してみよう、という 魂胆だったのですが、無情にも エラーが出てきてしまいます。 という訳で、エラーの原因と 修正法を教えて下さい。

この投稿のマルチメディアは削除されているためご覧いただけません。
  • Python
  • 回答数3
  • ありがとう数6

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

グローバル変数のint_aを関数内で変更したい場合は、変更する箇所より前に global int_a とint_aがグローバル変数であることを宣言してください。そうしないと、新しくローカル変数として作成されてしまいます。(グローバル変数を参照するだけで変更しない場合は、宣言は必要ないため、ここで引っかかる人が多いです。)

hf-sbf5
質問者

お礼

お二方ともありがとうございました。 以下のようにしたらとりえずエラーが でなくなりました。 出てくる答えがなんかおかしい気がしますが、 そこら辺はまた自分で調べときます。 global num_num NUM=input("Enterキーを押せ!") num_num = int(NUM) global list_a list_a = [] for cnt in range(num_num): from random import randint a_num = randint(1,100) for num in range(2,a_num): if a_num % num == 0: list_a.append(0) break else: list_a.append(1/num_num) break sum(list_a)*100 Enterキーを押せ!1100 47.000000000000256

hf-sbf5
質問者

補足

回答ありがとうございます。 int_aがグローバル変数であることを宣言したら、 local variable ‘int_a‘ referenced before assignment というエラーメッセージは表示されなくなりましたが、 今度は 'int' object is not iterable というエラーメッセージが出てきてしまいました。 反復不可能なものを反復可能にするための方法が分かりません。 どうしたらいいですか。 以下のように変更しました。 global num_num NUM=input("Enterキーを押せ!") num_num = int(NUM) def sosuu_kuzi(): global int_a a="0" int_a=int(a) from random import randint a_num = randint(1,100) for num in range(2,a_num): if a_num % num == 0: int_a += 0 break else: int_a += 1 / num_num break for cnt in range(num_num): sosuu_kuzi() tanomu = 10*int_a sum_a = sum(tanomu) sum_int_a = int(sum_a) print(sum_int_a) Enterキーを押せ!10 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-4-91e5d3ec4c6d> in <module> 18 sosuu_kuzi() 19 tanomu = 10*int_a ---> 20 sum_a = sum(tanomu) 21 sum_int_a = int(sum_a) 22 print(sum_int_a) TypeError: 'int' object is not iterable

その他の回答 (2)

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.2

>UnboundLocalError: local variable ‘int_a‘ referenced before assignment >と出てきてしまいます。どうしたらいいですか。 「 local variable ‘int_a‘ referenced before assignment」を訳してみましたか?

hf-sbf5
質問者

お礼

お礼が遅れた申し訳ありません。 回答ありがとうございました。

hf-sbf5
質問者

補足

「ローカル変数の ‘int_a‘ が指定される前に言及された」と解釈し、 ローカル変数は関数ブロック内でしか使えないから、 def sosuu_kuzi():   a=‘‘0‘‘   int_a=int(a) という形に切り替え、最後の段落のint_aを取り除いたんですが、 今度はエラーメッセージすら表示されなくなってしまいました。

  • wormhole
  • ベストアンサー率28% (1621/5657)
回答No.1

>def sosuu_kuzi(): >for sosuu_kuzi in range(num_num): 関数sosuu_kuziの後で変数sosuu_kuziを定義しているので、変数sosuu_kuziが勝ってます。 関数名と変数名を同じでないようにしてください。

hf-sbf5
質問者

お礼

お礼が遅れた申し訳ありません。 回答ありがとうございました。

hf-sbf5
質問者

補足

回答ありがとうございます。 for sosuu_kuzi() in range(num_num)   sosuu_kuzi()         ↓ for cnt in range(num_num)   sosuu_kuzi() に変更してみたんですが、 UnboundLocalError Traceback (most recent call last) <ipython-input-2-e 267ac 80b 77f> in <module>  13. brake  14 for cnt in range (num_num): →15() sosuu_kuzi() <ipython-input-2-e 267ac 80b 77f> in sosuu_kuzi ()  10 break  11 else: →12 int_a += 1%num_num  13 break  14 for cnt in range (num_num): UnboundLocalError: local variable ‘int_a‘ referenced before assignment と出てきてしまいます。どうしたらいいですか。

関連するQ&A

  • パイソンのエラーの原因と対処法を教えてください。2

    以下のようなPythonのプログラムを組んだのですが、 エラーが出てきてしまいます。試行錯誤してみましたが、 素人の僕には原因が全く分かりません。 これが完成した暁には、発想力の補助をする システムとして利用可能なレベルにまで アップデートしていきたいと思っていたのですが、 無情にもエラーが出てきます。 どうしたらいいですか。 a = {"人工筋肉は圧力で作動する柔らかい動力だ", "ガウス加速器は磁力で加速する", "プロペラは風を生んだ反動で動力を生む", "磁力と静電気力はほぼ同じ数式で表せる", "飛行機の翼はベルヌーイの定理により圧力差を生む", "羽がない扇風機は風を生む"} s = input("Enterキーを押せ!") ss = set(s) while True: from random import randint num = randint(1,3) int_num = int(num) if ss<=a[int_num]: print(a[int_num]) break else: continue Enterキーを押せ!磁力 --------------------------------------------------------------------------- TypeError Traceback (most recent call last) <ipython-input-17-e0e40144b34d> in <module> 8 num = randint(1,3) 9 int_num = int(num) ---> 10 if ss<=a[int_num]: 11 print(a[int_num]) 12 break TypeError: 'set' object is not subscriptable

  • パイソンの参考書のプログラムを写したのにエラーが…

    初期化メソッドを持つクラスの定義について、 パイソンの参考書のプログラムを写しただけなのに 何度やっても、どこを探しても原因が分かりません。 プログラムの内容とは別の部分がおかしいんですかね? #以下、問題のプログラムの内容とエラーメッセージ class MyClass2: def _init_(self): self.value = 0 print("a") i3 = MyClass2() i3.value --------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-35-d4a47ea99c81> in <module> 5 6 i3 = MyClass2() ----> 7 i3.a AttributeError: 'MyClass2' object has no attribute 'a'

  • Pythonのプログラムが狙い通りに動きません

    学習目的で下記のようなプログラムを 組んだのですが、試行錯誤を繰り返しても 絶対ありえない結果ばかりが出力されたり、 謎のメモリーエラーが出たりします。(白目 実行すると画面に入力フォームが表示され、 例えば 80 と打ち込むと、1~80 までの 数の中にいくつ素数がいくつ含まれているかを 確率論的に予測するシステムプログラムです。 乱数 = (a_num) を出し、(1<a_num<serch_range) その整数を(num)で割って、(1<num<a_num) 割り切れたらリストに何もせず、 そうでなければ(1/1000 ) を加える という工程を 1000 回繰り返したのち、 リストの合計に 100 を掛けた数を 表示させるシステムを作ろうとしました。 str_serch_range = input("Enterキーを押せ!") serch_range = int(str_serch_range) list_num = [] def sosuu_kuzi(): while True: for cnt in range(1000): from random import randint a_num = randint(2,serch_range) for num in range(2,a_num): if a_num % num == 0: break else: list_num.append(1%1000) sosuu_kuzi() print(sum(list_num)*100) こんなコードでメモリ不足とか、 絶対おかしいと思うんですが…

  • 負荷の原因となっているプログラム箇所を特定する方法

    負荷の原因となっているプログラム箇所を特定する方法があれば教えて下さい。 例えば、PHPのプログラムで無限ループしてしまっている等で負荷がかかっている場合です。膨大なファイル数の中で、負荷の原因となっているファイルを探す方法ってあるのかなと思って質問しました。 地道に探すしかないのでしょうか。 何か良い方法を知っている方いましたら教えて下さい。 よろしくおねがいします。

  • 初期化しているつもりなのに、初期化されずにrand関数の結果を得る

    皆様。こんにちは。 C++で簡単なプログラムを書いていたつもりでしたが、 コンパイルが正常であった後に、 プログラムを動作させてみたら、 自分の意図とは少し異なる結果となり、 どこが違うのか?が どうも自分では分かりかねてしまい、 アドバイスをいただきたく 質問させていただきました。 以下の例にあるように、 「a」と「b」という2文字の間に ランダム関数で作成した「任意の数字」を挟む処理を行い その結果を画面に表示するつもりです。 また、この処理を「num」で指定した回数分だけ 実行させたいと思っていました。 ■表示させようとした結果:「a」+「生成した乱数」+「b」 ■担当プログラム ------------------------------------------------------ for (int i=0; i<num; i++) { std::stringstream keystream ; srand((unsigned)time(NULL)); // 乱数の初期化 int randomnum = rand()% 109999999; // 乱数の生成 keystream << "a" << randomnum << "b" ;    printf(keystream); } ------------------------------------------------------ しかし、実際には、 指定された回数分だけの、 表示結果は得られるものの、 a123456b a123456b a123456b a123456b a123456b 上記例(num=5)のように、 乱数の部分が、全部同じ乱数となっていました。 しかし、forの中で 新たに乱数を生成する際、 生成する前に、 乱数の初期化をしているつもりでいますので、 プログラムを実行させた場合に、 表示させれた結果が、 どうして全て同じ乱数を得ているのか?が分からないでいます。 何かアドバイスいただけるとありがたいです。 宜しくお願い致します。

  • エラーがどこかわからない

    #include<stdio.h> #include<math.h> #define NUM 100000 int main(void){ int prime[NUM+1],i,j,Limit; for(i=2;i<=NUM;i++){ prime[i]=1; } Limit=(int)sqrt(NUM); for(i=2;i<=Limit;i++){ if(prime[i]==1){ for(j=2*i;j<=NUM;j+=i){ prime[j]=0; } } } for ( i=2;i<=NUM;i++) {  if (prime[i]){    printf("%d\n",i); } } }  これは100000未満の素数の総数を求めるプログラムなんですが、実行したらエラーが出てくるんです。何度も確認しても正しいはずなんですがエラー出てきて困っています。どこが間違っているでしょうか?

  • HDDエラーチェック情報(CrystalDiskInfo)

    HDDエラーチェック情報(CrystalDiskInfo) CrystalDiskInfoでHDDの情報を確認しました。 画面では 正常になっていますが 数値の見方、項目の意味など、調べてみましたが いまいち分かりません。 どなたか 詳しい方 私のHDDに問題ないか見て頂けたらと思います。 宜しくお願い致します。 HDD:Maxtor 6B250R0 -- S.M.A.R.T. -------------------------------------------------------------- ID Cur Wor Thr RawValues(6) Attribute Name 03 176 175 _63 000000006F62 スピンアップ時間 04 253 253 __0 000000000154 スタート/ストップ回数 05 253 253 _63 000000000000 代替処理済のセクタ数 06 253 253 100 000000000000 リードチャネルマージン 07 253 252 __0 000000000000 シークエラーレート 08 252 249 187 000000009580 シークタイムパフォーマンス 09 252 252 __0 0000000085EE 使用時間 0A 253 252 157 000000000000 スピンアップ再試行回数 0B 253 252 223 000000000000 キャリブレーション再試行回数 0C 252 252 __0 000000000293 電源投入回数 C0 253 253 __0 000000000000 電源断による磁気ヘッド退避回数 C1 253 253 __0 000000000000 ロード/アンロードサイクル回数 C2 _41 253 __0 00000000002B 温度 C3 253 252 __0 000000000943 ハードウェア ECC 検知エラー回数 C4 253 253 __0 000000000000 セクタ代替処理発生回数 C5 253 253 __0 000000000000 代替処理保留中のセクタ数 C6 253 253 __0 000000000000 回復不可能セクタ数 C7 199 199 __0 000000000000 UltraDMA CRC エラー数 C8 253 252 __0 000000000000 ライトエラーレート C9 253 252 __0 000000000000 ソフトリードエラーレート CA 253 252 __0 000000000000 データアドレスマークエラー CB 253 252 180 000000000000 ECC エラーレート CC 253 252 __0 000000000000 ソフトウェア ECC 訂正エラー数 CD 253 252 __0 000000000000 サーマルアスペリティレート CF 253 252 __0 000000000000 スピン最大電流 D0 253 252 __0 000000000000 スピンバズ D1 240 240 __0 0000000000A4 オフラインシークパフォーマンス D2 253 252 __0 000000000000 不明 D3 253 252 __0 000000000000 書き込み中に加わった大きな振動 D4 253 253 __0 000000000000 書き込み中に加わった大きな衝撃 私が気になったのは キャリブレーション再試行回数、スピンアップ再試行回数 ECC エラーレート、ハードウェア ECC 検知エラー回数などです。 何か問題ある箇所はありますでしょうか? 後 この箇所がこうなると危険とか教えて頂けると嬉しいです。

  • 独習C 素数テスタ・・・分からない

    忙しい中失礼します。 ”素数”を確認するプログラムについて質問があります。 現在独習Cを用いて勉強中なのですが、下記のプログラム理解に苦しんでいます。 宜しければアドバイスを下さい。 下記のプログラム/*素数テスタ*/内から、 質問(1)部:for(; num <=1; )の意味は’1’よりも大きな数字を入れれば、for文のループを抜ける→この考えで合っている、と自分では思っていますが、間違っているのでしょうか? ご指摘願います。 質問(2)部: 1.num=5の場合、for ( i=2; i <= num / 2; i = i+1) → i <= num / 2はi <= 2となる。→i <= 2となり、for文のループを抜ける。→ if ((num % i) == 0) の条件は成り立たない。→ is_prime = 1のため、"素数です"と表示される。→納得! 2.num=9の場合、for ( i=2; i <= num / 2; i = i+1)→  i <= num / 2は i(=2) <= 4となり、 i = i+1の’i’部が’4’となった後for文のループを抜ける。→if ((num % i) == 0)はnum % iは 9%4で’1’余り、となり、if ((num % i) == 0) の条件は成り立たない。→is_prime == 1 の状態がキープされる。→"素数です"と表示される、と思いきや"素数ではありません"と表示される。 で、ここで何故"素数ではありません"と表示されるのかが分かりません。頭の中では’9’が素数ではないのは分かりますが、プログラムの中でどういう経路を辿り、"素数ではありません"と表示されるのでしょうか。その過程の説明を欲しています。 宜しければ、アドバイスを下さい。 /*素数テスタ*/ #include <stdio.h> int main(void) { int num = 0, i, is_prime; for(; num <=1; ){ //質問(1) printf("判定したい数を入力して下さい: "); scanf("%d", &num); } /*約数があるかどうかを調べる*/ is_prime = 1; for ( i=2; i <= num / 2; i = i+1) //質問(2) if ((num % i) == 0) //質問(2) is_prime = 0; //質問(2) if (is_prime == 1 ) printf("素数です"); else printf("素数ではありません"); return 0; }

  • Javaのプログラムで・・・

    Javaのプログラムで1~20までの整数乱数を実行後に指定回数だけ発生させ、そのうち何%が奇数であったかを表示するプログラムを作成中です。 乱数を発生させるところまでは行ったのですがここからどのように計算していくのかわかりません。 以下が作成したものですがアドバイスお願いします。 import java.io.*; public class Rand { public static void main(String args[]) throws IOException { System.out.print("発生させる乱数の回数は?"); BufferedReader br= new BufferedReader(new InputStreamReader(System.in)); String str = br.readLine(); int num= Integer.parseInt(str); for(int i=1;i<=num;i++){ int a=(int)(20*Math.random()+1); System.out.println(a); } for(int a=1; a<=;a++){ if(a%2==1); System.out.println("発生した乱数の"++"%が奇数です。"); } } }

  • 起動時の重なるエラーSdkmv32が原因でCRWO32.DLLにエラーが発生(´Д`)

    Windows Meを使っている者です。ウィルスブロック、スパイウェアソフトをしようしています。毎回起動時に下記のようなエラーが出てきます。もしかしたら、ウィルスソフトかスパイウエアソフトでシステムに関するプログラムも隔離又は削除してしまった為かとも思うのですが、とても困っています。ご助言をお願い致します。特に、ネットに繋がらないとかメールが送受信できないとかの不具合はありませんがフリーズの回数が多くなってきました。 -------------------------------------------------- ・Sdkmv32が原因でCRWO32.DLLにエラーが発生。 ・Sysjgが原因でCRWO32.DLLにエラーが発生。 ・Mfcns32が原因でCRWO32.DLLにエラーが発生。 ・Sdkmv32が原因でKERNEL32.DLLにエラーが発生。 ・Sysjgが原因でKERNEL32.DLLにエラーが発生。 ・Mfcns32が原因でKERNEL32.DLLにエラーが発生。 --------------------------------------------------

専門家に質問してみよう