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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

Q&A

解決済

2回答

1923閲覧

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

Apex-Riflex

総合スコア19

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

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

0グッド

0クリップ

投稿2018/10/21 12:40

編集2018/10/21 15:06

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

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

python

1class man: 2 def __init__(self,name) 3 self.name=name 4 print("Initialized!") 5 6 続く・・・ 7

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

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

python

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

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

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

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

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

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

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

hayataka2049

2018/10/21 15:52 編集

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

2018/10/21 15:05

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

2018/10/21 15:51

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

2018/10/21 15:54 編集

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

回答2

0

ベストアンサー

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

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

python

1m = man()

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

python

1class A: 2 def __init__(self, l): 3 l[0] = self 4 print(self) 5 6l = [0] 7a = A(l) # => <__main__.A object at 0x....> 8a is l[0] # => True

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

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

python

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

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

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

python

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

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

投稿2018/10/21 13:24

編集2018/10/21 13:26
moch

総合スコア122

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

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

hayataka2049

2018/10/21 13:28

>まず、メソッドというのは関数と同義語と思って良いでしょう。 >少なくともpythonの文法上区別されることはありません。 これは間違い。区別されます。 >>> def f(): ... pass ... >>> type(f) <class 'function'> >>> class Hoge: ... def f(self): ... pass ... >>> h = Hoge() >>> type(h.f) <class 'method'>
moch

2018/10/21 13:42

ありがとうございます。 そうなんですね。 ただ、日本語でメソッドとか関数とか言ったときはあまり区別しないんじゃないかなというつもりでした。functionとmethodでクラスは違うけど、両方とも括弧をつけて呼び出せるし、構文も同じなので。
Zuishin

2018/10/21 14:07

メソッドも関数も言語によって定義は違うと思いますが、たいていの言語で区別するんじゃないですか?
moch

2018/10/21 14:11

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

2018/10/21 14:50 編集

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

2018/10/21 16:03

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

0

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

python

1name = "tom" 2age = 18 3 4print(name) 5print(age) 6 7class Human: 8 def __init__(self): 9 """ 10 上のコードの name = "tom" 11 age = 18 12 と同じようなもの 13 ざっくり言うと変数の置き場所と思えばok 14 15 """ 16 self.name = "tom" 17 self.age = 18 18 19 def print_name(self): 20 """上のコードのprint(name)と同じようなもの""" 21 print(self.name) 22 23 def print_age(self): 24 """上のコードのprint(age)と同じような物""" 25 print(self.age) 26 27human = Human() 28human.print_name() 29human.print_age() 30 31#メソッドを用意しなくてもselfと書かれてある変数はprint可能 32print(human.name) 33print(human.age)

python

1name1 = "tom" 2age1 = 18 3 4name2 = "mike" 5age2 = 20 6 7print(name1) 8print(age1) 9 10print(name2) 11print(age2) 12 13age2 = 25 14print(age2) 15 16class Human: 17 def __init__(self, name, age): 18 self.name = name 19 self.age = age 20 21 def change_age(self): 22 self.age = 25 23 24""" 25クラスの特徴として変数の複製が可能 26この複製した一つ一つをインスタンスと言ったりする。 27(この場合はhuman1 human2) 28やっている事は自体は上のコードと同じようなもの 29 30""" 31 32human1 = Human("tom", 18) 33print(human1.name) 34print(human1.age) 35 36human2 = Human("mike", 20) 37print(human2.name) 38print(human2.age) 39human2.change_age() 40print(human2.age)

python

1class Human: 2 def __init__(self): 3 """ 4 selfは目印のようなもの 他の言語では書かなくてもよかったりするが 5 pythonではそういう仕様になっている。 6 7 """ 8 name = "tom" 9 self.age = 18 10 11 def print_age(self): 12 """self.の目印が付いているのでメソッドからアクセス可能""" 13 print(self.age) 14 15 def print_name(self): 16 """self.の目印が付いていないのでメソッドからアクセスできない""" 17 print(name) 18 19human = Human() 20human.print_age() 21print(human.age) 22 23"""ここからエラー selfが付いていないと外からもアクセス不可""" 24human.print_name() 25print(human.name)

python

1class Human: 2 def test(self): 3 """ __init__がなくても初期化は可能""" 4 self.name = "tom" 5 self.age = 18 6 7human = Human() 8#human.test()を呼び出す事でself.name = tomを宣言する 9human.test() 10""" 11self.nameをprintする。 human.test()を呼び出す前にprintしようとするとエラー 12__init__を使えばインスタンスを生成した時に自動で呼び出してくれるのでそのようなエラーは起こらない 13 14""" 15print(human.name)

python

1class Human: 2 def __init__(self): 3 self.name = "tom" 4 5human = Human 6""" 7呼び出す時にカッコを付けないと、インスタンスとして 8扱えないのでself.を使ったやりとりは出来ない 9大雑把に言うとこのselfを使ったやり取りが可能であるものがメソッド 10 11""" 12print(human.name)

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

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

投稿2018/10/21 20:11

編集2018/10/21 20:28
puroko3

総合スコア185

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問