Pythonでprintfが使えないのはなぜ?C言語のprintfをprint・f文字列へ書き換える方法を解説

C言語関連

C言語を学んだあとにPythonを書き始めると、文字や数値を表示しようとして printf を使い、エラーになって戸惑うことがあります。これはPythonで画面表示ができないわけではなく、C言語とPythonでは出力に使う関数や書き方が異なるためです。

C言語では printf() を使うのが基本ですが、Pythonでは通常 print() を使います。また、C言語の %d%f に近い書式指定をしたい場合は、Pythonではf文字列(f-string)などを使うと分かりやすく書けます。

ここではC言語の printf に慣れている人向けに、Pythonではどのように書き換えればよいのかを、整数、小数、文字列、桁数指定、改行なし出力などの具体例とともに解説します。

PythonにはC言語と同じprintf関数はない

C言語では、標準出力へ文字列を表示するときに printf() を利用します。例えば次のようなコードです。

#include <stdio.h>

int main(void)
{
    printf("Hello\n");
    return 0;
}

一方、Pythonでは基本的に print() を使います。同じ内容なら次のように書けます。

print("Hello")

C言語のprintfをPythonでそのまま使うのではなく、まずprintfをprintへ置き換えると考えるのが基本です。

printfをそのまま書くとエラーになる理由

Pythonで次のように書くと、通常は printf という名前が定義されていないためエラーになります。

printf("Hello")

典型的には、NameError: name 'printf' is not defined のようなエラーになります。Pythonは printf という名前の関数を標準で用意していないからです。

これは文法ミスというより、「その名前の関数がPythonには存在しない」という問題です。次のように変更します。

print("Hello")

C言語の%dはPythonではどう書く?

C言語では整数を表示するとき、%d を使うことがよくあります。

int n = 10;
printf("%d\n", n);

Pythonでは、単純に値を表示するだけなら print() に変数を渡せば十分です。

n = 10
print(n)

「答えは10です」のように文字列と組み合わせる場合も、Pythonでは複数の書き方があります。

n = 10
print("答えは", n, "です")

ただし、現在のPythonでは後述するf文字列を使うと、より読みやすく書けることが多いです。

Pythonではf文字列を使うとprintfに近いことができる

Pythonで変数を文字列へ埋め込む場合、特に分かりやすいのがf文字列です。文字列の先頭に f を付け、表示したい値を {} の中へ書きます。

n = 10
print(f"答えは{n}です")

実行結果は次のようになります。

答えは10です

C言語の次のコードとほぼ同じ目的です。

printf("答えは%dです\n", n);

C言語からPythonへ移る場合は、printfの書式指定をそのまま移植するのではなく、f文字列で変数を埋め込むと考えると理解しやすくなります。

C言語とPythonの出力方法を比較

やりたいこと C言語 Python
文字を表示 printf("Hello\n"); print("Hello")
整数を表示 printf("%d\n", n); print(n)
文字列へ整数を埋め込む printf("n=%d\n", n); print(f"n={n}")
小数を表示 printf("%f\n", x); print(x)
小数点以下2桁 printf("%.2f\n", x); print(f"{x:.2f}")

このように、目的は同じでも文法が違います。C言語の構文をそのままPythonへコピーするのではなく、「このコードは何をしたいのか」を考えてPythonの書き方へ変換することが重要です。

小数点以下の桁数を指定する方法

C言語では %.2f のように書き、小数点以下の表示桁数を指定できます。

double x = 3.141592;
printf("%.2f\n", x);

この場合、表示結果は 3.14 です。Pythonではf文字列を使って次のように書けます。

x = 3.141592
print(f"{x:.2f}")

.2f は、小数点以下2桁の固定小数点形式で表示する指定です。3桁なら .3f とします。

print(f"{x:.3f}")

この場合は 3.142 と表示されます。

複数の変数を表示する場合

C言語では複数の値を一つの printf で表示できます。

int a = 10;
int b = 20;
printf("a=%d b=%d\n", a, b);

Pythonのf文字列では次のようになります。

a = 10
b = 20
print(f"a={a} b={b}")

値を増やしても、{変数名} を必要な場所へ置けばよいため、どの変数がどこへ表示されるか分かりやすい書き方です。

Pythonでも%を使った書式指定はできる

Pythonには、C言語の printf に似た % を使う古くからの文字列書式もあります。

n = 10
print("n=%d" % n)

小数なら次のように書けます。

x = 3.141592
print("%.2f" % x)

そのため、C言語の経験がある人には理解しやすい書き方です。ただし、新しくPythonを書く場合はf文字列のほうが読みやすいことが多いため、まずf文字列を覚えるとよいでしょう。

str.formatを使う方法もある

Pythonでは str.format() を利用した書式指定もできます。

name = "Taro"
age = 20
print("名前は{}、年齢は{}歳です".format(name, age))

これは次のf文字列と同じような結果になります。

print(f"名前は{name}、年齢は{age}歳です")

既存のPythonコードを読むと format() を使った書き方に出会うことがあるため、存在だけ知っておくとよいでしょう。

Pythonのprintは自動的に改行する

C言語の printf では、改行したければ通常 \n を自分で書きます。

printf("Hello\n");

Pythonの print() は、通常は最後に自動的に改行します。

print("Hello")
print("World")

結果は次のようになります。

Hello
World

そのため、Pythonでは毎回 \n を書く必要はありません。

Pythonで改行したくない場合はendを指定する

C言語では \n を書かなければ、そのまま次の出力を続けられます。

printf("Hello ");
printf("World");

Pythonでは print() が標準で改行するため、改行したくない場合は end を指定します。

print("Hello ", end="")
print("World")

結果は次のようになります。

Hello World

end="" は、「printの最後に何も付けない」という意味です。

複数の値の間に入る文字はsepで変更できる

Pythonの print() へ複数の値を渡すと、通常はスペースで区切って表示されます。

a = 10
b = 20
print(a, b)

結果は 10 20 です。区切り文字を変更したい場合は sep を使います。

print(a, b, sep=",")

この場合は 10,20 と表示されます。

CSVのような形式を簡単に表示したい場面では便利ですが、本格的にCSVファイルを扱う場合はPython標準の csv モジュールなどを利用するほうが安全です。

整数の桁をそろえる方法

C言語では %5d のような指定によって表示幅を設定できます。Pythonのf文字列でも同様の指定が可能です。

n = 42
print(f"{n:5d}")

この場合、5文字分の幅を使って整数が右寄せされます。

ゼロ埋めしたい場合は次のように書けます。

n = 42
print(f"{n:05d}")

結果は 00042 です。連番やIDなどを一定の桁数で表示したい場合に利用できます。

パーセント表示もf文字列で簡単にできる

割合をパーセントとして表示する場合もf文字列が便利です。

rate = 0.125
print(f"{rate:.1%}")

結果は 12.5% になります。

単純に値の後ろへ % を付けるだけではなく、0.125を12.5%へ変換する処理も含まれます。数値の書式指定を覚えると、C言語の printf と同じように細かな表示制御ができます。

入力についてもC言語とPythonでは書き方が違う

C言語をPythonへ書き換えるときは、出力だけでなく入力方法にも違いがあります。C言語では scanf が代表的です。

int n;
scanf("%d", &n);

Pythonでは基本的に input() を使います。ただし input() の結果は文字列なので、整数として利用したい場合は int() で変換します。

n = int(input())

入力した値をそのまま表示するなら次のようになります。

n = int(input())
print(n)

C言語のコードをPythonへそのまま翻訳しないことが大切

C言語とPythonには似た機能が多数ありますが、文法や設計思想は同じではありません。例えばC言語では変数の型を宣言しますが、Pythonでは通常 int n; のような宣言は行いません。

C言語なら次のように書く処理があります。

int a = 10;
int b = 20;
int sum = a + b;
printf("%d\n", sum);

Pythonでは次のように簡潔に書けます。

a = 10
b = 20
sum_value = a + b
print(sum_value)

セミコロンも通常は不要です。「C言語の命令を一語ずつPythonへ置き換える」のではなく、処理の目的をPythonの書き方で表現することがポイントです。

よくある間違い1|Printと大文字で書く

Pythonでは大文字と小文字が区別されます。そのため次のコードは print と同じ意味にはなりません。

Print("Hello")

正しくは小文字です。

print("Hello")

PRINTPrint も別の名前として扱われるため、初心者がエラーになったときはスペルと大文字・小文字を確認しましょう。

よくある間違い2|Python 2とPython 3の情報を混同する

古いWebページや教材を見ると、Pythonの出力が次のように書かれている場合があります。

print "Hello"

これは主に古いPython 2系の書き方です。現在一般的に利用されているPython 3では、print() を関数として使います。

print("Hello")

検索で見つけたコードを利用するときは、Python 2向けなのかPython 3向けなのかを確認することも重要です。

よくある間違い3|%dをprintへそのまま入れる

C言語の感覚で次のように書くと、期待した結果になりません。

n = 10
print("%d", n)

これは %d を自動的にnへ置き換える書き方ではなく、%d という文字列とnを別々の値として表示します。

f文字列を使うなら次のようにします。

print(f"{n}")

またはPythonの古い%書式を使うなら次のようにします。

print("%d" % n)

C言語の printf("%d", n) とPythonの print() では、引数の解釈方法が違うことを覚えておきましょう。

文字列と数値を+でつなぐとエラーになることがある

Pythonで次のように書くとエラーになります。

age = 20
print("年齢は" + age)

"年齢は" は文字列、age は整数なので、そのまま + で連結できないためです。

文字列へ変換するなら次のように書けます。

print("年齢は" + str(age))

ただし、f文字列を使えばより簡単です。

print(f"年齢は{age}")

C言語経験者向けprintfからprintへの置き換え早見表

C言語 Pythonでの書き方の例
printf("Hello\n"); print("Hello")
printf("%d\n", n); print(n)
printf("n=%d\n", n); print(f"n={n}")
printf("%.2f\n", x); print(f"{x:.2f}")
printf("%05d\n", n); print(f"{n:05d}")
printf("Hello"); print("Hello", end="")

最初はこの対応関係を見ながら書き換えれば十分です。慣れてくると、C言語を意識せずPythonらしい書き方ができるようになります。

Pythonではprintfを作る必要はある?

技術的には自分で printf という名前の関数を作ることはできますが、通常のPythonプログラムでそのようにする必要はありません。

例えば独自関数として printf を定義すること自体は可能ですが、他のPython利用者から見ると「なぜ標準のprintを使わないのか」が分かりにくくなることがあります。

学習段階では特に、Python標準の print() とf文字列を覚えたほうが、その後ほかのPythonコードも読みやすくなります。

エラーが出たときはメッセージを確認する

「printfができない」と感じた場合でも、実際には別の部分でエラーが発生していることがあります。Pythonではエラーメッセージの最後の数行を見ると、原因の手掛かりを得られます。

NameError なら存在しない名前を使っていないか、SyntaxError なら括弧や引用符などの文法に問題がないか、TypeError なら異なる型を不適切に組み合わせていないかを確認します。

質問サイトなどで相談するときも、「printfができません」だけではなく、実際に書いたコードと表示されたエラー全文を示すと、原因を特定しやすくなります。

まとめ|Pythonではprintfではなくprintとf文字列を使う

C言語で使う printf() は、Pythonでは標準の出力関数としてそのまま利用できません。Pythonで文字や数値を表示するときは基本的に print() を使います。

C言語の printf("%d", n) に相当する処理なら、単純な表示は print(n)、文章へ値を埋め込む場合は print(f"n={n}") のようなf文字列が分かりやすい書き方です。小数点以下2桁なら print(f"{x:.2f}") のように書式も指定できます。

C言語からPythonへ移るときは「printfをどう動かすか」ではなく、「printfでしていた処理をPythonではprintとf文字列でどう表すか」と考えることがポイントです。

また、Pythonの print() は自動で改行する、型宣言やセミコロンが通常不要など、C言語とはさまざまな違いがあります。C言語のコードをそのまま移植するのではなく、処理の意味を理解してPythonの文法へ置き換えていくと、よりスムーズに学習できます。

コメント

タイトルとURLをコピーしました