Java取得者のためのPhtyonプログラミングのはじめ①

# 自己紹介
入社４年目の金融システムSE。
普段はJava言語で類似Strutsを使ったフレームワーク上でWebアプリケーションを作ってます。
そろそろJava言語に飽きたので、今流行りのPythonを勉強してみます。
（今からって遅いけど…　自戒を込めて）

ということで、Java習得者の視点からPythonを勉強しようと思います。
要点をまとめていくので、良ければお付き合いください！

# Pythonの文法
## 基本のキ
### ①コメント文
コメントは文頭に「#」を付ける。
複数行コメントは後述する複数行の文字列リテラルを表示する「'''」または「"""」で囲み、コメントとして扱うことが多い。
 ※'''または"""を使用する場合は直前の行とインデントを揃えること

```python
## コメントです

'''
複数行コメントの記載方法
XXX
YYY
'''
```

### ②インデックス指定
Java言語では文字列の一部やリストの一部を取り出したいときに[n]と記載指定した。これはPythonも同様。
nの指定も0スタートとなる。
ただ、文字列型の場合、最終要素（最後尾）を取り出す場合は、「str(str.Length() - 1)」と記載していたが、Pythonでは[-1]と記載すれば良い。これを「ネガティブインデックス」という。
（右端から-1, -2, -3・・・の要領）

### ③処理ブロックはインデントで判断される
Javaでは一定範囲を「{}」で明示的に囲むことで処理ブロックをコンパイラに認識させていた。
これをPythonではインデントだけで表現している。


### ④条件文に「{}」を使用せず「:」を使用している
Pythonではif文、for文、while文に関して、Javaの「{」を記載している箇所に「:」を記載する
具体例は以下説明のとおり。

## データ型

基本データ型はこちら。

| データ型 | 内容 | 具体例 | Javaでのデータ型 |
|:-:|:-:|:-:|:-:|
| 数値型（int型） | 整数リテラル  | 100 | int |
| 数値型（float型） | 浮動小数点数リテラル | 3.141592 | double, float |
| 文字列型（str型） | 文字列リテラル | こんにちわ、Hello | String |
| ブール型（bool型） | True, Falseの２つの値 | True, False |   boolean|

文字列リテラルはシングルクォーテーション、ダブルクォーテーションどちらでもOK。
３つの’または”で囲むと囲んだ範囲内の文字列に改行があっても、１つの文字列として扱われる。
（ソースコードの改行が改行コード¥nとなって処理される）

```python
'Test'
"Test"

# 'aaa¥nbbb¥nccc' と表示される
'''aaa
bbb
ccc'''
```
また、値そのものが存在しないことを示す場合は「None」を使用する。
Javaのnullとほぼ同一の概念と理解して良いらしい。
　参考：[【Python入門】nullオブジェクト「None」とは](https://www.sejuku.net/blog/50205)

## オブジェクトと変数
変数の代入については、基本的にJava言語と同一。
ただし、Java言語ではプリミティブ型の変数代入については、変数の値そのものを代入（＝参照を代入していない）するが、Pythonでは参照代入の動きとなる点に注意が必要である。

```python
num1 = 123
num2 = num1
# この場合num2にはnum1の参照がコピーされる
# num1,num2をint型とした場合、Java言語だとnum2には123という値そのものが設定される

# ここで変数num2に新しい値を設定する
num2 = "Hello"
# num2には新しいオブジェクトが用意され、それを参照するようになる
# Java言語だと数値型のnum2に文字列は設定できないが、Pythonでは可能
```

　参考：[プリミティブ型（基本型）と参照型（クラス型）](http://teachingprogramming.net/archives/647)

## 条件文
Java同様にPythonでもifを使用して条件文を記載する点は同じだが、
以下が違うので、ここだけ理解すれば良い。

* {}がない点や
* :を使う点
* else ifをelifと記載する点

```python
# for文は直後で説明しているので繰り返しブロック内で
# 条件判定をしている、ということだけ理解してほしい
for tmpNum in range(10):
    # end = "" で標準出力後の自動改行を無くす
    # Java言語のprint()とprintln()の違いと同じ
    print(str(tmpNum) + "--> ", end = "")
    
    if tmpNum % 2 == 0:
        print("2N")
    elif tmpNum % 3 == 0:
        print("3N")
    else:
        print("not 2N, 3N")
```


## 繰り返し文
Java言語ではfor文や拡張for文、while文等を使用する。
Pythonでも基本的には同様。
それぞれをJava言語と比較しながら見ていくとこんな感じ。

### for文
Java言語ではこんな感じ。

```java
// 文法
for (初期化式; 条件式; 変化式) {
    // 条件式がtrueのときに繰り返す処理
    // 脱出時はbreak;
    // スキップ時はcontinue;
}
// 記載例
for (int i = 0; i < list.size(); i++) {
    System.out.println(i + " : " + list.get(i));

    if (i > 2) {
        break;
    }
    if (i % 4 == 0) {
        continue;
    }
}
```

これらをPythonで記載するとこうなる。

```python
# 文法
for カウンタ変数 in range(繰り返し回数):
    繰り返し処理

# 記載例
# 0,1,2,3,4が出力される
for count in range(5):
    print(count)

# こうやると3,4が出力されそうだが、上と同じ0,1,2,3,4が出力される。
# つまり、for文で使用するカウンタ変数は実行時に初期化(０)される。 
# なので、0スタート以外を実現したい場合は、range(3, 5)のように記載する。（3,4が出力される）
count2 = 3
print(count2) # 3が出力される
for count2 in range(5):
    print(count2)

for count3 in range(3, 5):
    print(count3)

```

break, contitueの使用方法はこちら。

```python
strings = ['ruby', 'python', 'perl', 'java', 'c']
for string in strings:
    if string == 'python':
        print('HIT')
        break  # 一致したので、breakで抜ける
    print(string)
# 実行結果 → ruby, HIT
# continueもbreakと同様。
```

### while文

Java言語同様にwhile文も存在する。
記載例はこんな感じ。

```python
count4 = 0
# while (条件文):
#     繰り返したい処理
# ※条件文は満足している間のみ繰り返される（Java同様）
while (count4 < 10):
    print(str(count4))
    count4 += 1
```

#### プラスα編：for-else文

while文と同様にelseも使用できる。

```python
# for文内でbreak条件に該当しなかった場合、elseブロックが実行される。
# ※一度もループしない場合は必ずelseが実行される点に要注意
scores = [100, 71, 80, 99, 75]  # 70点以下はないので、合格
for score in scores:
    if score <= 70:
        break
else:
    print('合格')
# 実行結果 → 合格
```

---
ここまでお付き合いありがとうございます＾＾
基本編はここで終了です。
次はリストや辞書と集合、関数について記載していきます。