Java屋さんのためのPython Syntaxチートシート

最近Pythonをはじめました。
が、やりたいことはググると出てくるし、Python3に至ってはオブジェクト指向になってくれたおかげで、だいたいは雰囲気つかめちゃったりするので良いのですが、いざ書いてみると躓くのは文法だったりしますよね？（私だけ？）
だいたいJavaに慣れきってたりすると、Javaだとああ書くんだけど、Pythonだとどう書くんだろ？的な発想になるので、似たようなことを考えてる人のお役に立てれば幸いです。

というわけで、Javaだとこう書いてたけど、Python3だとこう書くんだよ、というのを残しておきます。
始めたばっかりなので、多少考え方とか間違ってるかもしれないけど、そのへんはご愛嬌。ざっくりです。書きながら覚えていくタイプなんで。
気が向いたら更新していくと思います。

## 環境

Python 3.8
Java 8

## 公式のチュートリアル

https://docs.python.org/ja/3/tutorial/index.html

## 公式のユニットテスト(unittest)

https://docs.python.org/ja/3/library/unittest.html

# チートシート

## コメント

### Java

```Java
// 行単位のコメント
/*
 * ブロックコメント
 */
```

### Python

```Python
# コメント
```

## クラス定義

### Java

```Java
public class Hoge {

}
```

### Python

```Python
class Hoge:  # コロンが大事！！
```

## コンストラクタ定義

### Java

```Java
public Hoge(){
  // 初期化すんよ
} 
```

### Python

（追記）Pythonの場合はコンストラクタというより、メソッドだそうです。
コンストラクタの中から呼ばれるメソッド、と思ったほうが良さそう

```Python
def __init__(self):
  # 初期化すんよ
```

## インスタンス生成

### Java

```Java
Hoge hoge = new Hoge();
```

### Python

```Python
hoge = Hoge()
```

## 処理起点（いわゆるメイン）

### Java

```Java
public static void main(String[] args) {
    // body of main()
}
```

### Python

```Python
if __name__ == "__main__":
  hoge.hoge()
```

## 他のモジュール（クラス）を使いたい

### Java

```Java
import jp.co.hoge.Hoge;
```

### Python

なんか書き方いっぱいある・・・！
https://nansystem.com/python-module-package-import/

```Python
```

## 条件式

https://docs.python.org/ja/3/tutorial/controlflow.html

### Java

```Java
// a = b and b = c
if (a == b && b == c) {
  System.out.println(a)
}

// a = b or b = c
if (a == b || b == c) {
  System.out.println(a)
}
// 否定
if (!enable) {
  System.out.println(a)
}
```

### Python

```Python
# a = b and b = c
if a = b and b = c:
  print(a)

# a = b or b = c
if a = b or b = c:
  print(a)

# 否定
if not enable:
  print(a)
```

## 比較演算子

比較演算子はJavaもPythonも一緒

```
<  <=   >   >=   ==   !=
```

## null と None

Javaのnullはオブジェクトがない
PythonのNoneは 値がない
をそれぞれ意味する

https://www.quora.com/What-is-the-difference-between-Javas-null-and-Pythons-None
> In Java, null is an instance of nothing, it is often referred as "no object" or "unknown" or "unavailable" .

> In Python None is an object, denoting lack of value. This object has no methods. It needs to be treated just like any other object with respect to reference counts.

> So these two are not much alike, however since Java 8 Optional has come along which is more similar to None. It is a class that encapsulates an optional value.
You can view Optional as a single-value container that either contains a value or doesn't (it is empty)

厳密にはnullとNoneは意味が違うので同じようには使えない、NoneはJavaでいうところのOptionalが近い。

> While the difference is nuanced, Python's None by being an object itself, helps avoid some types of programming errors such a NullPointerExceptions in Java.

ただ、Noneはオブジェクトなので、ぬるぽ処理みたいなことに役立つよ

という話らしい。

## 文字列の空白・null判定

PythonはnullじゃなくてNoneだけど。
https://pg-chain.com/python-null

### Java

```Java
// str != null && str != ""
if (str.isEmpty()) {
  return true;
}
```

### Python

```Python
if not str:
  return True
else
  return False
```

## エラー

https://docs.python.org/ja/3/tutorial/errors.html
既定クラスはJavaもPythonもExceptionクラス

### java

```Java
try {
  // 例外が起きる処理
} catch (Exception e) {
  e.printstacktrace();
  throw new CustomizeException();
} finally {
  // 最後にしておきたい処理
}
```

### Python

```Python
try:
  // 例外が起きる処理
except Exception as e:
  print(e)
```

## リスト

https://docs.python.org/ja/3/tutorial/datastructures.html

PythonのリストはJavaの配列とArrayListのいいとこ取りした感じのやつっぽい。
書き方はJavaの配列に似ている。
Pythonには配列型もあって、こっちがJavaの配列とほぼ同じなのかな。配列型は標準では使えず、インポートが必要。

### Java

```Java
List<String> list = new ArrayList<>;

// 配列の長さを取得
list.size();

// リストに追加
list.add("lemon");
```
### Python

```Python
l = ["John", "Bob", "Carry"]

# リストの要素数を取得(len関数を使う)
len(l)

# リストに追加
l.append("Mickey")
```

## Map → 辞書

JavaでいうところのMapはPythonの辞書(dict)にあたる。
https://docs.python.org/ja/3/tutorial/datastructures.html

### Java

```Java
Map<String, String> map = new HashMap<>();
```

### Python

```Python
# 波括弧{}で作成する場合
d = {'key1': 'aaa', 'key2': 'bbb'}

# コンストラクタでも作れる
d2 = dict()
d3 = dict('k1'='aaa', 'key2'='bbb')
# 他にもいろいろ書き方あり

```

## 文字列 → 数値変換

整数の場合は int()、浮動小数点の場合は float()を使う
https://note.nkmk.me/python-str-num-conversion/

### Java

```Java
int month = Integer.valueOf("01");
// または
int month = Integer.parseInt("01");
```

### Python

```Python
month = int('01')
```

## 数値 → 文字列変換

str()を使えばいい
https://note.nkmk.me/python-str-num-conversion/

### Java

```Java
String month = Integer.toString(1);
// または
String month = new String(1);
```

### Python

```Python
month = str('01')
```

## その他 いろいろ参考になったサイト

- 命名規則
    - https://qiita.com/naomi7325/items/4eb1d2a40277361e898b
- 他のモジュールをimportしようとするとpylintに怒られる件
    - https://qiita.com/ysuzuki19/items/55e2907a7c8f06889581
- ファイル読み込み
    - https://qiita.com/wiwi7373/items/c4b2b9ef02ae0f970843
- unittestライブラリの使い方
    - https://kazuhira-r.hatenablog.com/entry/2019/10/20/222620
- csvのインポート・エクスポート
    - https://note.nkmk.me/python-csv-reader-writer/

### 参考

https://qiita.com/karadaharu/items/37403e6e82ae4417d1b3
https://www.rose-hulman.edu/class/cs/csse220/200910/Resources/Python_vs_Java.html
https://python.keicode.com/lang/oop-basics.php

### 謝辞

@shiracamus さんありがとうございます