📚
ABC329A - Spreadを題材にアスタリスク演算子とstr.join() メソッドについて解説する試み
本記事の目標
- ABC329A - Spreadを題材にアスタリスク演算子とstr.join() メソッドの自分なりの理解を披露すること。
- より具体的には、該当の問題に対して2つの解き方を提示し、それぞれの解き方で活用されているpythonの機能(アスタリスク演算子とstr.join())を解説すること。
問題
英大文字からなる文字列 S が与えられます。S の各文字を空白で区切り、その順で 1 文字ずつ出力してください。
という問題。要するに、
- 入力:
ABC→ 出力:A B C
という形で出力すればいい。この問題をpython3で解いていく。
ACコード1
アスタリスク演算子(アンバック演算子)を使う方法
s = input()
print(*s)
ACコード2
str.join() メソッドを使う方法
s = input()
print(" ".join(s))
ACコード1についての解説
*sというアスタリスク演算子は結論から言えば、sの中身をバラバラにして返すということである。もっと詳しく言えば、sの各要素を個別の引数として展開しているということだ。たとえば次のようなコードがあったとき、
S = "ABC"
print(*S) # A B C
のprint(*S)はprint('A', 'B', 'C')と同じ意味になる。また、print()関数は複数の引数を受け取ると、デフォルトでスペースを区切って返す。(補足1参照)またアスタリスク演算子はイテラブルの要素ならなんでも使える。(イテラブルについては補足2参照)
補足1printのsepバラメータについて
sep=区切り文字のこと。要素と要素の間を区切っている。区切るとは要素の間に特定の文字を入れることをここではさす。
以下のような形になる
# デフォルトでは sep=' ' (空白)
print('A', 'B', 'C')
# 出力: A B C
# 意味: A と B の間、B と C の間に空白を挟む
# sep を変更する
print('A', 'B', 'C', sep='-')
# 出力: A-B-C
# 意味: A と B の間、B と C の間に '-' を挟む
print('A', 'B', 'C', sep='')
# 出力: ABC
# 意味: 何も挟まない(区切りなし)
print('A', 'B', 'C', sep=', ')
# 出力: A, B, C
# 意味: A と B の間、B と C の間に ', ' を挟む
補足2 イテラブルについて
イテラブル (iterable) とは、「要素を1つずつ取り出せるオブジェクト」のことであり、それは「イテラブル」が英語の "iterate"(繰り返す、反復する)から来ていることからもわかる。
おもなpythonのイテラブル
# 文字列
S = "ABC" # 'A', 'B', 'C' を1つずつ取り出せる
# リスト
L = [1, 2, 3] # 1, 2, 3 を1つずつ取り出せる
# タプル
T = (10, 20, 30) # 10, 20, 30 を1つずつ取り出せる
# 辞書
D = {'a': 1, 'b': 2} # 'a', 'b' を1つずつ取り出せる
# range
R = range(5) # 0, 1, 2, 3, 4 を1つずつ取り出せる
公式ドキュメント
ACコード2についての解説
join()は文字列のメソッドでイテラブルの要素を結合する。構文としては"区切り文字".join(イテラブル)だ。
例えば、下のようなコードの場合
S = "ABC"
print(" ".join(S)) # A B C
" ".join(S)は、Sの各文字を空白で連結した新しい文字列を作る。つまり、内部的には、
"A" + " " + "B" + " " + "C" → "A B C"
結果として一つの文字列を返す。なお、ACコード1との違いは一つの文字列にするという違いがある
おわりに
間違いなどあると思いますのであればコメントお願いします。
Discussion