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

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

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

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

Q&A

解決済

1回答

777閲覧

__init__.pyでエラーとなり、お手上げ状態です。サポートをいただけますと助かります。

FM_TOWNS

総合スコア59

Python

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

0グッド

0クリップ

投稿2023/02/12 13:40

編集2023/02/14 15:30

実現したいこと

幾つか数字を入れ(入れるデータ数は固定しない)、その平均値、最大値、最小値を出すpythonプログラムを作りたいのですが、平均値、最大値、最小値を出すプログラムはパッケージにし、メインプログラムから呼び出す形としたいです。
パッゲージは、from パッケージ名 import * で呼び出し、パッケージ内には、init.pyを入れておきます。

ここに実現したいことを箇条書きで書いてください。

  • パッケージ機能を使えるようにしたい。

前提

anaconda内、pythonで作業しています。pythonは、3.10.8です。

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

該当のソースコードのプログラムを実行すると、以下のエラーが発生します。 name 'calc_all2' is not defined ## いくつか数字を入れてみたところ、この部分は問題なく作動していますが、パッケージ呼び出しで、前記の通り、未定義エラーとなります。 (返し部分) 23 -6 正の整数を入力して下さい。 100 200 600 ['23', '100', '200', '600'] 入力したデータ値は、4個です。

該当のソースコード

python

1from package import * 2##別行で、以下、入力 3num=[] 4while True: 5 i=input() 6 n2=len(num) 7 if len(i)==0: 8 print(num) 9 print("入力したデータ値は、{}個です。".format(n2)) 10 11 calc_all2.avg_nums(num) 12 calc_all2.max(num) 13 calc_all2.min(num) 14 break 15 16 elif not i.isdigit(): 17 print("正の整数を入力して下さい。") 18 continue 19 20 elif int(i)<0: 21 print("正の整数を入力して下さい。") 22 continue 23 24 else: 25 num.append(i) 26 continue 27 28**## package内 calc_all2.py** 29def avg_nums(num): 30 print(sum(num)/len(num)) 31 32def max(num): 33 print(max) 34 35def min(num): 36 print(min) 37 38 print() 39 40**## package内 __init__.py** 41from.import calc_all2 42 432023.2.15 修正後】 441行目 45from training6_2 import * 462行目 47num=[] 48while True: 49 i=input() 50 n2=len(num) 51 if len(i)==0: 52 print(num) 53 print("入力したデータ値は、{}個です。".format(n2)) 54 int_list = list(map(int, num)) 55 print(int_list) 56 57 calc_all3.avg_nums(int_list) 58 calc_all3.max_num(int_list) 59 calc_all3.min_num(int_list) 60 break 61 62 elif not i.isdigit(): 63 print("正の整数を入力して下さい。") 64 continue 65 66 elif int(i)<0: 67 print("正の整数を入力して下さい。") 68 continue 69 70 else: 71 num.append(i) 72 continue 73 74#フォルダーtraining6_2には、__int__.pyと、calc_all3.pyが入っています。 75#__int__.pyの構文 76from.import calc_all3 77#calc_all3.pyの構文 78def avg_nums(num): 79 print(sum(num)/len(num)) 80 81def max_num(num): 82 print(max(num)) 83 84def min_num(num): 85 print(min(num)) 86

試したこと

プログラム内のタイプミス等のチェックはしましたが、当方には、不具合は見つけられませんでした。

皆様のアドバイスをいただき、【2023.2.15 修正後】のプログラムで期待通りに走るようになりました。
迅速、正確なアドバイス、ありがとうございました。

補足情報

フォルダーの画像です。
training6_2内
イメージ説明
ここにより詳細な情報を記載してください。

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

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

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

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

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

melian

2023/02/12 14:31 編集

画像を見ますと __init__-.py となっています。"-" が付いていますが、問題ないでしょうか?
FM_TOWNS

2023/02/12 14:44

コメントありがとうございます。 フォルダーの画像ファイルをりました。 anacondaなので、exer6_2.jpynbがアップしたソースコード内容ですが、このファイルと同じフォルダー内に、packageファルダーを作り、calc_all2.pyと__init__.pyを収納しています。 1行目の、from package import *で、package 内にある全てのフォルダーを呼び出す、という作りとしました。 上手く行くのでは…と思っていたのですが、壁にぶち当たっている状況です。ご支援いただけますと、幸いです。
jbpb0

2023/02/13 02:25

> File "D:\anaconda_data\課題のタイトル名\パッケージ名\calc_all2.py", line 10 def max_num(max(num)): で、invalid syntaxでエラーとなってしまいました。 質問を編集して、最新のコードとエラーメッセージを追記した方がいいと思います
bsdfan

2023/02/14 04:41

> 1行目の、from package import *で、package 内にある全てのフォルダーを呼び出す、という作りとしました。 そもそもなんですが、from package import * では、サブモジュールまでは import されないので、明示的にモジュール名を指定して import する必要があります。 自動でやりたいなら、https://stackoverflow.com/questions/3365740 などが参考になると思います。
FM_TOWNS

2023/02/14 15:43

コメントありがとうございます。 英語で当方には…、正直、難解です。 時間のある時に、読み解きたく思います。
guest

回答1

0

ベストアンサー

package内 __init__-.py

とあるのですが、こちらは"__init__.py"の間違えでしょうか?

投稿2023/02/12 14:00

kirissaki

総合スコア41

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

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

FM_TOWNS

2023/02/12 14:10

はい、ご指摘の通りで、当HPへの当方のタイプミスです。 プログラムとしては、エラーのままです。
kirissaki

2023/02/12 14:34 編集

画像を見るとファイル名にハイフンが入っているように見えるのですが、、これは仕様でしょうか?
FM_TOWNS

2023/02/12 15:40 編集

すみません、直した積もりが直していませんでした。 修正後、re_runさせてみると、今まで1行目、from package import * はエラーが出なかったのですか、 File "D:\anaconda_data\teratail_python\package\__init__.py", line 1, in <module> from.import calc_all2 File "D:\anaconda_data\teratail_python\package\calc_all2.py", line 16 print() IndentationError: unindent does not match any outer indentation level となりました。 前者は、package内の、__init__.py 1行目、from.import calc_all2 で発生していると思いました。calc_all2を初期化している、という積もりですが、どこが間違いなのか、当方には見当がつきません。 後者は、ソースコード、38行のprint()を指していると思えましたので、削除しました。 修正後のプログラムをソースコード欄内、【修正後】以下にはりました。 この上で、re_runさせてみると、こんどは、 def avg_nums(num): ----> 8 print(sum(num)/len(num)) で、TypeError: unsupported operand type(s) for +: 'int' and 'str'  となり、文字列リストを整数で返すように修正しました。 すると、エラーはなくなり、以下の返しとなりましたが、平均値しか返さない状態です。 <function max at 0x000001FD97ABE9E0> <function min at 0x000001FD97ABE4D0> と出ますが、最大、最小は出ず、平均値のみ返します。 最大、最小の返しが出る方法が当方には思いつかず、ご教示いただけますと、まことに有り難い限りです。 【返し値】 200 -300 正の整数を入力して下さい。 600 -700 正の整数を入力して下さい。 1000 2000 [200, 600, 1000, 2000] 入力したデータ値は、4個です。 <function max at 0x000001FD97ABE9E0> <function min at 0x000001FD97ABE4D0> 950.0
melian

2023/02/12 15:49

max や min に引数を渡すのを忘れていますよ。正しくは以下の様になるはずです。 def max(num):  print(max(num)) def min(num):  print(min(num))
FM_TOWNS

2023/02/12 17:57 編集

ご教示ありがとうございます。 確かにそうですね。 対応してみました…が、何故か、The kernel appears to have died. It will restart automatically.と急に出るようになりました。 フォルダー名等変更してゼロから再作成してみましたが、The kernel appears to have died.~となります。 他のjupyter notebookのプログラムでは、こういう事象は発生していないので、何か、この方法だと無限ループのような状態になっているのでは……??とも想像してしまいました。 まことに恐れ入りますが、対処方法をご教示いただけますと助かります。
melian

2023/02/12 18:29 編集

> 何か、この方法だと無限ループのような状態になっているのでは……?? そうでした、関数名が同じ max と min なので自分自身を呼び出していますね。def max(num) と def min(num) で定義している関数名を変更して下さい。例えば max_num や min_num などです。
FM_TOWNS

2023/02/12 22:13

遅い時間のご回答、ありがとうございます。 関数群の入ったcalc_all2.pyを以下の通り、関数名を組み直しました。 def avg_nums(num): print(sum(num)/len(num)) def max_num(max(num)): print(max_num(num)) def min_num(min(num)): print(min_num(num)) 本体の方も、同様に変更しました。 calc_all2.avg_nums(int_list) calc_all2.max_num(int_list) calc_all2.min_num(int_list) すると、1行目、from package名 import * で、 File "D:\anaconda_data\課題のタイトル名\パッケージ名\calc_all2.py", line 10 def max_num(max(num)): で、invalid syntaxでエラーとなってしまいました。 invalid syntaxは、def max_num(max(num)):で左から2つ目の括弧の下にマークが出ています。 当方としては、半角括弧で括っているので、問題ないようと思ったのですが…、ご教示いただけますと幸いです。 お手数をお掛けし、恐縮です。
kirissaki

2023/02/13 02:27 編集

まず、P73行目の部分で、num.append(i)でstring型が入っているので、数値型のint型に変換しましょう。 また、関数の引数には"関数"は利用できません! あとは、print内で自身の関数を利用してしまうと、ずっと自身の関数が呼ばれ続けて、無限ループになってしまいます! リスト型の最大値などを確認したい場合は、pythonに標準にある関数を利用しましょう! def max_num(max(num)): print(max_num(num)) ↓ def max_num(num): print(max(num)) ⇒こうすると、max_num関数を実行した際、pythonの引数であるリスト型の最大値を求める関数maxを利用することができる
FM_TOWNS

2023/02/14 15:34

遅くなりました。 確かに、「関数の引数には"関数"は利用できません!」はその通りです。汗顔の至りです。 ご案内の通り修正したところ、期待通りに動くようになりました。 対応自体は他にもやり方はあると思いますが、__int__.pyを使ってみたく、いろいろとお手を煩わせてしまいましたが、首尾良く終わることができました。 厚く感謝上げます申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問