python Dive Into Python3 章0,章1 日本語版自分用メモ

######今日の参考元
**http://diveintopython3-ja.rdy.jp/your-first-python-program.html**

#######備考：
コマンドプロンプトを調べる
結果：terminalでpythonと入力したらなぜかPythonシェルが入っていた。そうか。
過程はキング・クリムゾンしたがこれでターミナル上でpythonの.pyファイルを起動させることが出来るようになった。これってさいこー。
で、これはつまり.pyのpythonファイルを起動できるということ？
terminalにpython3と打ち込んだ後なら、print("Hello World")が、でたぁ。
1 + 1と打ち込めば2と表示。すげぇ。
が、humansize.pyを使えない。？？？
→ディレクトリを移動する必要があるらしい。
　humansize.pyはdownloadsにあるから、とりあえずデスクトップに移動。pythoncodeフォルダを作成して入れる。
terminal上でcd desktopしてから cd pythoncodeで目的地に到着。lsでフォルダの中身を表示。humansize.pyがある。
おーきーどーきー。terminalにpython humansize.pyでエンター。good。
※python3を起動するには、terminalにpython3とただ打ち込めばいい。

#####・Pythonでは関数の引数にデフォルト値を持たせることができる。
引数に対応する値無しで関数が呼び出された場合には、その引数にデフォルト値が割り当てられる。
def approximate_size(size, a_kilobyte_is_1024_bytes=True):
仮引数に最初から値を、=で代入してる。
この場合、引数を与えなくても呼び出せる。
もちろん与えても良い。

#####・関数を呼び出すとき、引数の名前を指定して値を関数に渡すこともできる。この際順番に関係なく行える。
関数名(値1, 引数名=値2）みたいな書き方もありなのか。
例)
def approximate_size(size, a_kilobyte_is_1024_bytes=True):

1.approximate_size(4000, a_kilobyte_is_1024_bytes=False) ○ 
2.approximate_size(a_kilobyte_is_1024_bytes=False, size=4000)　○
3.approximate_size(a_kilobyte_is_1024_bytes=False, 4000)　☓エラー
1.において第一引数の値4000の後ろに、名前付き引数(ここでは、a_kilobyte_is_1024_bytesを指してると思う)は無問題。実行可能。
2.pythonでは、左から右へ読んだとき一度名前付き引数が出たら、それ以降の引数には必ず引数名を指定しなければならない。a_kilobyte_is_1024_bytesって引数名を最初に書いたから、以降もsizeって名前を各必要がある。
3.2のだめな例。approximate_size(size=4000, False)　☓　名前付き引数以降は、名前付き引数である必要がある。

#####コードを書いてから6ヶ月後の自分が読めるコードを書け docstringについて
document string?（書類的文字列＝説明？)
'''の注釈でコードがどんなものかわかりやすく説明をつけておけということらしい。
↓↓↓これ

```py
    def approximate_size(size, a_kilobyte_is_1024_bytes=True):

    '''Convert a file size to human-readable form.

    Keyword arguments:
    size -- file size in bytes
    a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
                                if False, use multiples of 1000

    Returns: string

    '''
```
'
docsringは実行時に関数の属性として利用できる。関数の属性？わかめ。
→属性：インスタンス変数、クラス変数、メソッドのことを属性と呼ばれるらしい？ほんとか？名前で管理される。つまり、変数とメソッドの名前を属性と言っている？後述でも別の説明してあるらしい。


#####1.4 import検索パス
モジュール(確かクラスファイルのこと)をimportすると、pythonは何箇所か参照する。
sys.pathに定められたすべてのディレクトリを見るらしい。sys.pathはただのリストで、リストメソッドで中身を見たり、内容を変更できるとさ。
import sys
sys.path
これをterminalでpython3とうったあと実行すると、リストがどじゃーんとでてくる。
pathはリストなんだなー。
print()使ってないけど、表示されるんだな。NAZE?後回し。フラグ。
とりあえず、path.append()とかpath.insert(0, '/home/mark/diveintopython3/examples')とかでモジュール(.pyファイルのこと)の場所をpathリストに追加できるということだね。
逆に言えば自分で何かメソッドとかを作っても登録しないとimportできないってことだろうな。多分。←試したらやっぱりそうだった。リストに登録されてない.pyファイルを（今回はhumansize.py)をimportしても何も起こらない。
importが使われたとき、このリストの中全部を調べる。組み込みモジュールはなんか別らしい。今は無視。情報制限。ドライマンゴー買い足す。

#####1.5あらゆるものがオブジェクト
pythonの関数は属性を持っている。その属性とやらは実行時に利用できる、らしい。また属性か。

```py
>>> print(humansize.approximate_size(4096, True))
4.0 KiB
>>> print(humansize.approximate_size.`__doc__`)
Convert a file size to human-readable form.

    Keyword arguments:
    size -- file size in bytes
    a_kilobyte_is_1024_bytes -- if True (default), use multiples of 1024
                                if False, use multiples of 1000
```
    Returns: string
　モジュールをインポートすると、そのモジュールが公開している関数・クラス・属性を参照できるようになる。
　インポートされたモジュールの中で定義された関数を使う時は、モジュール名.関数名()とする必要がある。コレは知ってる。
humansize.approximate_size()ということ
`__doc__`は関数の属性の１つらしい。を呼び出したんだとか。なんのこっちゃ。Qitaでアンダーバー2本つかう記述できないのかよ。
属性もモジュール名.関数名.属性名　で呼び出せることはわかった。
`__doc__`に前述のdocstringの内容が入ってるらしい。defで関数を作るとき、中で'''を書くと、関数内部に自動作成された？初期から存在する？`__doc__`属性とやらに代入されるのか。タブンネ。
多分他の組み込み関数にも説明として存在しているだろう。→してた。

#####オブジェクトとは何か？
pythonではあらゆるものがオブジェクト。object。モノ、物体。
すべてのオブジェクトは属性とメソッドを持つことが出来る。すべての関数は、組み込み属性の`__doc__`を持つ。←はい。同時に属性にも種類があるんだろな。
`__doc__`はその関数のソースコード上に定義されたdocstringを返す。←上でdocstringを利用できるってこういう意味か。つまりdocstring(='''のこと)が存在するなら`__doc__`で説明を見れるってことだな。

話は戻って、オブジェクトとは？
A.言語によって違う。pythonではゆるい。
pythonにおいて一部オブジェクトは属性もメソッドももたず、すべてのオブジェクトがサブクラス化できるわけではない。しかしそれらオブジェクトは変数に代入できる。関数の引数として渡すことができる。ゆえにすべてがオブジェクトらしい。
**pythonではあらゆるものがオブジェクト。**
忘れちゃダメだって。リストも。文字列も。関数も。クラスも。クラスインスタンスも。モジュールも。ぜーんぶオブジェクト。すべてだよエブリィシングォワァンだよ。

サブクラスの意味がわからねぇ。
→サブクラス：他のクラスから派生したクラス。継承における親クラスと子クラスの子供のほうだな。


#####1.6 コードをインデントする。
pythonの関数は開始や終了を示す{}や記号を持たない。:　とスペース４つ　or　tab1回分のインデントのみだ。
Qiitaでtabキー使えないのなんでぇ？ほわぃ。

```py
    def hello(name):

        return "hello " + name 
```

　上述のようなコードブロックはインデントによって定められる。ここでのコードブロックという言葉は、if分、for文、while文ループなどを示す。
インデントでブロックが始まり、インデントでブロックが終わる。インデントは空白の数に一貫性がありさえすればいい。
　・また完全に空白の行は無視される。def hello(name):の次の行のことだ。


#####1.7. 例外
例外とは何か？　A.通常はエラーのこと。何かがうまくいかなかったことを知らせるもの。いつも通りエラーまみれ。
pythonシェルでエラーが起きたとき、シェルは例外の詳細とどうやって起きたのかを表示してから処理を止める。＝未処理例外と呼ばれる。
発生した例外に対する明示的なコードが無い限り実行は終了する。
→pythonの関数は、どのような例外を送出するのか宣言しない。えー、つまり、関数でどのエラーが起きる可能性があるかpython側は教えてくれないってことか。なんかヤバぇぞ。アフガニスタンか？
予知できる例外はtry...exceptブロックで例外を処理できる。
pythonでは、例外処理のためにtry...exceptブロックを使う。例外を生成するためにraise文を使う。

raise文 例）

```py
    if size < 0:
        raise ValueError('number must be non-negative')
```

raise文 例外名 デバッグ用の人間が読める文字列
→例外は、発生させた関数の中で処理される必要はない。もし発生させた関数で例外が処理されない場合、例外はその関数を呼び出している関数に渡され、更にその関数を呼び出してる関数に渡され…。以降同様に遡る。もしどの関数でも例外が処理されない場合は、プログラムはクラッシュする。pythonは"Traceback"という標準エラー出力し、流れが終わる。はいな。

#####1.7.1 インポートエラーを補足する
ImportError例外。モジュールをインポートしようとして失敗したときの例外。
最も単純なケースは、sys.pathに使いたいものが存在しない場合。存在すれば使う、なければ実行を続ける。以下で実現
例) モジュールのchardet(文字コードの自動判定)があるかないか。

```py
try:
  import chardet
except ImportError:
  chardet = None
```
これ以降、chardetモジュールの存在を単純なif文で判断できる。
なぜって、全てはオブジェクトだよ兄貴。

```py
if chardet:
  # do something
else:
  # continue anyway
```
全てはオブジェクト。

・あるいは２つのモジュールが共通のAPIを実装しているが、他方がより望ましい場合にもImportError例外が使われる。
１つめをimportとしてみて失敗したとき、2つめのモジュールへ触りにいく。

```py
try:
    from lxml import etree
except ImportError:
    import xml.etree.ElementTree as etree
```
このtry...exceptブロックを抜けることには、何らかのモジュールがimportされ、etreeという名前で呼び出せるようになっている。どちらのモジュールであってもetreeという名前であるので、以降も気にする必要はない。
楽ちん。便利。つよい。らしい

#####1.8 未束縛の変数
approximate_size()関数の内部の行を別の視点から見る：

multiple = 1024 if a_kilobyte_is_1024_bytes else 1000
ここの代入のしかたif...elseでどうなってんだ？
→a_kilobyte_is_1024_bytesって変数があるならそれ。ないなら1000か。せんせー変数名が長いぃ。
変数multipleの宣言はどこにも行っていない。
単にmultipleに値を代入しているだけ。
が、pythonではそれができる。
しかし、値が代入されていない変数を参照は許されない。NameError例外が発生する。

```py
>>> x 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'x' is not defined
>>> x = 1
>>> x
1
```
いつかこれに感謝するらしい。すでにしてる。


#####1.9 あらゆるものにおいて大文字と小文字が区別される。
pythonではすべての名前：変数名、関数名、クラス名、モジュール名、例外名では大文字と小文字が区別される。
（取得、設定、呼び出し、生成、インポート、送出ができるものは、大文字と小文字が区別されるとのこと）

```py
x = 1
X 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'X' is not defined
```
許されないよキミィ。


#####1.10 スクリプトを実行する
pythonのモジュールはオブジェクトであり、いくつかの便利な属性を持っている。
この属性を使ってモジュールを簡単にテストできるようになる。

```py
    if __name__ == '__main__':
        print(approximate_size(1000000000000, False))
        print(approximate_size(1000000000000))
```

これは何を行っているのか？
モジュールはオブジェクトであり、すべてのモジュールは`__name__`という組み込みの属性を持っている。属性か。`__name__`の値は、そのモジュールをどのように使っているに応じて決まる。そのモジュールをimportした場合は、`__name__`はモジュールをのファイル名からディレクトリ名と拡張子を取り除いたものに鳴る。
つまり
ファイル名 humansize なら

```py
>>>import humansize
>>>humansize.`__name__`
"humansize"　
```
となる。
しかしモジュールは、スタンドアローンのプログラムとして直接実行もできる。
'''
Q.スタンドアローンのプログラム？
→単独で機能？どういう状況なのだ？
humansize.pyだけで動くプログラム＝スタンドアローンってことか？単体のファイルのみで動くことを刺しているのかな。mainってんなら、そのファイルがmainになるみたいな意味で。うーん？
'''
スタンドアローンのプログラムの場合、
__name__は特別なデフォルト値の"__main__"になる。

```py
if __name__ == '__main__':
    print(approximate_size(1000000000000, False))
    print(approximate_size(1000000000000))
```
これが実行されると。結果が出力される。



参考元：
http://diveintopython3-ja.rdy.jp/your-first-python-program.html
ありがとう。感謝。谢谢。Danke。アリベデルチ。

#####1.11　　もっと知りたい人のために
PEP 257: Docstring Conventions は、良いdocstringと最高のdocstringの違いについて説明している。
Python Tutorial: Documentation Strings もその話題に触れている。
PEP 8: Style Guide for Python Code は、良いインデントスタイルについて議論している。
Python Reference Manual は、Pythonではあらゆるものがオブジェクトと言ったことが何を意味するのかを説明している。これは一部のペダンチックな人々が好き好んで、この類のことを長々と議論するからだ。
↑↑↑↑↑ｚ
未読。