C#er向けPython覚え書き


C#erがpythonを書くにあたっての覚え書きです。正確性を欠いている可能性あるので詳細は公式を参照してください。

所々で[公式のリファレンスマニュアル](https://docs.python.org/ja/3/reference/index.html)へのリンクを貼っていますが、まずは[公式のチュートリアル](https://docs.python.org/ja/3/tutorial/index.html)のほうを見たほうがとっつきやすいです。

# 機能関連

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

## ファイル操作

|  やりたいこと | コード | 説明・リンク等  |
|---|---|---|
| テキストモードで開く(読み取り専用)  | [`open(path, 'r')`](https://docs.python.org/ja/3/library/functions.html#open) [^1] | |
| UTF-8と見なして開く(読み取り専用)  | `open(path, 'r', 'utf-8')`| [エンコード指定](https://docs.python.org/ja/3/library/codecs.html#standard-encodings) |
| Shift_JISと見なして開く(読み取り専用)  | `open(path, 'r', 'shift_jis')`| |
| テキストモードで開く(書き込み専用)  | `open(path, 'w')`[^1] | |
| バイナリモードで開く(読み取り専用)  | `open(path, 'rb')`| |
| バイナリモードで開く(書き込み専用)  | `open(path, 'wb')`| |

[^1]: （公式より抜粋）： デフォルトエンコーディングはプラットフォーム依存 (locale.getencoding() が返すもの) です

> open() 関数が返す file object の型はモードに依存します。

https://www.javadrive.jp/python/file/index4.html

## 型変換

|  やりたいこと | コード | 説明・リンク等  |
|---|---|---|
| 小数や文字列を整数型に変換する | [`int(...)`](https://docs.python.org/ja/3/library/functions.html#int) |  |
| 浮動小数点数に変換する | [`float(...)`](https://docs.python.org/ja/3/library/functions.html#float) |  |
| 文字列に変換する | [`str(...)`](https://docs.python.org/ja/3/library/functions.html#func-str) |  |

## バイナリと型との変換

pack, unpack

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

## コンソール出力

|  やりたいこと | コード | 説明・リンク等  |
|---|---|---|
| コンソールに出力する(改行つき) | [`print(...)`](https://docs.python.org/ja/3/library/functions.html#print) | カンマで区切って複数指定可能。`print(..., end='')`のようにすると改行をなくせる |

## コマンドライン引数

```python
import sys
for s in sys.argv:
    print(s)
```

https://docs.python.org/ja/3/library/sys.html#sys.argv

> argv[0] はスクリプトの名前となりますが、フルパス名かどうかは、OSによって異なります。コマンドライン引数に -c を付けて Pythonを起動した場合、 argv[0] は文字列 '-c' となります。スクリプト名なしでPythonを起動した場合、 argv[0] は空文字列になります。

# 文法関連

## コーディングスタイル

https://pep8-ja.readthedocs.io/ja/latest/

インデントが構造と対応します。（インデントが崩れると構文解析エラー(?)になったり、意図しないプログラムになる恐れがあります。）

## 関数

```python

def 関数名(引数,...):
    ...
    return 戻り値

```

`return` は無くてもよい。



## 制御構文

行末のコロンを忘れずに。

| | C# | Python | 補足 |
|---|---|---|---|
|条件分岐 | `if(条件式)` | `if 条件式:` | `else if`はPythonでは`elif` |
|要素列挙してループ | `foreach(型名 変数 in リスト)` | [`for 変数 in リスト:`](https://docs.python.org/ja/3/reference/compound_stmts.html#the-for-statement) | |
|整数を0,1,...,n-1 | `for(i=0;i<n;i++)` | `for i in`[`range(n):`](https://docs.python.org/ja/3/library/functions.html#func-range) | 要素数を得るには [`len(対象)`](https://docs.python.org/ja/3/library/functions.html#len) |
|繰り返し | `while(条件式)` | [`while 条件式:`](https://docs.python.org/ja/3/reference/compound_stmts.html#the-while-statement) | `do while`にあたるものは無さそう |

`for`や`while`の中などで処理をしたくないときは、[`pass`文](https://docs.python.org/ja/3/tutorial/controlflow.html#pass-statements)が使える。

```py
# 無限ループの例
while True:
    pass
```

## 例外処理構文

| C# | Python | 補足 |
|---|---|---|
|`try`|`try`| |
|`catch`|`except`| |
|`finally`|`finally`| |
|(なし)|`else`|例外が発生しなかったときに実行される |

```
try:
    ～～～
except ValueError:
    ～～～
else:
    ～～～
finally:
    ～～～
```

https://docs.python.org/ja/3/library/exceptions.html
https://docs.python.org/ja/3/tutorial/errors.html

## 定数

|  | C# | Python | 補足 |
|---|---|---|---|
| null | `null` | `None` |  |
| 真 | `true` | `True`   |  |
| 偽 | `false` | `False`   |  |

## 演算子

|  | C# | Python | 補足 |
|---|---|---|---|
| 整数除算 | `整数/整数` | `整数//整数` |  |
| 論理積 | a`&&`b | a `and` b   |  |
| 論理和 | a`\|\|`b | a `or` b   |  |
| 論理否定 | `!`a | `not` a   |  |

比較演算子を a`<`x`&&`x`<`b の代わりに a`<`x`<`b と書くことができる

https://qiita.com/tag1216/items/de47009599cf592a222d

## グローバル変数の使用

JavaScriptのノリで書くと、思った動きにならないので注意。<strike>C#erどこいった</strike>

ざっくり：
関数内から外側の変数にアクセスしたい場合は、関数内で`global`を付けて変数宣言する必要がある。付けないとローカル変数扱いになるよう。

ただ、割とややこしい挙動をするらしい・・

https://qiita.com/search?sort=&q=python+global



## 予約語

[キーワード - docs.python.org](https://docs.python.org/ja/3/reference/lexical_analysis.html#keywords)

[組み込み関数名 - docs.python.org](https://docs.python.org/ja/3/library/functions.html)や、よく使うライブラリの名称も避けたほうが無難。