意外と知られていない！？組み込み関数の引数について 彼女は？出身校は？【Python】

## 本記事の概要

Pythonの組み込み関数において、個人的にあまり知られていなさそうに感じる引数や無駄に指定してる引数を紹介します。

Pythonに彼女や出身校など存在しません。

## 動作環境

CPython 3.8.1

## range

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#func-range

公式曰く「厳密に言うとrangeは関数ではなくイミュータブルなシーケンス型」らしいのですが、関数一覧の表に居るので関数という扱いをさせていただきます。

### step

range関数はよく`range(start, stop)`と書かれますが、step引数が存在しています。

デフォルトだと1が設定されています。

使い所は奇数だけや偶数だけが欲しい場合などです。

```py
>>> for i in range(1, 10, 2):
...     print(i)
...
1
3
5
7
9
>>>
```

## print

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#print

誰しもが使ったことのある関数ですね。出力してくれます。

### sep

デフォルトだと半角スペース1個が設定されています

`print(1, 2, 3)`と複数のオブジェクトを引数に渡した場合に分けてくれる文字を指定出来ます。

printするだけのために`"{任意の文字列}".join()`と打たずに済みます。

```py
>>> print("樋口", "相羽")
樋口 相羽
>>> print("樋口", "相羽", sep="と")
樋口と相羽
>>>
```

### end

デフォルトだと\nが設定されています

C言語等で`printf`を使うときに最後に\nと書きますが、書かなくて良いようにしてくれています。

使い所はほぼ無い気がします。使ったことがないけど知っている。

```py
>>> print("樋口楓")
樋口楓
>>> print("樋口楓", end="さん")
樋口楓さん>>>
```

### file

デフォルトだとsys.stdoutが設定されています。

ファイルなどのストリームを指定することで指定先に出力されます。

使い所は簡単なログでしょうか。loggingモジュールを使えと全方位に怒られます。何かしらのstdout.write()にしても良い気がします。違いがわからない。

```py
>>> with open("hoge.txt", "w") as f:
...     print("ういはろー", file=f)
...
>>> with open("hoge.txt") as f:
...     print(f.read())
...
ういはろー

>>>
```

ここでendを使うと良かったりしますね。使い所がありました。

### flush

デフォルトだとFalseが設定されています。

sys.stdoutはされないのですが他の場所に出力するときは大体バッファ化されるらしいです。あまり詳しくわかっていません。

使い所はfile引数で別のストリームを指定したときにflushを毎回する時ですかね。

通常f.close()したタイミングでバッファがflushされて書き込まれますが、flush=Trueにするとprintを実行したタイミングで書き込まれています。

```py
>>> f = open("fuga.txt", "w")
>>> print("でろーんでろーんこんでろーん", file=f, flush=True)
>>> f.close()
>>>
```

## enumerate

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#enumerate

listなどのiterableなオブジェクトをforで回したときにindexを一緒に返してくれる関数です。

### start

デフォルトだと0が設定されています。

使い所はindexを任意の数から始めたい時です。毎回indexを+ 1してる方にオススメです。

```py
>>> for index, item in enumerate(["樋口", "相羽", "鈴鹿", "赤羽", "郡道", "夢月"], start=1):
...     print(index, item)
...
1 樋口
2 相羽
3 鈴鹿
4 赤羽
5 郡道
6 夢月
>>>
```

## min, max

公式ドキュメント(min): https://docs.python.org/ja/3/library/functions.html#min
公式ドキュメント(max): https://docs.python.org/ja/3/library/functions.html#max

最大値や最小値を取得したい時に使います。

### key

デフォルトだとNoneが設定されています。

minやmaxで何をkey比較するかを指定出来ます。

使い所はdictのvalueを比較したいときなどです。

```py
>>> d = {"a": 100, "b": 50, "c": 10}
>>> max(d)
'c'
>>> max(d, key=d.get)
'a'
>>> min(d)
'a'
>>> min(d, key=d.get)
'c'
>>>
```

## open

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#open

ファイルを開く時に使います。

### mode

デフォルトだとrが設定されています。

全員使ったことあると思います。無駄に指定されている引数ランキングナンバー1の引数です。

`open(file, "r")`と書かれていると指定しなくてもいいのに…と思ってしまいます。

## pow

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#pow

べき乗を計算してくれます。

### mod

デフォルトだとNoneが設定されています。

{第1引数}の{第2引数}乗からmodで指定した数で割った余りを返してくれます。

使い所は大きな計算をする時ですかね。

```py
>>> pow(5, 5, 10)
5
>>>
```

## round

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#round

小数を丸めたい時に使います。

### ndigits

デフォルトだとNoneに設定されています。

小数点以下を任意の桁数に指定出来ます。

```py
>>> round(1.3333333333, 2)
1.33
>>>
```

## sum

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#sum

iterableオブジェクトの中が全てint型であれば合計を計算できます。

### start

デフォルトだと0が設定されています。

任意の数から数え上げられます。

使い所はわかりません。

```py
>>> sum([1, 2, 3, 4, 5], start=10)
25
>>>
```

小ネタなんですけど、中が全てstr型でstartもstr型を指定するとTypeErrorが出ますが代わりに`''.join(seq)`を使いな！ってメッセージで教えてくれます。

こんな優しいエラーメッセージを今までに見たことがない。

```py
>>> sum(["b", "c", "d"], start="a")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sum() can't sum strings [use ''.join(seq) instead]
>>>
```

## type

公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#type

このオブジェクトの型なんだっけな〜ってときに使いますね。

### bases, dict

デフォルトは存在しません。

~~クラスのような物が作れます。~~

**追記([コメント](https://qiita.com/chun37/items/989bb828d9ec7f1c8686#comment-5394465c19b861799425)より):**
**class構文で定義したものはクラスオブジェクトが作成され、type関数でもクラスオブジェクトが作成出来ます。**

basesで継承するクラスをtupleで指定し、dictでインスタンス変数を指定する必要があります。

使い所はこれといって無さそうです。何か縛りプレイをする時に使えそう？

```py
>>> x = type("abc", (), dict(a=1, b=2, c=3))
>>> x
<class '__main__.abc'>
>>>
```

## 番外編: random.choices

公式ドキュメント: https://docs.python.org/ja/3/library/random.html#random.choices

第1引数に渡されたスライス可能なオブジェクト(str型、シーケンス型)を受け取り、ランダムで選択して返す関数です。

### k

デフォルトだと1が設定されています。

ランダムで選択する個数が選べます。ランダムな文字列を生成する時に、`"".join([random.choice(string.ascii_letters) for i in range(10)])`と書く必要性が無くなります。

```py
>>> import random
>>> import string
>>> random.choices(string.ascii_letters, k=10)
['C', 'H', 'I', 'O', 'a', 'G', 's', 'E', 'f', 'c']
>>>
```

## まとめ

いかがでしたか？(殴

こんな感じで組み込み関数だけでもかなりの数のあまり使用されていない引数があります。

公式ドキュメントを読むことで色々な(全てが必要ではない)知識が得られます。

引数を知っているから強い、知らないから弱い、というわけではないですが知識量が多いと何かしらで得をすることがあるので知ってて損は無いと思います。

自分もまだ未熟なので文中の説明で間違っている部分等ありましたら遠慮なく指摘していただけると嬉しいです。