PythonとりあえずマスターRTA

既にC/C++やFortranといった古い言語を知っている人に向けたPythonテキストです。
やりたいことは各自あるけれども、そのやりたいことを「Python やりたいこと」で検索しても、そもそも読めないから理解できないという人に向けて、最速で最低限を学ぶことを目指します。

### 目指す最低限ライン

- 環境構築（RTA版）
- 変数とクラスとメソッド
- コンソール出力
- リストと辞書
- numpy （便利なモジュール）
- 【おまけ】その他の構文

これらをマスターするのではなく、何となく知っている感をつかむのが目標です。ですので、C/C++やFortranの知識で互換性があるものは省略しています。

***出力内容とか、環境によって微妙に違うかもしれません。本質的でない出力命令も書いてません。情報の選択は個人的見解に基づきます。他の人は別な点を学ぶよう勧めるかもしれません。細かいことは気にしないでください。***

# 環境構築（RTA版）

[Anaconda（リンク先）](https://www.python.jp/install/anaconda/index.html) が便利ですが、この記事の内容をフォローする程度にちょっと触るだけならオンライン環境の [Paiza（リンク先）](https://paiza.io/ja)などでやれば良いと思います。ブラウザで開ければ環境構築終了です。

# 変数とクラスとメソッド
### 変数
変数名にはアルファベット（大小）と数字（先頭の一文字は除く）とアンダーバー`_`が使えます。変数型の宣言はありません。ある変数`spam`に数字を代入したあとすぐに文字列を代入することができます。

```python
spam = 10     # spamに10を代入
spam = "Egg"  # spamに"Egg"を代入
```

行末のセミコロン`;`は不要です。`#`以降はコメントとなります。Pythonではミームとしてコメディアンのモンティ・パイソンに関係したキーワード`spam` `egg` `ham`など  を使うことがあります（詳しくは[こちら](https://ja.wikipedia.org/wiki/%E3%83%A1%E3%82%BF%E6%A7%8B%E6%96%87%E5%A4%89%E6%95%B0#spam%E3%81%A8ham)や[こちら](http://www.school.ctc-g.co.jp/columns/super/super58.html)）。

全ての変数はクラスですので、それぞれメンバー関数（メソッド）を持っています。と言ってもここで難しい説明は省きます。使い方だけ、よく使うメソッドが文字列型の`format`メソッドで紹介します。

### メソッド
メソッドは`変数.メソッド()`の形で呼ばれます。この変数はメソッドに対するレシーバーと呼ばれます。`format`メソッドはC/C++の`printf`の%記法と似たもので、文字列内の`{番号}`の部分を引数の内容で置き換えます。番号は0スタートで、順番に`format`の第一引数・第二変数...と対応します。

```python
fname = "./myFile_{0}.txt"
fname.format(1)                     # "./myFile_1.txt" が返る
fname.format("memo")                # "./myFile_memo.txt" が返る
fname.format("note_{0}").format(10) # "./myFile_note_10.txt" が返る
```

最後の例はメソッドにより返ったものを次のメソッドのレシーバーとする手法（メソッドチェイン）です。まず`fname.format("note_{0}")`により`"./myFile_note_{0}.txt"`が返り、次に`"./myFile_note_{0}.txt".format(10)`が実行され"./myFile_note_10.txt"が返ります。

メソッドにはレシーバーの内容を変える破壊的なものと変えない非破壊的なものがあります。使いながら覚えれば良いです。

メソッドは独自に組むこともできます。`def メソッド名(仮引数):`で定義します。

```python
def myMethod(ivar):
   return ivar        # 値を返す
# End of myMethod
spam = myMethod("Egg")
```

C/C++なら`{ }`で、Fortranなら`BEGIN END`で括るところですが、Pythonではコロン`:`とインデントで管理します。コロン`:`のある行よりも一段インデントが多い範囲がひとまとまり（ブロック）になります。慣れないうちはコメント（defと同じレベルのインデントの後に`#`）を置いて、メソッドの終わりを明示すると良いでしょう。

# コンソール出力

コンソール出力は`print`メソッドので行います。引数は文字列または変数です。複数の引数を`,`で並べることもできますが、変数そのままではわかりにくいこともあります。`format`メソッドを上手く使いましょう。

```python
spam = 10
egg = 22
print("spamとegg: {0}, {1}".format(spam, egg))
print("spamとeggの内容: ", end="") # 最後に改行しない
print(spam, egg)
# =>
# spamとegg: 10, 22
# spamとeggの内容: 10 22
```

`end=""`のオプションを加えることで、最後に自動的に入る改行を消すことができます。


# リストと辞書

### リスト
リストはC/C++やFortranにおける行列です。整数によるインデックスで操作します。リストは`[ ]`で括られます。


```python
ar = [10,11,12,13,14]
ar[0]    # => 10
ar[-1]   # => 14
ar[1:3]  # => [11,12]
ar[-2:]  # => [13:14]
ar[-2:5] # => [13:14]
ar[::3]  # => [10,13]
```

リストは`[先頭のインデックス:末尾のインデックス:インデックスを増やす量]` で範囲を操作できます。C/C++やFortranと異なるのは、インデックスは各要素の先頭にあるという感覚です。下図を見てください。インデックスは先頭から0スタートで増えるものと、末尾の要素の先頭を-1とし、前へ-1づつ減らすものの両方が使えます。省略した場合、最も多い数の範囲になるように調整されます。ですので、図の13と14の値の要素を指定したければ、インデックスで挟む様に、`3:5`や`-2:5` `3:` `-2:` という表現になります。

<img width="300" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/264339/89380c31-be26-1910-c04a-5186f79a5150.png">

多重のリストもできます。

```python
ar = [[1,2,3],[4,5,6]]
ar[0]    # => [1,2,3]
ar[0][1] #=> 2
```

変数に近い方から順に外側から処理されます。C/C++の配列と同じ感覚です。

### 辞書
辞書は、インデックスの代わりに任意の値（鍵、数値か文字列）が使われる配列みたいなものです。範囲の指定はできません。辞書は`{鍵1:値1,鍵2:値2}`で定義されます。値はなんでも良いです。

```python
dct = {"spam":300,10:"ten","egg":[0,1,2]}
dct["spam"] # => 300
dct[10]     # => "ten"
dct["egg"]  # => [0,1,2]
```

### リストと辞書の操作
#### 順に値を取り出す
`for`により一つずつ値を取り出すことができます。メソッドの時と同じようにブロックを定義（`:`とインデント）します。この操作はリストや辞書だけでなくiterableなもの全てに行えます。

```python
ar = [10,11,12,13,14]
for ee in ar:
   print("{0}, ".format(ee), end="") # 最後に改行しない
# => 10, 11, 12, 13, 14,

dct = {"spam":300,10:"ten","egg":[0,1,2]}
for kk in dct.keys():
   print("{0}, ".format(kk), end="") # 最後に改行しない
# => spam, 10, egg
for vv in dct.values():
   print("{0}, ".format(vv), end="") # 最後に改行しない
# => 300, ten, [0,1,2]
for kk,vv in dct.items():
   print("{0}:{1}, ".format(kk,vv), end="") # 最後に改行しない
# => spam:300, 10:ten, egg:[0,1,2]
```

辞書は鍵だけ、値だけ、鍵と値の両方を取り出すことができます。勿論この`for`構文を使えば普通のforループも可能ですし、多重のforループも可能です。

####追加する
リストは`append`メソッドにより末尾に値を追加することができます。また`extend`メソッドで別のリストを末尾に結合することができます。

```python
ar = [0,1,2]
ar.append(3)     # => [0,1,2,3]
ar.extend([4,5]) # => [0,1,2,3,4,5]
```

辞書は`update`メソッドで鍵と値の追加（鍵が既にあれば値の上書き）ができます。

```python
dct = {"spam":300,"egg":100}
dct.update({"spam":200,"ham":200}) # => {"spam":300,"egg":100,"ham":200}
```

# numpy （便利なモジュール）
行列などを扱っているとリスト＋リストで値を足し合わせたりしたくなります。それを可能にしてくれるモジュール（C/C++でのライブラリ）がnumpyです。モジュールのインポートには`import`構文を使います。

```python
import numpy as np
ar = np.array([0,1,2])
ar + np.array([0,2,4]) # => [0,3,6]
ar + 1                 # => [1,2,3]
ar * 3                 # => [0,6,9]
```

`import numpy`の後の`as np`はインポートしたものを以後npとして扱いますという言いかえ宣言です。長いモジュール名でもこれで簡略化できます。numpyは慣習的にnpと省略します。`np.array()`は引数のリストを`numpy.ndarray`というnumpy用の配列に変換してくれます。この配列型になると配列同士の足し算（同じ構造であること）や整数との四則計算ができるようになります。ほかにもtransposeかけるなどの行列操作もできます。なおインデックスの操作は標準のリストと同じです。

また、numpyには三角関数なども入っています。全部`np.メソッド()`で呼び出します。詳しく知りたいなら[numpyの公式ドキュメント](https://numpy.org/doc/stable/)読むよりも、「numpy 関数名」とかでググったほうが早いです。乱数なんかもあります。


# 【おまけ】その他の構文
### with構文
特にファイル操作の時によく出てきます。コードの特定の範囲（ブロック）内でのみ有効な変数（より正確にはインスタンス）を定義し、ブロックが終わると消す（ファイル操作ならファイルを閉じる）操作をしてくれます。

```python
with open("myData.txt", "r") as iFile:
   iFile.readline() # 1行読み込む
```

### while構文
Pythonにはdo-whileはありません。whileループのみです。

```python
flag = True
while flag:
   flag = False
# 1回のループで抜けます
```

<hr>
以上、既にC/C++やFortranといった古い言語を知っている人が、Pythonでやりたいことを調べる前にとりあえず知っておくべき内容をまとめました。

***CC-BY: Akito D. Kawamura (@aDAVISk)***