Pythonの文字列フォーマットでタプルをそのまま出力する方法
Pythonの旧式の文字列フォーマット(「%」演算子を使用する形式)では、パーセント記号の後に渡したオブジェクトがタプルである場合、Pythonはそれを自動的に分解し、個々の要素をフォーマット文字列へ渡そうとします。この仕様が原因で、意図しないエラーが発生することがあります。
問題:タプルをそのまま渡すとエラーになる
まず、次のようなコードを見てみましょう。
tup = (1, 2, 3)
print("this is a tuple %s" % (tup))
このコードを実行すると、以下のエラーが発生します。
TypeError: not all arguments converted during string formatting
これは前述の仕様によるものです。Pythonはタプル(1, 2, 3)を3つの独立した引数として解釈しようとしますが、フォーマット文字列側にはプレースホルダー「%s」が1つしかないため、「変換されなかった引数がある」というエラーが出力されます。
解決策:タプルを別のタプルで包む
タプル全体を1つの値として渡したい場合は、(tup, )という構文を使って、対象のタプルをさらに別のタプルで包みます。
tup = (1, 2, 3)
print("this is a tuple %s" % (tup, ))
実行すると、期待どおりの出力が得られます。
this is a tuple (1, 2, 3)
なぜ「(tup, )」と書くのか
(tup,)という表記は、要素が1つだけのタプルを、単なる括弧で囲んだ式と区別するために必要です。Pythonでは(tup)はtupとまったく同じ意味になりますが、末尾にカンマを付けた(tup,)は明確に「1要素のタプル」として扱われます。その結果、内側のタプルが分解されることなく、中身がそのまま文字列に埋め込まれます。
なお、現代のPythonではf文字列やstr.format()メソッドを使うことで、このような落とし穴を避けられます。例えばf文字列ならf"this is a tuple {tup}"と書くだけで、タプルがそのまま展開されます。ただし、レガシーコードの保守などで「%」形式を使う場面では、今回の(tup,)のテクニックを覚えておくと便利です。
-
Pythonで文字列をint・floatに変換する方法をわかりやすく解説
Pythonでは、ユーザー入力やファイル読み込みなどで取得した数値は、多くの場合文字列(str型)として扱われます。そのままでは計算に使えないため、int() や float() を使って数値型へ変換(パース)する必要があります。ここでは、変換に失敗した場合に備えた例外処理(try-except)を組み合わせた、安全な変換方法を紹介します。文字列をint(整数)に変換する整数を表す文字列をint型に変換するには、int() 関数を使用します。変換できない文字列が渡されると ValueError が発生するため、try-exceptで捕捉しておくと安心です。try: &nb
-
Pythonで文字列が小文字のみで構成されているか判定する2つの方法
Pythonでは、文字列がすべて小文字で構成されているかどうかを簡単に判定できます。主な方法は2つあり、1つ目は文字列メソッドの islower() を使う方法、2つ目は正規表現を使う方法です。それぞれの特徴と違いを見ていきましょう。 方法1:islower() メソッドを使う islower() は、文字列内の英字がすべて小文字である場合に True を返します。数字やスペースなどの英字以外の文字は判定の対象外となる点に注意してください。 print(Hello world.islower()) print(hello world.islower()) 出力: False True