Pythonのprintの多機能さ
C言語経由でPythonを学んでいます。
この記事は自分用のメモとしてつらつらと書いているものになります。
print関数がC言語のprintf関数とけっこう異なっているのでdocumentを読んでみました。
Documentの説明
print(*objects, sep=' ', end='\n', file=sys.stdout, flush=False)
objects
を sep
で区切りながらテキストストリーム file
に表示し、最後に end
を表示します。
sep
、 end
、 file
、 flush
を与える場合、キーワード引数として与える必要があります。
キーワードなしの引数はすべて、 str()
がするように文字列に変換され、 sep
で区切られながらストリームに書き出され、最後に end
が続きます。sep
と end
の両方とも、文字列でなければなりません。
これらを None
にすると、デフォルトの値が使われます。
objects が与えられなければ、 print()
は end
だけを書き出します。
file
引数は、 write(string)
メソッドを持つオブジェクトでなければなりません。
指定されないか、 None
である場合、 sys.stdout
が使われます。
表示される引数は全てテキスト文字列に変換されますから、 print()
はバイナリモードファイルオブジェクトには使用できません。代わりに file.write(...)
を使ってください。
出力がバッファ化されるかどうかは通常 file
で決まりますが、flush
キーワード引数が真ならストリームは強制的にフラッシュされます。
バージョン 3.3 で変更: キーワード引数 flush
が追加されました。
Pythonにおけるオブジェクト
file
引数は、write(string)
メソッドを持つオブジェクトでなければなりません。
C言語にはオブジェクトという考え方がないので、戸惑いました。
Pythonにおけるオブジェクトとは以下のような定義です。
object
(オブジェクト) 状態 (属性や値) と定義された振る舞い (メソッド) をもつ全てのデータ。もしくは、全ての 新スタイルクラス の究極の基底クラスのこと。
組み込み関数 — Python 3.9.4 ドキュメント
3. データモデル — Python 3.9.4 ドキュメント
file
引数は、write(string)
メソッドを持つオブジェクトでなければなりません。
というのは、write関数を持つクラスのインスタンスを指しているようです。
Pythonを理解するには、オブジェクトとはなにか、ということを毎回注目していけばいい感じに学習が進みそうという手応えを得ました。
リストを出力する際に使えるアンパックを使った書き方
ここらへんのテクニック的な書き方は、その都度、出会うたびに習得していくしかなさそうです。
アンパックとは、パックの逆なので、展開のことです。
引数がすでにリストやタプルになっていて、個別な位置引数を要求する関数呼び出しに渡すためにアンパックする必要がある場合には、逆の状況が起こります。
例えば、組み込み関数 range() は引数 start と stop を別に与える必要があります。
個別に引数を与えることができない場合、関数呼び出しを * 演算子を使って書き、リストやタプルから引数をアンパックします。
4. その他の制御フローツール — Python 3.9.4 ドキュメント
アンパックを使わない書き方
def writeNew(tl):
with open('newtext.txt', 'w') as f:
for i in tl:
f.write(f"{i}\n")
アンパックを使った書き方
def writeNew(tl):
with open('newtext.txt', 'w') as f:
print(*tl, file=f, sep='\n')