本記事の概要
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が設定されています。
使い所は奇数だけや偶数だけが欲しい場合などです。
>>> for i in range(1, 10, 2):
... print(i)
...
1
3
5
7
9
>>>
公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#print
誰しもが使ったことのある関数ですね。出力してくれます。
sep
デフォルトだと半角スペース1個が設定されています
print(1, 2, 3)
と複数のオブジェクトを引数に渡した場合に分けてくれる文字を指定出来ます。
printするだけのために"{任意の文字列}".join()
と打たずに済みます。
>>> print("樋口", "相羽")
樋口 相羽
>>> print("樋口", "相羽", sep="と")
樋口と相羽
>>>
end
デフォルトだと\nが設定されています
C言語等でprintf
を使うときに最後に\nと書きますが、書かなくて良いようにしてくれています。
使い所はほぼ無い気がします。使ったことがないけど知っている。
>>> print("樋口楓")
樋口楓
>>> print("樋口楓", end="さん")
樋口楓さん>>>
file
デフォルトだとsys.stdoutが設定されています。
ファイルなどのストリームを指定することで指定先に出力されます。
使い所は簡単なログでしょうか。loggingモジュールを使えと全方位に怒られます。何かしらのstdout.write()にしても良い気がします。違いがわからない。
>>> 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を実行したタイミングで書き込まれています。
>>> 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してる方にオススメです。
>>> 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を比較したいときなどです。
>>> 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で指定した数で割った余りを返してくれます。
使い所は大きな計算をする時ですかね。
>>> pow(5, 5, 10)
5
>>>
round
公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#round
小数を丸めたい時に使います。
ndigits
デフォルトだとNoneに設定されています。
小数点以下を任意の桁数に指定出来ます。
>>> round(1.3333333333, 2)
1.33
>>>
sum
公式ドキュメント: https://docs.python.org/ja/3/library/functions.html#sum
iterableオブジェクトの中が全てint型であれば合計を計算できます。
start
デフォルトだと0が設定されています。
任意の数から数え上げられます。
使い所はわかりません。
>>> sum([1, 2, 3, 4, 5], start=10)
25
>>>
小ネタなんですけど、中が全てstr型でstartもstr型を指定するとTypeErrorが出ますが代わりに''.join(seq)
を使いな!ってメッセージで教えてくれます。
こんな優しいエラーメッセージを今までに見たことがない。
>>> 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
デフォルトは存在しません。
クラスのような物が作れます。
追記(コメントより):
class構文で定義したものはクラスオブジェクトが作成され、type関数でもクラスオブジェクトが作成出来ます。
basesで継承するクラスをtupleで指定し、dictでインスタンス変数を指定する必要があります。
使い所はこれといって無さそうです。何か縛りプレイをする時に使えそう?
>>> 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)])
と書く必要性が無くなります。
>>> import random
>>> import string
>>> random.choices(string.ascii_letters, k=10)
['C', 'H', 'I', 'O', 'a', 'G', 's', 'E', 'f', 'c']
>>>
まとめ
いかがでしたか?(殴
こんな感じで組み込み関数だけでもかなりの数のあまり使用されていない引数があります。
公式ドキュメントを読むことで色々な(全てが必要ではない)知識が得られます。
引数を知っているから強い、知らないから弱い、というわけではないですが知識量が多いと何かしらで得をすることがあるので知ってて損は無いと思います。
自分もまだ未熟なので文中の説明で間違っている部分等ありましたら遠慮なく指摘していただけると嬉しいです。