Pythonで競プロするときの知識メモ1（標準入出力）

## 1. はじめに
Python[^1]でAtCoderを始めたので、覚えておきたいと思ったことをメモしていきます。
基本的には自分用ですが、Pythonで競プロを始める方の参考になればという気持ちも少しだけあります。

今回は標準入出力についてです。

## 2. 標準入力
Pythonの標準入力には[input関数](https://docs.python.org/ja/3.11/library/functions.html#input)を使います。
数値の受け取りには[int関数](https://docs.python.org/ja/3.11/library/functions.html#int)や[float関数](https://docs.python.org/ja/3.11/library/functions.html#float)を使います。

入力内容によっては、[split関数](https://docs.python.org/ja/3.11/library/stdtypes.html#str.split)や[map関数](https://docs.python.org/ja/3.11/library/functions.html#map)、[list関数](https://docs.python.org/ja/3.11/library/functions.html#func-list)を使うこともあります。

### 2-1. 1行の入力を受け取る例
#### （1）1つの値を受け取る
##### 文字列を受け取る場合
```
<入力>
abcde

<受け取り方>
s = input()

<変数の中身>
s: "abcde"  # input()で受け取った結果は文字列になる
```

##### 数値を受け取る場合
```
<入力>
2024

<受け取り方>
n = int(input())

# 入力をinput()で文字列として受け取り、int()で整数に変換
# 入力が小数の場合、int()ではなくfloat()を使う
# 整数をfloatで受け取ると、小数になるので注意（例：1をfloatで受け取ると、1.0となる）

<変数の中身>
n: 2024
```

#### （2）複数の値を受け取る
##### 1行で複数の文字列を受け取る場合
```
<入力>
abcde fgh

<受け取り方>
s, t = input().split()

# input()で受け取った結果は "abcde fgh"という半角空白を含む1つの文字列となる
# 引数なしのsplit()によって、半角空白で区切った文字列のリスト["abcde", "fgh"]に変換する

<変数の中身>
s: "abcde"
t: "fgh"
```

##### 1行で複数の整数を受け取る
```
<入力>
2024 2025

<受け取り方>
n, m = map(int, input().split())

# split()で区切った文字列["2024", "2025"]のそれぞれの要素をmap()でint型に変換する

<変数の中身>
n: 2024
m: 2025
```

### 2-2. 複数行の入力を受け取る例
#### （1）別の変数で受け取る
```
<入力>
abcde
2024 2025

<受け取り方>
s = input()
n, m = map(int, input().split())

# input()が返す値には末尾の改行は含まれない

<変数の中身>
s: "abcde"
n: 2024
m: 2025
```

#### （2）1つの配列として受け取る
```
<入力>
1
2
3
4
5

<受け取り方>
A = []
for _ in range(5):
  a = int(input())
  A.append(a)

# 上記は1行で書くこともできる
A = [int(input()) for _ in range(5)]

<変数の中身>
A: [1, 2, 3, 4, 5]
```

#### （3）行列を2次元配列として受け取る
```
<入力>
1 2 3
4 5 6
7 8 9

<受け取り方>
A = []
for _ in range(3):
  a = list(map(int, input().split()))
  A.append(a)

# 上記は1行で書くこともできる
A = [list(map(int, input().split())) for _ in range(3)]

<変数の中身>
A: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
```

## 3. 標準出力
Pythonの標準出力には[print関数](https://docs.python.org/ja/3.11/library/functions.html#print)を使います。
出力したい形式によっては、[配列のアンパック](https://qiita.com/dossy/items/c413632d657746f31d2b)や[join関数](https://docs.python.org/ja/3.11/library/stdtypes.html#str.join)を使うこともあります。

### 3-1. 1行だけ出力する例
#### （1）1つの値を出力する
##### 文字列を出力する場合
```
<変数>
a = "abcde"

<出力方法>
print(a)

<出力結果>
abcde
```

##### 数値を出力する場合
```
<変数>
a = 2024

<出力方法>
print(a)

<出力結果>
2024
```

#### （2）複数の値を出力する
##### 複数の値をprint関数に渡す場合
```
<変数>
a = 2024
b = 2025

<出力方法>
print(a, b)

<出力結果>
2024 2025
```

##### 配列の要素を半角空白区切りの文字列で出力する場合
```
<変数>
a = [1, 2, 3, 4, 5]

<出力方法>
print(*a)

# 配列のアンパック

<出力結果>
1 2 3 4 5
```

##### 配列の要素を連結して1つの文字列として出力する場合
```
<変数>
a = ["A", "B", "C", "D", "E"]

<出力方法>
print("".join(a))

# 配列内の要素が文字列じゃないと実行時エラーになる
TypeError: sequence item 0: expected str instance, int found

<出力結果>
ABCDE
```


### 3-2. 複数行を出力する例
ケースとしては、配列内の要素を1行ずつ出力する場合だけかと思います。
for文を使って、要素を1つずつ出力していきます。

```
<変数>
a = ["A", "B", "C", "D", "E"]

<出力方法>
for i in range(len(a)):
  print(a[i])

# print()は出力結果の末尾に改行文字も出力するため、改行については気にしなくていい

<出力結果>
A
B
C
D
E
```

以上です。
最後まで読んでいただきありがとうございました。

## 参考資料
* [Pythonドキュメント](https://docs.python.org/ja/3.11/library/intro.html)
* [アルゴリズム実技検定 公式テキスト エントリー ~ 中級編](https://www.amazon.co.jp/%E3%82%A2%E3%83%AB%E3%82%B4%E3%83%AA%E3%82%BA%E3%83%A0%E5%AE%9F%E6%8A%80%E6%A4%9C%E5%AE%9A-%E5%85%AC%E5%BC%8F%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88-%E3%82%A8%E3%83%B3%E3%83%88%E3%83%AA%E3%83%BC-%E4%B8%AD%E7%B4%9A%E7%B7%A8-Compass-Books%E3%82%B7%E3%83%AA%E3%83%BC%E3%82%BA/dp/483997277X)
* [Python3の標準入力やり方まとめ](https://qiita.com/yasu_teco/items/e8db933ac4f647166996)
* [listの展開(アンパック)](https://qiita.com/dossy/items/c413632d657746f31d2b)

[^1]: 投稿日時点で使用しているPythonのバージョンは`3.11.9`です。