python3の日記

Python3を図書とともに勉強していくブログ

Pythonにおける、dir関数、help関数、type関数

Pythonの学習時に役に立つ学習用関数3

dir関数

ビルトイン関数のdirではその名前空間で定義されている

もの一覧をリストで返す。

 

【モジュール名】を引数に渡すと

そのモジュールで定義されている関数一覧を返す。

import sys
dir(sys) #sysモジュールで定義されている関数の一覧
>>>['__displayhook__', '__doc__', '__excepthook__',
'__name__', '__stderr__',

'__stdin__', '__stdout__', '_current_frames', '_getframe',
'api_version',

'argv', 'builtin_module_names', 'byteorder', 'call_tracing', 'callstats',
'copyright', 'displayhook', 'dllhandle', 'exc_clear',
'exc_info',

'exc_traceback', 'exc_type', 'exc_value', 'excepthook',
'exec_prefix',

'executable', 'exit', 'getcheckinterval',
'getdefaultencoding',

'getfilesystemencoding', 'getrecursionlimit', 'getrefcount',
'getwindowsversion', 'hexversion', 'maxint', 'maxunicode',
'meta_path',

'modules', 'path', 'path_hooks', 'path_importer_cache',
'platform',

'prefix', 'setcheckinterval', 'setprofile',
'setrecursionlimit',

'settrace', 'stderr', 'stdin', 'stdout', 'subversion',
'version',

'version_info', 'warnoptions', 'winver']

【引数に何も渡さない】

呼び出されたスコープ上で定義されている名前の一覧を返す。

a = [1, 2, 3, 4, 5]
import fibo
fib = fibo.fib
dir()
>>>['__builtins__', '__doc__', '__name__', 'a', 'fib', 'fibo', 'sys']

【オブジェクト】を引数に渡さすと

そのオブジェクト上の属性一覧を得ることができる。

dir(str)
>>>['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__', '__ge__', '__getattribute__', '__getitem__', '__getnewargs__', '__gt__', '__hash__', '__init__', '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__', '__mod__', '__mul__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__rmod__', '__rmul__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', 'capitalize', 'casefold', 'center', 'count', 'encode', 'endswith', 'expandtabs', 'find', 'format', 'format_map', 'index', 'isalnum', 'isalpha', 'isdecimal', 'isdigit', 'isidentifier', 'islower', 'isnumeric', 'isprintable', 'isspace', 'istitle', 'isupper', 'join', 'ljust', 'lower', 'lstrip', 'maketrans', 'partition', 'replace', 'rfind', 'rindex', 'rjust', 'rpartition', 'rsplit', 'rstrip', 'split', 'splitlines', 'startswith', 'strip', 'swapcase', 'title', 'translate', 'upper', 'zfill']

help関数

インタープリターに組み込まれている

ビルトインオブジェクトやビルトイン関数のヘルプを返します。

 

【関数】を引数に渡すとその関数の定義が見れる

help(len)
>>>Help on built-in function len in module builtins:
len(obj, /)
Return the number of items in a container.

【type】を引数に渡すとそのオブジェクトクラスが見れる。

help(str)
>>>
Help on class str in module builtins:

class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object. If encoding or
| errors is specified, then the object must expose a data buffer
| that will be decoded using the given encoding and error handler.
| Otherwise, returns the result of object.__str__() (if defined)
| or repr(object).
| encoding defaults to sys.getdefaultencoding().
| errors defaults to 'strict'.
|
| Methods defined here:
|
| __add__(self, value, /)
| Return self+value.
|
| __contains__(self, key, /)
| Return key in self.
|
| __eq__(self, value, /)
| Return self==value.
|
| __format__(...)
| S.__format__(format_spec) -> str
|
| Return a formatted version of S as described by format_spec.
|
| __ge__(self, value, /)
| Return self>=value.
|
| __getattribute__(self, name, /)
| Return getattr(self, name).
|
| __getitem__(self, key, /)
| Return self[key].
|
| __getnewargs__(...)
|
| __gt__(self, value, /)
| Return self>value.
|
| __hash__(self, /)
| Return hash(self).
|
| __iter__(self, /)
| Implement iter(self).
|
#################省略####################

クソ長い……。これを行うことで、dir関数では不十分だった、

メソッドの定義も分かるので便利。

 

【メソッド】の定義を見たいときは、引数にtype.methodを渡す。help(method)だけでは呼び出せない。

だって、methodはオブジェクトにぶら下がって初めて存在するから。

help(list.append)
>>>Help on method_descriptor:

append(...)
L.append(object) -> None -- append object to end

ちなみに、help(help)でhelp関数の定義を見てみると

help(help)
>>>
Help on _Helper in module _sitebuiltins object:

class _Helper(builtins.object)
| Define the builtin 'help'.
|
| This is a wrapper around pydoc.help that provides a helpful message
| when 'help' is typed at the Python interactive prompt.
|
| Calling help() at the Python prompt starts an interactive help session.
| Calling help(thing) prints help for the python object 'thing'.
|
| Methods defined here:
|
| __call__(self, *args, **kwds)
| Call self as a function.
|
| __repr__(self)
| Return repr(self).
|
| ----------------------------------------------------------------------
| Data descriptors defined here:
|
| __dict__
| dictionary for instance variables (if defined)
|
| __weakref__
| list of weak references to the object (if defined)

という感じで

なぜか『 Help on built-in function len in module builtins』ではなく

『Help on _Helper in module _sitebuiltins object』が始まってしまう。

Pythonの技術者による海外サイトにおいても

I agree. It should explain the three options:
help(object): help on object or class of object, except
help('name'): help on object/module named 'name'
help(): run utility, which starts with utility help

help(help) prints unhelpful

 と言われてます。

プロのPythonプログラマーが「ここおかしい」と言っている

ところの理由なんてぼくら素人が考えてもしょうがないので

help(help)問題は無視する方が無難そう。

type関数

 type関数は引数に渡したもののtypeオブジェクトを戻す。

a = "spam"
print(type(a))
>>> <class "str">
b = []
print(type(b))
>>> <class "list">
class A:
pass

a = A()
print(type(a))
>>> <class "__main__.A">

変数の型を確認する際に便利。

今回はここまで。

Pythonにおけるオブジェクト指向【基礎編】

f:id:pokita:20180421094155p:plain

 

オブジェクト指向、なんとなく聞いたことあるかも知れない。

しかし、ちょっと読んでも何言っているかわからず

敬遠しがちな言葉。

「はじめてのPythonでも22章から入る概念だし

いまは知らなくてもいっか」

で教科書に出てきても無視して読み進めてきたけど

それを学び始めた今になって気づく。

「これこそPythonの柱じゃん」って。

 

そういわけで、今回はPythonをこれか学ぶに当たって

まず抑えておきたい基礎の基礎、オブジェクト指向について。

これを知ってると、まったく教科書の吸収スピードが異なるので

先に基礎だけ抑えておこう。

 

オブジェクトとは?

プログラムを作る場合、全体を小さな処理に分割して

ひとつひとつの処理を作成し、それらを組み合わせて

全体のプログラムを完成させます。

このとき、基本的な部品となるのが関数データです。

 

【関数】

入力したデータ(引数)を処理して

その結果(戻り値)を返すプログラムのこと。

数学でやったy=f(x)と同様。yが戻り値でxが引数。

 

【データ】

関数が動詞だとするとその副詞。

どのような性質を持つかが定義されている。

 

オブジェクト指向プログラミングでは

関数とデータではなく「オブジェクト (object)

を部品として扱います。

 

【オブジェクト】

機能とデータを併せ持ったもの。

 

たとえば、えんぴつを考えてみましょう。

えんぴつには、色、長さ、固さ、などいろいろな性質があります。

そして、えんぴつを使って文字を書いたり

絵を描いたりすることができます。

プログラムでは、このような性質をデータで表し

機能を関数で表すことになります。

そしてオブジェクトとは、このデータと関数を結び付けたもの。

 

いままでのプログラミング言語では

データと関数を別々に定義するため

それをひとつのオブジェクトとして表すことができません。

えんぴつで文字を書くにも、えんぴつの種類を定義(データ)

文字を書く(関数)ようにプログラムしなければいけません。

 

ところが、オブジェクトはデータと関数を結び付けたものなので

自分がなにをしたらよいかわかっています。

えんぴつオブジェクトに文字を書けと命じれば

それが赤えんぴつのオブジェクトであれば文字は赤に

黒えんぴつのオブジェクトであれば黒い文字になる。

クラスとインスタンスとは?

また、オブジェクト指向プログラミングでは

実際に部品となり機能するオブジェクトインスタンス

その設計図(クラス)は別々に存在するため

簡単にインスタンスを作ることができる。

 

例えば、「"黒"えんぴつで"a"と書く」という部品を作った後

「"赤"えんぴつで"b"と書く」という部品も必要になったとする。

この際、オブジェクト指向であれば、「"黒"えんぴつで"a"と書く」

という部品の設計図を少しいじることで

簡単に「"赤"えんぴつで"b"と書く」という部品を作ることができる。

これは設計図と部品自体がごっちゃになっている

CやVBにはできない芸当。下はそのたい焼きの喩え。

f:id:pokita:20180421141901g:plain

 

【クラス 】

インスタンスの振る舞いを定義した設計図。

ここでデータを格納するための変数や

それを操作する関数が定義される。

この変数をクラス変数といい、関数をメソッド (method) という。

クラスはあくまでも設計図なので

そこで書いたプログラムを走らせるには

まず部品に落とさなければならない。

クラスはイデアにすぎないからだ。

 

インスタンス

クラスを元にして作られるオブジェクト。

ビルドインオブジェクトのstrやint同様に

クラスで定義された内容に基づいて属性を持っている。

それがインスタンス変数メソッドである。

また、インスタンスはそれぞれ独立した名前空間も持っている。

class C :
b = "b"

ins = C()
print(ins.b)
>>>b
#ins=C()によりクラス変数のbがinsのインスタンス変数になった

print(b)
>>>NameError: name 'b' is not defined
#bはクラスorインスタンス変数なので、オブジェクトがないと使えない
ins.b = "B"

print(ins.b)
>>>"B"
#代入によりinsのインスタンス変数bが上書きされた

メソッドとは?

簡単に言うとオブジェクトと結びついた関数のこと。

個別のオブジェクトの専用関数といったところ。

 

メソッドは、クラスが異なっていれば

同じ名前のメソッドを定義することができる。

クラスMornning にメソッド greet() が定義されていても

クラスEveningに同名のメソッド greet() を定義することができる。

class Mornning:
  def greet(self):
  print("Good morning!")

 

class Evening:
  def greet(self):
  print("Good evening!")


a = Mornning()
a.greet()

>>>Good morning!
b = Evening()
b.greet()

>>>Good evening!

 

これは、インスタンス自体がそれぞれ独立した名前空間

もっており、各メソッドはそれに属する関数だからである。

オブジェクトが属するクラスによって

実行されるメソッドが異なるこの機能を

ポリモーフィズム(polymorphism) 」と呼ぶ。

 

演算子もオブジェクトに属する言わばメソッドであり

その働きがビルトインオブジェクトの文字列と数値で違うのも

このポリモーフィズムの一例に挙げられる。

x = 1
y = 2
x + y #数値オブジェクトにおける「+」
>>>3
X = "1"
Y = "2"
X + Y #文字列オブジェクトにおける「+」
>>>"12"

基礎なので今回はここまで。

次は【初めてのPython22章】の記事で会いましょう!

 

Pythonにおけるメソッドと関数の違い

メソッド∈関数

初めてのPythonの第Ⅱ部【ビルドインオブジェクト】から

メソッドや関数の話が入るようになる。

その定義や詳細な説明もなく

「もちろん知ってるでしょ?」的な前提を元にペラペラと。

 

Pythonは比較的新しい言語であるため

JavaやCやってた人向けにこの本が書かれてるってとこある。

初めてのPython、分厚く”初めて”って言葉が入ってる割に

基礎的な説明があんまりなんだよなぁ…

詳しく調べるまで、ぼくの中では

【関数】

function(引数)→戻り値

 

【メソッド】

オブジェクト.method()→戻り値

 

のイメージ。どちらも対象(引数orオブジェクト)をそれぞれ操作し

その結果できた戻り値を返す、という感じだと思ってた。

後日list.append()メソッドの出現によりそのイメージは崩壊を迎える…

ネット辞書で調べてみる。

関数(ファンクション)

関数とは、引数と呼ばれるデータを受け取り、定められた通りの処理を実行して結果を返す一連の命令群。多くのプログラミング言語では、関数がプログラムを構成する要素となっている。多くの言語や処理系では、開発者の負担を軽減するため、よく使う機能が関数としてあらかじめ用意されている。

引用:関数とは? – IT用語辞典

メソッド 【 method 】 メンバ関数 / member function

メソッドとは、方法、方式、手法、やり方、などの意味を持つ英単語。ITの分野では、オブジェクト指向プログラミングにおいて各オブジェクトに属する処理や操作のことや、通信プロトコルにおける要求の種類などのことをメソッドということが多い。一般の外来語としては、一定の形式として確立した奏法、教授法、指導法、その他様々な技法のことを「○○メソッド」のように言う。

引用:メソッドとは? – IT用語辞典

……???もっと私文にも分かる言葉使え。

メソッドと関数の違い、何なんだろうな~これ。

『メソッド 関数 違い Python』で検索すると

多少なりともその話題のブログがヒットするんだけど

なかなか的を射たものが見つかんね。

 

その中で、「これかな?」と比較的腑に落ちたのがこのブログ。

d.hatena.ne.jp

この前後合わせて5つぐらいの記事を読んでみると

なんとなく納得できた。なんとなくね。

加えてwikiのこの記事内の一文

メソッド (計算機科学) - Wikipedia

メソッドと通常の関数の違いは主にインスタンス内部へのアクセスの有無である

 を元に自分なりの理解を書いていこうと思う。

 

その前に、まずは言い訳。

以前読んだプログラミングの記事にも書いてあったことだけど

「"プログラミングとはなにか"についてすら共通した定義

が定まっていないプログラミングの世界において、

各用語が表すのは、『愛』とか『正義』とか『国家』といった

の定義同様、極めて曖昧な概念であり、

そこまで厳密に考える必要はない。

 と。なので、以下にはふんわりと掴んだことを。

 

始める前に、大前提のふんわり情報として

メソッド∈関数

をあげておく。これはメソッドと関数の違いについて

書いてあるどのブログにも書いてあった。

メソッドも関数もそれぞれ述語であり

与えられた物(インスタンス)について

定義された一連の操作を行うものだからである。

関数は抽象的な操作であり

メソッドは具体的な操作である。

オブジェクト指向とは

 メソッドと関数の話が知りたいのに

なんでオブジェクト指向の話??!?

と思う方も多いかもしれない。ぼくもそうだった。

だって、『メソッド 関数 Python 違い』で調べると

決まってオブジェクト指向の話が載ってるんだもん。

オブジェクト指向はまだ学んでないのでその話はちょっと…」

だよね。でも、メソッドの説明において

オブジェクト指向の話は避けては通れないので

せめて語感だけでもいいから掴んで欲しい。

 

プログラミング言語界においては、

言語は大きく分けて2種類に分かれる。

命令型プログラミングオブジェクト指向プログラミングだ。

 

前者は主に”述語”(関数)を定義する。

吠える」という具合に。

それに対し後者は”主語”(オブジェクト)も定義できる。

ライオン吠える」という具合に。

 

定義されたオブジェクト(主語)には

それだけに対応した述語も定義できる。

「ガルルと低い声」

「警告の意味がある」

「千里を駆ける」

 

こうして色々な主語情報を定義できるため

命令型プログラミングでは

「吠える」(高い声?低い声?)(警告?挨拶?)

としか定義できないところを

オブジェクト指向プログラミングでは

「ライオンが吠える」という一言に

(地響きのように低い声で)(警告の意味がある)

という感じで、とても具体性を持たせることができる。

この”吠える”がそれぞれ関数であり、メソッドである。

 

つまり、メソッドとは

オブジェクト指向における特定のオブジェクト内で働く関数

のことである。特定のオブジェクト内でしか呼び出せない

という弱点はあるものの

より具体的に関数を実行することができるという利点もある。

 

オブジェクト指向についてはこの記事を参照。

python3.hatenadiary.jp

ビルトインオブジェクトのメソッド

メソッドとは、定義されたオブジェクト

のなかで定義されている関数と言える。

関数の構造を見るためにhelp関数を使うときは、

help(function)で済むのに対して

メソッドの構造を見るためにhelp関数を使うときは

help(object.method)でないと見れないのはそのためだ。

 

なぜなら、メソッドはobject.以下においてしか存在できない

関数であり、独立して存在し得ないからだ。

help(replace)
>>>NameError: name 'replace' is not defined
help(str.replace) #strは文字を表すビルトインオブジェクト
>>>replace(...)
S.replace(old, new[, count]) -> str

Return a copy of S with all occurrences of substring
old replaced by new. If the optional argument count is
given, only the first count occurrences are replaced.
  
また、ビルトインオブジェクトをhelp関数の引数とすることで
そのビルトインオブジェクトにデフォルトで
用意されたビルトインメソッドの一覧を見ることが出来る。
help(str)
>>>Help on Class str in module builtins:
class str(object)
| str(object='') -> str
| str(bytes_or_buffer[, encoding[, errors]]) -> str
|
| Create a new string object from the given object. If encoding or
| errors is specified, then the object must expose a data buffer
| that will be decoded using the given encoding and error handler.
| Otherwise, returns the result of object.__str__() (if defined)
| or repr(object).
| encoding defaults to sys.getdefaultencoding().
| errors defaults to 'strict'.
|
| Methods defined here:


結論

メソッドとは関数の一種であり、特定のオブジェクトの中でしか
使えない関数のことである。

第五回【初めてのPython(第3章)】

Pythonの実行方法は主に以下の3つ。

1.対話型プロンプトで直接Pythonプログラムを記述する 

2.システムのコマンドラインを使用してPythonファイルを実行する

3.IDLE等の統合開発環境で記述&実行する



【1.対話型プロンプトで直接Pythonプログラムを記述する】
キャプチャ1


システムのコマンドラインと一言にいっても、

OSのコマンドラインからやる方法と、
Pythonをダウンロードしたときに付随されている

Pythonコマンドラインからやる方法がある。

キャプチャ

スタートの検索窓に「Python」と入力することで、
ダウンロードしたPython関連のファイル一覧を見ることが出来ます。
そのうち『Python3.x』と書いているものが

Python(専用)のコマンドライン

Pythonのプログラムを直接入力することができるため

こういうのをプロンプトと呼ぶらしい。
どういった動きをするかすぐ確認できるのが便利。
Pythonコマンドラインと呼ぶよりも

インタプリタと呼ぶほうがわかりやすいかも。


【2.システムのコマンドラインを使用してPythonファイルを実行する】
キャプチャ3

コマンドライン(cmd)とは、パソコン本体のCPUを

直接司るシステムのこと。
そこで直接Pythonを動かしたいときは、

まずPythonインタプリタがある場所を、
環境変数で設定してあげる必要があるらしい。
でないと、cmdからPythonに命令を出すたびに、

その場所も指示しないといけなくなる。

詳しくはこのブログに書かれてました♨

初心者Pythonistへの一歩 1 - 開発環境導入 前編


ただ一つ相違点。
環境変数をしていした後、cmdからPythonのプロンプトを起動させる際は、
上記のブログでは「Python」と打つとあったけど、ぼくのcmdでは出来ず、
「py」と打ったらプロンプトが起動した。
(>>>が出てることがプロンプトのサイン)
詳しい理由はわからないけど、

恐らくPythonの最新バージョンの仕様だと思われる。


【3.IDLE等の統合開発環境で記述&実行する】
キャプチャ6


Pythonをダウンロ―ドしたときについてくる、
Python用の統合開発環境

IDLEと略記:Integrated DeveLopment Environment)
を使えば、コードをその機能によって色分けしてくれたり、

デバック機能を付けてくれたりと、
いたれりつくせりなんだけど、その使い心地はというと…。

Python IDE(統合開発環境)のオススメは?

これを見ると、どうもPyCharmの方がいいらしい。
ってことで、ぼくもPyCharm入れました。
けっこう使いやすいです。
導入のしかたはこちら↓

最強のPython統合開発環境PyCharm


よって、以後ぼくはPyCharmを使って行きます。

第四回【初めてのPython(第2章)】

Compiler_Interpreter

今回はプログラミング用語の解説章。
最初はつまんないから読み飛ばしていたけど、
プログラミングコード書くのに煮詰まってるいまは、

読み直したらむしろ楽しかった。
大枠を理解できたら他の言語を勉強するときにも

役に立つしオススメ。

まず言語は大きく分けて、

コンパイル言語インタプリタ言語に分かれる。

コンパイル言語は実行時、一度コンパイルという作業を行い、
コードを書いたテキストデータを一度バイナリファイルに変換した後、
それをコンピューターのCPUにぶち込むというもの。
変換作業は面倒だし、作られるバイナリファイルも

OSがLinuxWindowsか等で動作が異なるなど

互換性がないのが弱点だけど、魅力的なのはその速さ。
なにせ直接コンピューターのCPUに働きかけるんだからね。


インタプリタ言語(スクリプト言語)は実行時、
テキストファイルがインタプリタ(翻訳?)と呼ばれる
プログラム実行ソフトウェアで読み込まれ実行されるというもの。
コンパイルする必要なく、

テキストファイルのまま実行できるという利点はあるものの、
テキスト→インタプリタバイトコード化→インタプリタ→実行
というプロセスを実行するのが

あくまでもインタプリタ仮想マシン)である、

という点においてコンパイル言語に速さで劣る。


という違いらしい。なるほど、実行環境の違いであって、
文法上の違いではないのか。


2章ではほかに、

PythonシステムであるCPython,Jthyon,IronPython
テキストデータを書いた後の、その実行までの流れの違いが

書いてあった。

.NET環境でPythonの実行とか、Javaとの共存とか…

「だったら潔くPythonは捨てろや」

と思うのはぼくだけなのだろうか。


バイトコードコンパイルした後、

バイトコード仮想マシンにぶち込むまでの流れが上の話。


PMVの機能強化の役割を担うPsyco

(実行時オブジェクトの型情報を集めて機械語に効率的にコンパイルする)

フローズンバイナリ等の追加機能の話もあった。

なんでもブローズンバイナリ化すれば、配布の際に便利だとか。

相手の端末にPythonが入ってなくとも、

ブローズンバイナリ内には

バイトコードと共に実行環境たるPMVが内蔵しているんだもの。

 

……Pythonのいいところってなんでしたっけ?