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

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

ただいまの
回答率

88.57%

pythonのよく分からない単語についてです。

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,011

Apex-Riflex

score 19

このレベルの高い掲示板でかなり初心者的な愚問で申し訳ありません。
自分はpythonの勉強をしているのですが、クラスの新作成やNumpy配列でよく分からない単語が平然と分かっている体で出てきて躓きかけてしまっています(;'∀')
まとめさせていただきますと、
・クラス作成において↓

・メソッドというのはいったい何ですか?関数とはなにが違うのでしょうか?
initというメソッド?が初期化を意味するそうですが、いったい何を初期化するのか分かりません。さらに

class man:
    def __init__(self,name)
        self.name=name
        print("Initialized!")

    続く・・・


というものなのですがこれより下のメソッド作成の意味は大体理解したのですが、
上記のソースコードがいったい何を意味しているのか正直さっぱりわからない状態です。
なぜ()の最初にselfという単語が来るのでしょうか?
もっと踏み込まさせて頂きますと、引数というものもイマイチ理解できていません。代入する数、という認識で宜しいのでしょうか?

次にNumPy(以降np)についてです。長くてすいません。
npのN次元配列についてなのですが、

A=np.array([[1,2],[3,4]])
print(A)
[[1 2
 ]3 4]]
A.shape
(2,2)
A.Dtype
stype('int32')


というソースコードが書かれていました。
単刀直入にいって.shapeと.dtypeの表す意味が分かりません。
前者は英語としての意味は分かるのですが・・・
後者はtype()とはどう違った意味を持つのでしょうか?
あと、.という記号の表す意味も不明瞭です。=と同じものという認識でよろしいでしょうか?
とても長い文章になってしまい申し訳ありません。何分質問できる知り合いが自分にはいないもので。
是非ご教授お願い致します。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • hayataka2049

    2018/10/21 22:23 編集

    3点だけコメント。 1.この量だと回答する人が辛いです。一つの質問ページで幾つものことを聞くのはやめてください。 2.プログラミングの基礎は適切な入門書、教材、オンライン講座や学校などで学んでください。初心者に必要なことは基礎知識から体系立てて学んでいくことで、teratailの質問はその代わりにはなりません。 3.「バカでもわかるように」は禁句。バカの自覚があるなら知的労働者たるエンジニアなど目指すべきではありません。

    キャンセル

  • Apex-Riflex

    2018/10/22 00:05

    指摘ありがとうございます。そうですね、わからないことが多すぎて一気に書いてしまいました。申し訳ありません。基礎知識を構築することがまず大事ですよね。teratailを頼り過ぎていたかもしれません。最後の「バカ」についてですが、禁句でしたか・・・エンジニアを目指すには知的労働者になるという自覚が必要なんですね。失礼いたしました。精進致します。

    キャンセル

  • hayataka2049

    2018/10/22 00:51

    わかれば良いです。まずは、プログラミング初心者向けで、易しそうで、できれば新しい(過去1年以内には出たもの)「python言語そのものの入門書」を一冊買って、ちゃんと読み込んでみてください。その上でわからないことがあれば、疑問点を絞り込んだ上で質問するのは悪いことではないと思います

    キャンセル

  • hayataka2049

    2018/10/22 00:51 編集

    逆に、今回の質問は「それ以前の問題」だと思ったので、ちょっと厳し目にコメントしました。前の質問で「ゼロから作る~」の本で勉強しているとも書いていますが、あの本は(pythonを知らない人も対象読者にしているとはいえ)まったくプログラミングの経験がない人が最初に取り組むにはハードです。こういう質問をしてしまうなら勉強の仕方を(あとQAサイトの使い方も)見直しましょう、というのが伝えたいことです

    キャンセル

回答 2

checkベストアンサー

+2

まず、メソッドというのは関数と同義語と思って良いでしょう。
少なくともpythonの文法上区別されることはありません。
関数といったときは最後に返す値が重要なのに対し、メソッドと言ったときはその中で行われる処理に重点がおかれているのかなと勝手に思っています。

次に、__init__ですが、これはオブジェクトが初期化されるときに実行される関数です。初期化というのは、要するに

m = man()

クラスにカッコをつけてmというオブジェクト(manクラスのインスタンス)を作るときに実行される関数です。selfは何かと言うと、そのときのインスタンスになります。確認してみましょう。

class A:
    def __init__(self, l):
        l[0] = self
        print(self)

l = [0]
a = A(l)    # => <__main__.A object at 0x....>
a is l[0]   # => True


selfが何か知りたいときは、例えばprintしてみたり、それを取り出してみたりすれば良いです。(initから値を返すことはできないみたいなので、外で宣言したリストに格納して調べています。)

numpyについてですが、
shapeは配列の形で、dtypeは配列の要素の型を表します。

a = np.array([[1,2],[3,4]])
a.dtype   # => dtype('int64')
(a*1.0).dtype   # => dtype('float64')

配列aの要素はint64(64ビット整数)という型らしいです。
一方で1.0かけたらfloatにキャストされたみたいです。

typeとの違いは、typeはそのオブジェクトのpythonとしての型であるのに対し、dtypeはnumpyとして計算する上でどういう数値として扱うか、ということですかね。すみません自分も実はよくわかってません。

a = np.array([[1,2],[3,4]])
type(a)   # => <class 'numpy.ndarray'>  <- pythonのオブジェクトとしての型(オブジェクトのクラス)
type(a[0])   # => <class 'numpy.int64'>
a[0].dtype   # => dtype('int64')
type(a[0].dtype)   # => <class 'numpy.dtype'>   <- numpy的な型

オブジェクトの後ろのドットは、そのオブジェクトの属性にアクセスすることを意味します。=と同じではありません。a.dtypeはa「の」dtypeみたいな感じです。「の」ですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/10/21 23:11

    そうかもしれません。すみません。あまり詳しくないです。
    単に自分が区別してこなかったという程度のことでした。

    キャンセル

  • 2018/10/21 23:50 編集

    言語仕様にまで踏み込むと大変なので言葉の使い方についてだけですが、
    https://docs.python.jp/3/glossary.html#term-function
    https://docs.python.jp/3/glossary.html#term-method
    によればメソッドは「クラス本体の中で定義された関数」という説明になっています。
    メソッドは(pythonにおいては)関数の一種であり、ただし「クラス本体の中で定義されている」という一点において他の関数とは厳然たる区別が存在する……ということで良いかと思います。

    キャンセル

  • 2018/10/22 01:03

    考えてみると、クラスのインスタンスメソッドとして定義されていたら、第一引数にそのインスタンス自身が勝手に入るという点で、普通の関数とは挙動が違いますね。

    キャンセル

+1

既に解決済みですが、私もクラスについて同じような悩みに直面した事があるので、サンプルコードを置いておきます。
とりあえずは、何の為にこういう事をするのか?については考えないでください。どのような動作をするかだけ

name = "tom"
age = 18

print(name)
print(age)

class Human:
    def __init__(self):
        """
        上のコードの name = "tom"
                    age = 18
        と同じようなもの
        ざっくり言うと変数の置き場所と思えばok

        """
        self.name = "tom"
        self.age = 18

    def print_name(self):
        """上のコードのprint(name)と同じようなもの"""
        print(self.name)

    def print_age(self):
        """上のコードのprint(age)と同じような物"""
        print(self.age)

human = Human()
human.print_name()
human.print_age()

#メソッドを用意しなくてもselfと書かれてある変数はprint可能
print(human.name)
print(human.age)
name1 = "tom"
age1 = 18

name2 = "mike"
age2 = 20

print(name1)
print(age1)

print(name2)
print(age2)

age2 = 25
print(age2)

class Human:
    def __init__(self, name, age):
        self.name = name
        self.age = age

    def change_age(self):
        self.age = 25

"""
クラスの特徴として変数の複製が可能
この複製した一つ一つをインスタンスと言ったりする。
(この場合はhuman1 human2)
やっている事は自体は上のコードと同じようなもの

"""

human1 = Human("tom", 18)
print(human1.name)
print(human1.age)

human2 = Human("mike", 20)
print(human2.name)
print(human2.age)
human2.change_age()
print(human2.age)
class Human:
    def __init__(self):
        """
        selfは目印のようなもの 他の言語では書かなくてもよかったりするが
        pythonではそういう仕様になっている。

        """
        name = "tom"
        self.age = 18

    def print_age(self):
        """self.の目印が付いているのでメソッドからアクセス可能"""
        print(self.age)

    def print_name(self):
        """self.の目印が付いていないのでメソッドからアクセスできない"""
        print(name)

human = Human()
human.print_age()
print(human.age)

"""ここからエラー selfが付いていないと外からもアクセス不可"""
human.print_name()
print(human.name)
class Human:
    def test(self):
        """ __init__がなくても初期化は可能"""
        self.name = "tom"
        self.age = 18

human = Human()
#human.test()を呼び出す事でself.name = tomを宣言する
human.test()
"""
self.nameをprintする。 human.test()を呼び出す前にprintしようとするとエラー
__init__を使えばインスタンスを生成した時に自動で呼び出してくれるのでそのようなエラーは起こらない

"""
print(human.name)
class Human:
    def __init__(self):
        self.name = "tom"

human = Human
"""
呼び出す時にカッコを付けないと、インスタンスとして
扱えないのでself.を使ったやりとりは出来ない
大雑把に言うとこのselfを使ったやり取りが可能であるものがメソッド

"""
print(human.name)

入門書やオンライン講座を読んだだけでは、その動作がわからない、理解できない事も多いです。 そんな時はそのサンプルコードを見ないで書けるように何度も消しては書いてを繰り返したり、色々試しに書いてみてください。そうすると気持ち悪い感覚がなくなったり、不意に理解出来るようになったりします。私の場合クラスについてもそれで理解する事が出来るようになりました。

aiエンジニアになる為に勉強を始めたようですが、2年ほど前は私も同じ状況でした。頑張ってくださいね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.57%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る