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

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

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

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

Q&A

解決済

2回答

944閲覧

classでプログラムを書く方法について

kaful

総合スコア2

Python

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

0グッド

1クリップ

投稿2021/08/17 14:48

編集2021/08/17 15:23

分からない事

pytonのプログラム勉強でANDの効果を持ったプログラムを作ったのですがそれをclassの書き方で作る方法が分かりません。

アルゴリズムとしてはx1、x2に0か1を代入して設定した重み(w1,2)をかけることで結果として0か1の値を返すというアルゴリズムです。

試したこと

クラスでの作成方法のサイトを読んだのですが、エラーが出てうまくいきませんでした。
また、プログラミング初心者なためクラスの書き方を理解しきれているのか不安なため質問いたしました。

まずclassを使わないでANDを作成したところ以下のようなプログラムになりました。

python

1 2def AND(x1,x2): 3 w1,w2,theta=0.5,0.5,1 4 tmp = x1 * w1 + x2 * w2 5 if tmp <= theta: 6 return 0 7 elif tmp > theta: 8 return 1 9 10

次にclassの形で作成し、結果を出力しようとして次のようなプログラムを作成しました。

python

1 2class Parse: 3 4 def __init__(self,x1,x2): 5 self.x1=x1 6 self.x2=x2 7 8 def AND(x1,x2): 9 w1,w2,theta=0.5,0.5,1 10 tmp = x1 * w1 + x2 * w2 11 if tmp <= theta: 12 return 0 13 elif tmp > theta: 14 return 1 15 16 17 18a=Parse(0,0) 19 20a.AND(0,0) 21 22

この時以下のエラーが出ていました。

Traceback (most recent call last): File "C:\Users\shunya\Documents\python練習\pa-seputoron.py", line 20, in <module> a.AND(0,0) TypeError: AND() takes 2 positional arguments but 3 were given

#疑問点
1.classの作成のページを見たが__init_で初期化を行うというところの理解があまりできなかった(初期化するのはw1なのかx1なのか)
2.classの場合このコードの書き方で会っているのか
3.このエラーの対処法と正しい書き方を教えて頂きたいです。

追記
pythonのバージョンは3.9.6でIDLEというツールを使っています。

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

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

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

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

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

mather

2021/08/17 15:08 編集

エラーメッセージは a.AND() と呼び出したことについて書かれています。その上のコードと食い違っていますが、どちらを解決したいのでしょうか? ところで、Pythonのバージョンはなんですか? 質問は編集できますので、更新・追記をお願いします。
kaful

2021/08/17 15:23

a.AND()でもa.AND(0,0)でも同じエラーが出てしまっていました。統一してa.AND(0,0)に直させていただきました。 Pythonのバージョンは3.9.6です。
mather

2021/08/17 15:25

いえ、どちらもエラーが出ますが、エラーの内容は違いますよ。 エラーメッセージはちゃんと読んでください。
kaful

2021/08/17 15:28

ご指摘ありがとうございます。以後気を付けます。
udon-ken

2021/08/17 15:28

メソッドAND()の定義の第一引数にselfが入っていないという問題に見えます(検証していません)。
退会済みユーザー

退会済みユーザー

2021/08/17 15:33

かなり初歩的な部分で躓いています。 一度pythonの文法(プログラミング)を体系的に学ぶことをお勧めします。
kaful

2021/08/17 15:40

>>yakitoriさん ご指摘ありがとうございます。どの部分で間違いを犯しているのか教えて頂けませんでしょうか…?
guest

回答2

0

ベストアンサー

初期化するのはw1なのかx1なのか

どちらが良いかは使用する方法によります。
もとのコードでは w1, w2, theta は定数なので、 __init__ の引数を使わず定数値の初期化に使っても良いと思います。

python

1class Parse: 2 3 def __init__(self): 4 self.w1 = 0.5 5 self.w2 = 0.5 6 self.theta = 1 7 8 def AND(self, x1, x2): # <- ここで self が必要 9 tmp = x1 * self.w1 + x2 * self.w2 10 if tmp <= self.theta: 11 return 0 12 else: # <- ifの条件以外すべて、という場合は else のみ 13 return 1 14 15a = Parse() 16 17print(a.AND(0,0))

classの場合このコードの書き方で会っているのか

すでに書いたとおり、間違っているかどうかは使い方次第です。
ただ今回の場合、初期化のタイミングと AND メソッドのタイミングで同じ引数を使う必要はないはずです。
初期化のタイミングで値を保存しておけるからです。

このエラーの対処法と正しい書き方を教えて頂きたいです。

上記に書きましたが、以下修正点です。

  • AND メソッドの定義に self が必要。 a.AND(0,0) と呼び出されるとき、 self は a となる。
  • elif ではなく else を使いましょう。
  • print() 関数で結果を出力するなどしないと、そもそも何も表示されません。

投稿2021/08/17 15:42

mather

総合スコア6759

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

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

kaful

2021/08/17 15:48

詳しく教えて頂きありがとうございます。問題なく実行することが出来ました。 pythonもといプログラム自体の知識が足りなく不明慮な質問をしてしまったかもしれません。 今後、勉強し、理解をより深めていこうと思います。 改めてありがとうございます。
guest

0

質問に書いてあるとおり、プログラミングについて、今回の場合はクラスについて勉強して理解してから取り組むのがおすすめですが、ちょっとアドバイスします。

クラスというのは、ある性質を持ったものを抽象化したもので、インスタンス化することで、実体を作って使うものです。
たとえば文字列はstrというクラスのインスタンスです。
クラスで定義するメソッドは、そのクラスのインスタンスを操作するためにあるというのが基本です。strクラスには、upperというメソッドがあって、その文字列をすべて大文字にして返します。

1.classの作成のページを見たが__init_で初期化を行うというところの理解があまりできなかった(初期化するのはw1なのかx1なのか)

str("abc") と書くと、"abc"という文字列が、strクラスのインスタンスとして生成されます。 このとき、__init__には、引数で与えた"abc"がわたされ、インスタンスの初期の値として使われます。
このように、生成するときの引数は、インスタンスごとに異なる情報を与えるのです。

あなたのクラスでインスタンスごとに異なる情報は何でしょうか?
それがinitの引数になります。

2.classの場合このコードの書き方で会っているのか

基本的には合っています。
が、このParseというクラスは、何を抽象化したものでしょうか?
ANDというメソッドは何をどうする機能を持っているのでしょうか?

今回のように関数で表わされているものを、単にクラスのメソッドにするというのは、クラスを勉強するという目的であれば、あまり適当ではないように思います。

3.このエラーの対処法と正しい書き方を教えて頂きたいです。

質問で言われているように、ADDはメソッドなので、第一引数に自動的にインスタンスが渡されます。呼び出し時に渡される引数はそれに続きます。
なので、

python

1 def AND(self, x1, x2):

とします。

ちなみに、pythonでは関数名/メソッド名は小文字とするのが推奨されていますので、andとするのがいいでしょう。
これについては、pep8 という文書に書いてあります。 「python pep8」で検索して内容を確認しておくといいでしょう。

投稿2021/08/17 15:58

TakaiY

総合スコア13790

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問