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

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

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

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

Q&A

解決済

4回答

7891閲覧

pythonの関数の見やすい並べ方

minato_hy

総合スコア68

Python

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

1グッド

1クリップ

投稿2015/06/30 05:21

pythonのファイル内にいくつか関数を作っているのですが,その並び方が見にくいというか汚いような気がしています.
例えば以下のように,最初にメインの関数calc_all()があり,それ以降には関数calc_all()内で使われる関数を列挙する,というような感じになっています.
ここにcalc()内で使われる関数やらcalc()とview()を使う別の関数やらが追加されると,後から見直したときに,見にくかったり目的の関数を探しにくかったりすると思うのですが,何か見やすい構成などのアイデアはありますでしょうか?
関数を切り分けすぎなのか,別々のファイルに機能ごとにまとめたりした方がいいのか,常套手段的なものがあれば助言をいただけますとありがたいです.

lang

1def calc_all(): 2 calc()を何度も実行 3 view()を実行 4 write_result() 5 6def calc(): 7 ある計算をする 8 9def view(): 10 計算結果を表示 11 12def write_result() 13 結果をファイルに書き出す 14 15if __name__ == '__main__': 16 calc_all()
manabufukai👍を押しています

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

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

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

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

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

guest

回答4

0

ベストアンサー

関数は適切な名前がつけられていれば適度に分割されていたほうが読んだときに理解しやすく、また修正や確認、テストもしやすくなります。
例の場合ですと、計算(calc)と表示(view)とファイルへの書き出し(write_result)と機能別に分かれているので、細かく分け過ぎということはないと思います。

個人的には、例のようなコードですとクラスを使ってまとめるのがいいと思います。

例えば以下のようにできるかと思います。

py

1class Calc(object): 2 def __init__(self, filename=None): 3 # 例えば、結果を書き出すファイルを最初に指定する 4 self.filename = filename 5 # 結果を保存しておくリストを持たせるとか 6 self.results = [] 7 8 def run(self): 9 self.calc() 10 self.view() 11 self.write_result() 12 13 def calc(self): 14 # ある計算をする 15 ... 16 # 結果をリストに追加しておくとか 17 self.results.append(result) 18 19 def view(self): 20 # 計算結果を表示 21 print(self.results) 22 23 def write_result(self) 24 # 結果をファイルに書き出す 25 if self.filename is not None: 26 with open(self.filename, 'w') as f: 27 f.write(self.results) 28 29 30if __name__ == '__main__': 31 calc = Calc('a.log') 32 calc.run()

投稿2016/04/03 08:40

Miyako

総合スコア142

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

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

0

プログラムを学び始めだと、なかなかオブジェクト指向の実践も大変だと思います。

まずは構造化の意味で関数の汎用化を行い、定数定義はいちばん上に、メインルーチンをいちばん下に書き、順次呼び出される関数をメインルーチンの上に上に書いていき、一連の処理にまつわる関数はなるべく近くにまとめておくなど、自分なりにルールを作った方が良いかと思います。

まとめ方が分かってきたら、なるべく早いうちに部品化をしきちんとオブジェクト指向を実践するのが幸せかと思います。

投稿2015/07/13 01:54

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

minato_hy

2015/07/13 06:18

なるほど…… やはり何度もプログラムを書いて自分の解りやすい整理の仕方を見つけるしかないのですね
guest

0

個人的主観なのですが,「calc_all」という関数名が違和感があります.

関数名自体は利用されうるものだとは思うのですが,内部処理で「計算」,「表示」,「出力」を全てしており,関数名からプログラムの内容を推測できません.個人的にはcalc_all関数をは"calc()を何度も実行"部分だけにして,main関数にてcalc_all,view,write_resultを呼び出したほうが見やすいと思います.

lang

1def calc_all(): 2 calc()を何度も実行 3 4def calc(): 5 ある計算をする 6 7def view(): 8 計算結果を表示 9 10def write_result() 11 結果をファイルに書き出す 12 13if __name__ == '__main__': 14 calc_all() 15 view() 16 write_result()

もう一つ言うのであれば,calcだけでは何の計算をしているのかわからないので,もう少し明確な命名をすると良いのかもしれませんね.

個人的に,命名を良くすることはプログラムの構成につながります.それに適した名前を付けることで処理内容を明確にし,関数内では複数の処理を実行しようとせず単体の処理を記述すると,見やすいコードになると思います.プログラムにもよるのでしょうが,オブジェクト指向を意識すれば構造も綺麗になっていくと思いますよ.極端な例ですが,参考スライドを貼っておきます.なかなか面白いので軽く参考にしてみてください.
オブジェクト指向できていますか?

投稿2015/07/01 00:40

Neight

総合スコア127

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

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

Neight

2015/07/01 00:42

書き忘れましたが,何処にどのような関数があるか負えなくなってしまう場合は,統合開発環境等の関数定義位置に飛んでくれるエディタを利用することを推奨します.
minato_hy

2015/07/13 06:23

上記の関数は例示のために適当に作ったものです、解りにくくて申し訳ないです 「オブジェクト指向できていますか?」やリーダブルコードなど以前に読んで実践したいと考えているところですが、とても面白いですよね ご紹介ありがとうございます
guest

0

別々のファイルに機能ごとにまとめたりした方がいいのか

関係無いものを1ファイルに置けばそりゃ整理されていないように感じるでしょう。
ただ、規模によりけりです。

見づらいなと感じたら分割しましょう。
読むときにも脳内メモリが圧迫されずに済みます

投稿2015/07/13 13:42

ozwk

総合スコア13512

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問