🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

PyCharm

エディター・開発ツール

Q&A

解決済

1回答

1318閲覧

def文で機能定義しながらプログラムを書く時のデバッグ法

MagMag

総合スコア80

デバッグ

デバッグはプログラムのバグや欠陥を検知し、開発中のバグを取り除く為のプロセスを指します。

関数

関数(ファンクション・メソッド・サブルーチンとも呼ばれる)は、はプログラムのコードの一部であり、ある特定のタスクを処理するように設計されたものです。

Python

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

PyCharm

エディター・開発ツール

0グッド

0クリップ

投稿2019/11/19 02:40

編集2019/11/20 05:18

プログラムの構造として、以下の例のように、def文で機能を定義し、メイン実行部でどの機能を使うかを指定する記載方法をよく見かけます。この方法だと各機能が明確になるし、変数が混乱しないのでわかりやすいのですが、いざ採用してみると、各関数のデバッグが面倒という問題にぶつかっています。

例えば関数Aをデバッグする時には、x=30とかx=10など、値をいろいろと代入した方がわかりやすいのですが、変数の数が多くなると、いちいち手で値を代入するのが面倒です。そこで、この構造を使いつつ、デバッグしやすい方法を教えていただけないでしょうか?

ちなみに、PyCharmを使っているので、使いこなしてはいないものの、デバッガはあります。

def A(x): return x**2 def B(x): return x+300 def C(x): return 2*x # メイン実行部 print(C(B(A(100)))) # 20600

##以下追記
質問が曖昧との指摘をいただいたので、もう少し具体的に例を挙げてみました。

前者はdefを使わない例です。

この場合、各処理(3倍したり2乗したり正規化したりするなど)の機能修正は上から順にスクリプトを処理していけば実施できる一方、プログラムが長くなってくると、各機能がわかりにくくなってくるデメリットがあります。

一方、後者のdefを使った場合、各関数で何をやっているのかがわかりやすくなり(この例だと短いのであまり意味がないですが)、各機能で機能修正もしやすいなどのメリットがあります。

ただ、**後者で機能修正/追加する場合、以下の操作をしないといけないため、面倒と感じてしまいます。そこで、もっとよりやり方はないでしょうか?というのが質問の意図です。**その対応の1つとして、test機能を使ったら?という回答をいただきました。

  1. def文を使わない形に直す
  2. xを100とか10など入力して機能修正/追加(変数の数が多いと特に面倒)
  3. またdef文にしてreturnを定義する

defを使わない場合

import pandas as pd df = pd.DataFrame([[1,50,100],[5,12,200],[6,23,335]],columns=['A','B','C']) df['A'] = df['A'] * 3 # 3倍する df['B'] = df['B'] **2 # 2乗する autoscale_df = (df-df.mean())/df.std() # 正規化する

defを使う場合

# 機能定義部 def multiply_3(x): return x * 3 def square(x): return x**2 def autoscale(df): return (df-df.mean())/df.std() # メイン関数 df = pd.DataFrame([[1,50,100],[5,12,200],[6,23,335]],columns=['A','B','C']) df['A'] = multiply_3(df['A']) df['B'] = square(df['B']) autoscale_df = autoscale(df)

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2019/11/19 03:52

PyCharmは使っていないので、よく分かりません。 デバッグというのは通常プログラムを手で逐次的に実行(ステップ実行)することを指し、その名のとおりバグ取りを目的とした作業です。 それに対して、関数などを対象として、入力などの異なるテストケースを作り、想定通りに出力されるかどうかを確認する、テストという作業もあります。 質問者さんは恐らくこのテストを想定しているのかと思います。テストは通常、対象となる関数などを個別にテストする小さい別のプログラムになります。PyCharmにもそういうテストコードを効率的に書く機能があるようなので、詳しくはそちらを御覧ください。どんなものか分かると思います。 なお、恐らく楽にはなりません。
MagMag

2019/11/19 04:18 編集

dameo様。ありがとうございます。おっしゃるとおり、テストという意味の方が正しいと思います。いずれにしろ、テストするに当たって、変数をいちいち入力する手間を減らしたいというのが趣旨です。 def文を使わずに、データ読み込み→データ処理という流れでプログラムを書くと、読み込んだ変数を使ってデータ処理のテストできるので、テストにあたって、変数を再入力しなくていい、という意味です。
退会済みユーザー

退会済みユーザー

2019/11/19 04:28

えーっと…とりあえずPyCharmのマニュアルのテストのページが↓です。 https://pleiades.io/help/pycharm/testing-your-first-python-application.html 書いたとおり読めば分かると思いますが、これは入力変数をいちいちコーディングするということです。 そして、その変数を入力とした結果のassertionを行い、テスト結果としています。 最近の(ユニット)テストはこのようなコーディングと、その実行をもって行うことが一般的だと思います。
quickquip

2019/11/19 22:29

> 変数の数が多くなると、いちいち手で値を代入するのが面倒です ここが具体的でなく、いま、「どこに」「どうやって」入力していると言ってるのか、「なにが」面倒だと思っているかが伝わっていません。 こうやってるんだろうなあ、というのを勝手な想像するのも時間の無駄です。回答者は他の読んで分かる質問に移った方がいいと判断してしまいます。 特に、勝手な想像を元にこうやったらどうです? みたいな回答をして、それがあなたがすでにやっていることだったら本当に完全な無駄な時間になってしまいますから。
退会済みユーザー

退会済みユーザー

2019/11/20 05:55

ちょっとややこしくなりそうなので、私のコメントの趣旨をハッキリ言ってしまいますね。 質問者さんが「手間」と言っていることは普通の人は何とも思ってない程度の作業量で、一般にテストというのは市販ツールですら、ここまでのことをする前提の作業なのですよ、ということです。 では私はこの辺で失礼します。
MagMag

2019/11/20 06:24

ありがとうございます。テスト機能を使っていなかったので、それを使うことを考えます。
guest

回答1

0

ベストアンサー

デバッグではなく、テストを書くのはいかがでしょう?
ソースコードに使い方をdoctest形式で書いておいてテストするのが便利です。

python

1""" 2>>> print(C(B(A(100)))) 320600 4""" 5 6def A(x): 7 """ 8 >>> A(-3) 9 9 10 >>> A(100) 11 10000 12 """ 13 return x**2 14 15def B(x): 16 """ 17 >>> B(-400) 18 -100 19 >>> B(100) 20 400 21 """ 22 return x+300 23 24def C(x): 25 """ 26 >>> C(-3) 27 -6 28 >>> C(100) 29 200 30 """ 31 return 2*x 32 33# メイン実行部 34if __name__ == '__main__': 35 print(C(B(A(100)))) # 20600

テスト実施

$ python3 -m doctest -v example.py Trying: print(C(B(A(100)))) Expecting: 20600 ok Trying: A(-3) Expecting: 9 ok Trying: A(100) Expecting: 10000 ok Trying: B(-400) Expecting: -100 ok Trying: B(100) Expecting: 400 ok Trying: C(-3) Expecting: -6 ok Trying: C(100) Expecting: 200 ok 4 items passed all tests: 1 tests in example 2 tests in example.A 2 tests in example.B 2 tests in example.C 7 tests in 4 items. 7 passed and 0 failed. Test passed.

投稿2019/11/26 03:02

shiracamus

総合スコア5406

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問