仮の宿 学習室

クラウド・AI・Python CLOUD / AI / PYTHON

Pythonの型と文字列

講義 3 本・確認問題 30 問 | 本試験では「Python3基礎」(0問)の一部 | 最終更新 2026-09-24

この章で学ぶこと
目次
  1. 試験の全体像と、Pythonを動かす最初の一歩
  2. 数値を正確に扱う - 除算・切り捨て・浮動小数点
  3. 文字列を切る・つなぐ・整える
  4. 確認問題(30問)
  5. 演習ツール

1. 試験の全体像と、Pythonを動かす最初の一歩

この試験が何を主教材にし、どの章を厚く問うのかが分かります。あわせて、インタープリタの動かし方、print の sep と end、コメントとインデントという、以降ずっと使い続ける土台を固めます。

Python 3 エンジニア認定基礎試験は、一般社団法人Pythonエンジニア育成推進協会が実施する、Pythonの文法基礎を問う試験です。いちばん大事な性質は、出題範囲が特定の1冊の本に紐づいていることです。主教材はオライリー・ジャパンの『Pythonチュートリアル 第4版』で、協会の公式ページには、どの章から何問出るかまで公開されています。つまりこの試験は「Pythonの何でも屋になれ」という試験ではなく、「この本の内容を、章ごとの重みに沿って正確に読めるか」を見る試験です。だから対策も、範囲外のライブラリに手を伸ばすのではなく、本に書いてある挙動を実際に動かして確かめる方向に振るのが正解になります。

章別の配分を見ると、力の入れどころははっきりしています。最も多いのは4章「制御構造ツール」で9問、割合にして22.5パーセントです。次が5章「データ構造」の7問、17.5パーセント。その次が3章「気楽な入門編」の6問、15.0パーセントです。この3つだけで22問、全体の55パーセントを占めます。さらに8章「エラーと例外」と10章「標準ライブラリめぐり」が各4問で、合わせて8問、20パーセント。逆に13章「次はなに?」は0問で、ここからは1問も出ません。6章と9章が各2問、残りの1章・2章・7章・11章・12章・14章は各1問です。数え上げると合計40問になります。この配分は公式が公開している出題範囲そのものなので、学習時間の割り振りにそのまま使えます。

本ラボのこのブロックが扱うのは、1章・2章・3章にあたる部分です。問題数でいえば1章と2章が各1問、3章が6問で計8問と、決して多くはありません。しかし3章で登場する数値と文字列の扱いは、4章以降のすべての問題の土台になります。for文の問題であってもループの中で文字列を切り出しますし、例外の問題であっても int() の失敗を題材にします。ここを曖昧にしたまま先に進むと、後半で「何を間違えたのか分からない」という状態に陥ります。配点の少なさに惑わされず、確実に固めてください。

1章と2章は、Pythonを実際に起動して使う話です。端末で python3 とだけ打つと対話モード(インタラクティブモード)に入り、プロンプト記号のあとに式を打つと、その場で評価されて結果が表示されます。抜けるときは exit() または quit() を呼ぶか、UnixならCtrl-D、WindowsならCtrl-Zに続けてEnterを押します。書いたプログラムをファイルにまとめたときは python3 ファイル名.py で実行します。短い1行だけを試したいなら python3 -c "print(1+2)" のように -c オプションにコードを渡す方法もあります。実行中のスクリプトに渡された引数は sys.argv というリストに入り、その先頭 sys.argv[0] はスクリプト名そのものです。ソースファイルの文字コードは既定でUTF-8なので、コメントにも文字列にも日本語をそのまま書けます。Python 2 では既定がASCIIで、日本語を含めるにはファイル先頭に coding 宣言が必要でしたが、Python 3 では不要になりました。

画面に出す道具が print() です。print() は引数をいくつでも受け取り、それらを区切り文字でつないで並べ、最後に終端文字を付けて出力します。区切り文字はキーワード引数 sep で指定し、既定は半角空白1つです。終端文字はキーワード引数 end で指定し、既定は改行文字です。ここで押さえるべきなのは、sep が入るのは引数と引数の「あいだ」だけで、先頭や末尾には付かないという点です。逆に end は必ず末尾に付きます。print('a','b','c') なら a b c と出て改行されますが、sep を空文字列にすれば abc と詰まり、end を空文字列にすれば改行されないので次の print の出力が同じ行に続きます。リストの中身を並べたいときは print(*nums) のようにアスタリスクで展開すると、要素が個別の引数として渡されるため sep の効果を受けます。print(nums) と書くとリストが1つの引数として渡され、角括弧の付いた表現がそのまま出ます。

コメントはシャープ記号で書きます。行の先頭に置けばその行全体が、途中に置けばそれ以降が行末まで無視されます。複数行をまとめてコメントにする専用の構文はなく、行ごとにシャープを置くのが基本です。三重引用符で囲んだ文字列を「ブロックコメントの代わり」に使う書き方もありますが、あれは文法上は文字列リテラルであって、コメントではありません。関数やクラスの先頭に置いた場合は docstring として扱われ、実行時にオブジェクトに保持されます。なお、文字列リテラルの中にシャープが現れてもコメントにはなりません。あくまでコードとして解釈されている位置にあるシャープだけが対象です。

Pythonが他の多くの言語と大きく違うのは、ブロックを波括弧ではなくインデント(字下げ)で表す点です。if や for や def の行はコロンで終わり、その次の行から一段深くした部分がブロックになります。同じブロックに属する文は、字下げ幅をそろえなければなりません。ここが崩れると IndentationError になります。字下げが必要な場所で字下げしなければ expected an indented block、不要な場所で深くすれば unexpected indent、途中で幅が合わなくなれば unindent does not match any outer indentation level という別々のメッセージが出ますが、いずれも IndentationError です。これは実行前の構文解析の段階で見つかるので、エラー行より前にある print も実行されません。字下げにはスペースとタブのどちらも使えますが、混在させると意図しない解釈を生むため、PEP 8 はスペース4つを推奨しています。

最後に注意点を1つ。試験の問題数・試験時間・合格ライン・受験料といった運用上の数字は、協会の裁量で改定されます。2026年8月時点では40問・60分・正答率70パーセントですが、これらは申し込む直前に公式ページで確認すべき情報であり、覚えるものではありません。本ラボでも四択の題材にはしていません。一方、章別の出題配分は出題範囲そのものとして公開されている情報なので、こちらは学習の指針として使えます。

基礎試験の章別出題配分(協会が公開している出題範囲。合計40問)
章章名問題数割合
1章食欲をそそってみようか12.5%
2章Pythonインタープリタの使い方12.5%
3章気楽な入門編615.0%
4章制御構造ツール922.5%
5章データ構造717.5%
6章モジュール25.0%
7章入出力12.5%
8章エラーと例外410.0%
9章クラス25.0%
10章標準ライブラリめぐり410.0%
11章標準ライブラリめぐり PartII12.5%
12章仮想環境とパッケージ12.5%
13章次はなに?00.0%
14章対話環境での入力行編集とヒストリ置換12.5%
インタープリタの起動と print の基本
$ python3 -V                      # 使っているバージョンを確かめる$ python3                         # 対話モードに入る>>> 1 + 2                         # 式を打つとその場で評価される3>>> exit()                        # Ctrl-D でも抜けられる$ python3 hello.py                # ファイルにまとめたプログラムを実行$ python3 -c "print(1 + 2)"       # 1行だけ試す # ---- print の sep と end ----print(1, 2, 3)                    # -> 1 2 3   (sep は既定の半角空白)print(1, 2, 3, sep=' | ')         # -> 1 | 2 | 3print('-' * 5)                    # -> -----   (文字列の繰り返し)print('左', end='');  print('右')  # -> 左右    (改行を止めて続ける)

用語

Python 3 エンジニア認定基礎試験
Pythonエンジニア育成推進協会が実施する、Pythonの文法基礎を問う試験。出題範囲が主教材の章立てに紐づいており、章ごとの問題数が公開されている。
『Pythonチュートリアル 第4版』
基礎試験の主教材。オライリー・ジャパン刊。出題範囲はこの本の章番号と章名で示される。
対話モード
端末で python3 とだけ打って入るモード。式を1つ打つたびに評価され、結果がその場に表示される。exit() や quit()、Ctrl-D で抜ける。
-c オプション
python3 -c "print(1+2)" のように、コマンドラインに直接書いたコードを実行させるオプション。1行だけ挙動を確かめたいときに使う。
sys.argv
実行中のスクリプトに渡されたコマンドライン引数が入るリスト。先頭の sys.argv[0] はスクリプト名そのもの。
sep
print() のキーワード引数。引数と引数のあいだに挟む区切り文字を指定する。既定は半角空白1つ。先頭と末尾には付かない。
end
print() のキーワード引数。出力の末尾に付ける文字を指定する。既定は改行文字なので、空文字列にすると次の出力が同じ行に続く。
アンパック(アスタリスク展開)
print(*nums) のように、リストなどの各要素を個別の引数として渡す書き方。sep の効果を受けるようになる。
コメント
シャープ記号から行末までの、実行されない注記。複数行専用の構文はなく、行ごとにシャープを置く。文字列リテラルの中のシャープはコメントにならない。
docstring
関数やクラス、モジュールの先頭に置いた文字列リテラル。コメントではなく文字列で、実行時に __doc__ 属性として保持される。
インデント
ブロックを表す字下げ。Pythonでは波括弧の代わりにこれで構造を示す。同じブロックの文は幅をそろえる必要がある。
IndentationError
字下げの不整合で起こるエラー。構文解析の段階で検出されるため、エラー行より前の文も実行されない。
ソースコードのエンコーディング
Python 3 のソースファイルは既定でUTF-8として読まれる。別の文字コードを使うときだけ、1行目か2行目に coding 宣言を書く。

例題

例題:print('X', 'Y', sep='', end='!') を実行すると、画面には何がどう出るか。改行の有無まで答えなさい。
答えと考え方 XY! と出て、改行されない。sep を空文字列にしたので X と Y のあいだに何も挟まらず XY となり、end を '!' にしたので末尾に感嘆符が付く。ここで大事なのは end を指定した時点で既定の改行文字が置き換わってしまう点で、改行も残したければ end='!\n' のように自分で書く必要がある。sep と end は独立したキーワード引数なので片方だけ指定してもよく、指定しなかったほうは既定値のまま働く。
例題:残り2週間で仕上げるとしたら、章別の出題配分を見てどこに時間を割くのが合理的か。
答えと考え方 4章(制御構造ツール、9問)と5章(データ構造、7問)と3章(気楽な入門編、6問)で22問、全体の55パーセントを占めるので、まずこの3章を確実に取れる状態にする。次に8章(エラーと例外、4問)と10章(標準ライブラリめぐり、4問)で計8問、20パーセントを押さえると、ここまでで30問、75パーセントに届く。13章は0問なので触らなくてよい。1章・2章・7章・11章・12章・14章は各1問なので、深追いせず用語を眺める程度にとどめる。配点の重みを無視して本を頭から均等に読むと、いちばん出る4章に時間が残らないという事故が起きやすい。

出典・根拠:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)/Python Software Foundation「Python チュートリアル 2. Python インタプリタを使う」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

2. 数値を正確に扱う - 除算・切り捨て・浮動小数点

int・float・bool・bytes の関係を整理し、3種類の除算、負の数での切り捨ての向き、浮動小数点の誤差、round の偶数丸めという、試験で狙われる落とし穴を一つずつ実行して確かめます。

Pythonの基本的な数値型は int(整数)と float(浮動小数点数)です。1 と書けば int、1.0 と書けば float になり、型は組み込み関数 type() で確かめられます。ここに bool(真偽値)と bytes(バイト列)が加わりますが、この2つには覚えておくべき特別な関係があります。bool は int を継承した型です。つまり True は整数の1として、False は整数の0として、そのまま数値演算に使えます。True + True は 2 になり、isinstance(True, int) は True を返し、issubclass(bool, int) も True です。sum([True, False, True]) が 2 になるのも同じ理屈で、条件を満たした個数を数える書き方としてよく使われます。一方で 1 == True は True ですが、'1' == 1 は False です。文字列と数値は等しくなりません。

int の性質でPythonらしいのが、任意精度であることです。桁数に上限がなく、メモリの許すかぎり大きな値をそのまま正確に扱えます。2 ** 1000 のような値も計算でき、その桁数を len(str(2 ** 1000)) で数えると302桁になります。他の多くの言語のように、64ビットを超えたところで桁があふれて負の値になったり、勝手に float に変わったりすることはありません。型は int のままです。ただし桁が増えるほど計算時間もメモリも増えるので、無制限に速いわけではありません。

つまずきが多いのが除算です。Pythonには3つの演算子があります。スラッシュ1つの / は真の除算で、結果は必ず float になります。ここが重要で、割り切れる場合であっても float です。10 / 5 は 2 ではなく 2.0 で、type(10 / 5) は float を返します。スラッシュ2つの // は床除算で、商を「下方向」に切り捨てます。パーセント記号の % は剰余です。そして divmod(a, b) は (a // b, a % b) のタプル、つまり商と余りを一度に返します。オペランドに float が混じると // の結果も float になり、7.0 // 2 は 3 ではなく 3.0 です。

床除算の「下方向」という言葉が効いてくるのは、負の数のときです。-7 // 2 は -3 ではなく -4 になります。7 / 2 が 3.5、-7 / 2 が -3.5 であることを思い出してください。// は数直線上で小さいほう、つまり下に位置する整数へ寄せるので、3.5 は 3 に、-3.5 は -4 になります。0 に近づける向きではありません。剰余の符号は右辺(除数)の符号に合わせられるので、-7 % 2 は -1 ではなく 1 です。したがって divmod(-7, 2) は (-4, 1) になります。この2つは常に、除数 かける 商 たす 余り が元の値に戻る関係を保ちます。2 かける -4 たす 1 で -7 です。C言語などは0方向へ切り捨てる方式なので、そちらの感覚で解くと必ず1つずれます。

同じ「切り捨て」でも、組み込み関数 int() は向きが違います。int() は小数部を捨てて0に近づけるので、int(-3.9) は -4 ではなく -3 です。正の数では int(3.9) も 3.9 // 1 も同じ3側になるため違いが見えませんが、負の数で分かれます。-3.9 // 1 は -4.0 です。どちらも四捨五入ではないので、-3.9 を -4 にしたいなら round() を使います。この「int() は0方向、// は下方向」という食い違いは、試験でも実務でも定番の落とし穴です。

float には表現の限界があります。コンピュータは小数を2進数で保持するため、0.1 や 0.2 のように10進数では簡潔な値が、2進数では循環小数になって正確に表せません。その結果 0.1 + 0.2 は 0.3 ちょうどにはならず、0.30000000000000004 という値になります。当然 0.1 + 0.2 == 0.3 は False です。これはPythonの欠陥ではなく、IEEE 754 という規格に沿った二進浮動小数点の性質で、多くの言語で同じことが起こります。1.1 + 2.2 も 3.3000000000000003 になります。対策は、等値比較を避けることです。round(0.1 + 0.2, 2) == 0.3 のように必要な桁で丸めてから比べるか、許容誤差を決めて差の絶対値と比べるか、金額のように厳密さが要る場面では decimal モジュールを使います。

round() にも独自の癖があります。Pythonの round() は最近接偶数への丸め、いわゆる銀行家の丸めを行います。ちょうど半分の値のときだけ、近いほうの偶数に寄せるという規則です。round(0.5) は 0、round(1.5) は 2、round(2.5) は 2、round(3.5) は 4、round(4.5) は 4 となります。学校で習う四捨五入なら 2.5 は 3 になるはずですが、Pythonではなりません。この方式は、大量の値を丸めたときに合計が上振れするのを防ぐためのものです。なお第2引数を省略した round() は int を返し、round(2.5, 0) のように桁数を指定すると float の 2.0 が返ります。

数値と文字の橋渡しも3章の範囲です。int('1010', 2) のように第2引数に基数を渡すと、その進法の文字列として読み取れるので結果は 10 になります。逆向きは bin()・oct()・hex() で、それぞれ '0b1010'・'0o10'・'0xff' のように接頭辞の付いた文字列を返します。hex() が返す英字は小文字です。大文字にしたいときは format(255, 'X') と書きます。文字とコードポイントの変換は ord() と chr() で、ord('A') は 65、chr(65) は 'A'、ord('a') は 97 です。

最後に bytes です。b を付けた b'abc' のようなリテラルで書き、文字列を .encode() したものもこれになります。str との違いが問われやすいので押さえてください。bytes に整数の添字でアクセスすると、その位置のバイト値が int として返ります。b'abc'[0] は 'a' ではなく 97 です。一方スライスで取り出すと長さ1の bytes が返るので、b'abc'[0:1] は b'a' です。str なら s[0] も s[0:1] も同じ str になるので、ここが対照的です。また str と bytes は連結できず、'a' + b'a' は TypeError になります。bytes も str と同じくイミュータブルで、要素の代入はできません。可変版が欲しいときは bytearray を使います。マルチバイト文字では文字数とバイト数が一致しないことも重要で、len('あ') は 1 ですが len('あ'.encode()) は 3 です。UTF-8 で日本語のひらがな1文字が3バイトになるためです。

除算まわりの挙動(すべて Python 3 で実行して確認した値)
式結果型理由
10 / 52.0float/ は割り切れても float を返す
7 / 23.5float同上
7 // 23int下方向へ切り捨て。正の数では0方向と同じ
-7 // 2-4int下方向なので -3 ではなく -4
7.0 // 23.0floatfloat が混ざると結果も float
7 % 21int余り
-7 % 21int符号は右辺に合わせる
divmod(-7, 2)(-4, 1)tuple(a // b, a % b) を返す
int(-3.9)-3int0方向へ切り捨て。// とは向きが違う
-3.9 // 1-4.0float下方向へ切り捨て
実行して確かめておきたい数値の挙動
# ---- 負の数で向きが分かれる ----print(-7 // 2)        # -4   下方向へ切り捨てprint(-7 % 2)         # 1    符号は右辺に合わせるprint(divmod(-7, 2))  # (-4, 1)print(2 * -4 + 1)     # -7   除数 かける 商 たす 余り が元に戻る # ---- 浮動小数点の誤差 ----print(1.1 + 2.2)              # 3.3000000000000003print(0.1 * 3)                # 0.30000000000000004 # ---- round は最近接偶数への丸め ----print(round(0.5), round(4.5)) # 0 4 # ---- bool は int の仲間 ----print(sum([True, False, True]))  # 2 # ---- 任意精度 ----print(len(str(2 ** 1000)))    # 302   302桁の整数を正確に保持する

用語

int
整数型。Python 3 では任意精度で、桁数に上限がない。オーバーフローも自動的な float への変換も起こらない。
float
浮動小数点数型。IEEE 754 の二進表現を使うため、0.1 のような10進の小数を正確には保持できない。
bool
真偽値型。int を継承しており、True は 1、False は 0 として数値演算に使える。isinstance(True, int) は True。
bytes
バイト列型。b'abc' のように書く。整数の添字ではバイト値が int で返り、スライスでは bytes が返る。イミュータブル。
真の除算(/)
スラッシュ1つの除算。結果は常に float で、割り切れる場合でも 10 / 5 は 2.0 になる。
床除算(//)
スラッシュ2つの除算。商を下方向(数直線上の小さいほう)へ切り捨てる。負の数では -7 // 2 が -4 になる。
剰余(%)
余りを求める演算子。符号は右辺に合わせられるので、-7 % 2 は 1 になる。
divmod()
商と余りを (a // b, a % b) のタプルで一度に返す組み込み関数。divmod(-7, 2) は (-4, 1)。
int() の切り捨て
小数部を捨てて0に近づける丸め。int(-3.9) は -3 で、下方向へ切り捨てる // とは向きが違う。
浮動小数点の誤差
2進数で表せない小数が生む誤差。0.1 + 0.2 は 0.30000000000000004 になり、0.3 との等値比較は False になる。
最近接偶数への丸め
round() が採用する丸め方式。ちょうど半分のときは近いほうの偶数へ寄せる。round(2.5) は 2、round(3.5) は 4。
基数指定の int()
int('1010', 2) のように第2引数で基数を渡すと、その進法の文字列として整数に変換する。
ord() と chr()
文字とコードポイントを相互に変換する組み込み関数。ord('A') は 65、chr(65) は 'A'。
bytearray
bytes の可変版。要素の代入ができる点が bytes と異なる。

例題

例題:5 / 2、5 // 2、5.0 // 2、int(5 / 2) の4つは、それぞれ何を返すか。値だけでなく型も答えなさい。
答えと考え方 5 / 2 は 2.5 で float。/ は常に float を返す。5 // 2 は 2 で int。両辺が int なので床除算の結果も int になる。5.0 // 2 は 2.0 で float。オペランドに float が1つでも混ざると結果は float になり、値としては切り捨てられているが型は float のままである。int(5 / 2) は 2 で int。先に 2.5 を作ってから小数部を捨てている。ここで見てほしいのは、値が「2 のようなもの」であっても、2 と 2.0 は型が違うという点である。print すると 2 と 2.0 で見た目にも差が出る。
例題:-10 % 3 はいくつになるか。C言語のように余りが負になると考えるとどこで間違えるか。
答えと考え方 2 になる。Pythonの剰余は、余りの符号を右辺(除数)の符号に合わせるという規則で決まる。除数の 3 が正なので、余りも 0 以上 3 未満の範囲に収まり、2 になる。この値は床除算と対で決まっていて、-10 // 3 が -4 なので、3 かける -4 は -12、-10 に戻すには 2 を足す必要がある、と考えると納得しやすい。0方向へ切り捨てる方式なら商が -3、余りが -1 になるが、Pythonはこの方式をとらない。負の数が絡んだら、まず床除算の商を出してから、そこに何を足せば元に戻るかを考えるのが確実である。

出典・根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 15. 浮動小数点演算、その問題と制限」Python 3.14 ドキュメント(2026年8月確認)

3. 文字列を切る・つなぐ・整える

スライスの読み方、イミュータブルであることの意味、f-string の書式、join と split と strip と replace の使い分け、raw文字列、そして find と index の違いまで、文字列の要点を一気に押さえます。

文字列はシングルクォートでもダブルクォートでも書けます。どちらでも意味は同じで、中に片方の記号を含めたいときに、もう片方で囲むと便利という程度の使い分けです。三重引用符で囲めば改行をそのまま含む複数行の文字列になります。文字列を並べて書くと自動で連結され、'Py' 'thon' は 'Python' になります。変数どうしをつなぐときは + 演算子を使い、* 演算子は繰り返しです。'ab' * 3 は 'ababab' になり、あいだに区切りは入りません。'-' * 5 のようにして区切り線を作るのは定番の書き方です。

文字列の一部を取り出すのがスライスです。添字は0から始まり、s[i] で1文字を取り出します。負の添字は末尾から数え、s[-1] が最後の1文字です。s[start:stop] は start の位置から stop の「手前」までを返します。終端が含まれないのがポイントで、s[0:5] は5文字です。start を省略すると先頭から、stop を省略すると末尾までになります。第3の値はステップで、s[::2] なら1つ飛ばし、s[::-1] なら逆順です。文字列の反転を s[::-1] と書けるのは覚えておく価値があります。

スライスで最も間違えやすいのが、範囲外を指定したときの挙動です。単独の添字が範囲外なら IndexError になりますが、スライスは例外になりません。文字列と重なっている部分だけを返し、まったく重ならなければ空文字列を返します。'abc'[100:200] は '' です。start が stop より大きい場合も同じで、s[4:1] は '' になります。存在チェックのつもりでスライスを書くと、エラーにならないまま空文字列が流れていくので、意図した位置を取れているかは長さで確かめるのが安全です。

文字列がイミュータブル(変更不可能)である、という性質は試験の常連です。s[0] = 'z' のような代入はできず、TypeError: 'str' object does not support item assignment になります。同じことがメソッドにも表れます。s.upper() や s.replace() は元の文字列を書き換えるのではなく、新しい文字列を作って返すだけです。ですから s.upper() とだけ書いた行は、作った文字列をどこにも保存せず捨てているのと同じで、s は元のままです。結果を残したければ s = s.upper() のように代入し直します。リストの sort() のように「その場で並べ替えて None を返す」タイプのメソッドとは対照的なので、両方を並べて覚えると混乱しません。

値を文字列に埋め込む書き方は3種類あります。いちばん新しく読みやすいのが f-string で、文字列の前に f を付け、波括弧の中に式を書きます。f'{1+2}' は '3' です。コロンのあとに書式指定を続けられ、f'{3.14159:.2f}' は '3.14' になります。これは切り捨てではなく丸めで、:.3f なら '3.142' です。ビックリマークと r を書く !r という変換指定を使うと、値を repr() で表示します。文字列に対して使えばクォート付きになるので、f'{"ab"!r}' は "'ab'" です。2つ目が str.format() で、'{} and {}'.format(1, 2) のように順に埋め、'{1} {0}'.format('a', 'b') のように番号で順序を入れ替えたり、'{n:.2f}'.format(n=3.14159) のように名前で渡したりできます。書式指定の文法は f-string と共通です。3つ目が古い % 演算子で、'%s-%d' % ('a', 3) のように書きます。

文字列とリストを行き来する道具が split() と join() です。split() は文字列を分割してリストにします。引数を省略した s.split() は、連続する空白をひとまとめの区切りとして扱い、空の要素を作りません。'a b c'.split() は3要素の ['a', 'b', 'c'] です。一方、区切り文字を明示した s.split(' ') は空白1つずつで切るので、連続していると空文字列が残り ['a', 'b', '', 'c'] になります。この違いはよく問われます。第2引数は maxsplit で、分割回数の上限です。'a,b,c'.split(',', 1) は最初の1回だけ切って ['a', 'b,c'] を返します。逆向きが join() で、区切り文字のほうからメソッドを呼びます。','.join(['x', 'y', 'z']) は 'x,y,z' です。渡すのは反復可能オブジェクトなら何でもよく、文字列も1文字ずつを取り出せるので '-'.join('abc') は 'a-b-c' になります。区切りは要素と要素のあいだにだけ入り、先頭や末尾には付きません。要素に文字列以外が混ざると TypeError です。

端の余分な文字を落とすのが strip() です。ここでの落とし穴は、引数が「取り除く文字の集合」だという点です。部分文字列を1つ消すのではなく、両端からその集合に含まれる文字が続くかぎり削り続けます。'xxabxx'.strip('x') は 'ab' になります。'abcba'.strip('ab') と書くと、左端の a と b、右端の a と b が削られて 'c' が残ります。並び順は関係なく、集合として扱われるからです。引数を省略すると空白文字(スペース・タブ・改行)を削ります。左端だけなら lstrip()、右端だけなら rstrip() です。文字列の途中にあるものまで消したいときは strip() ではなく replace() を使います。replace() は該当箇所をすべて置き換え、第3引数で回数の上限を指定できます。

部分文字列を探す方法も複数あります。有無だけを知りたいなら in 演算子がいちばん簡潔で、'Py' in s のように書きます。in は大文字と小文字を区別するので、'py' in 'Python' は False です。位置を知りたいときは find() か index() を使います。返す値は同じですが、見つからなかったときの振る舞いが違います。find() は -1 を返して先に進み、index() は ValueError: substring not found を送出します。エラーで止めたくない場面では find() を、見つからないのが異常事態なら index() を選びます。末尾から探す rfind() と rindex() も同じ関係です。出現回数を数えるだけなら count() があります。

最後にエスケープと raw文字列です。文字列の中でバックスラッシュは特別な意味を持ち、\n は改行1文字、\t はタブ1文字を表します。バックスラッシュそのものを1文字書きたいときは2つ重ねるので、len('\\') は 1 です。ファイルパスや正規表現のようにバックスラッシュが多い文字列では、これを毎回重ねるのが煩雑になります。そこで文字列リテラルの前に r を付けた raw文字列を使うと、バックスラッシュがエスケープの開始として解釈されなくなります。r'a\nb' は a、バックスラッシュ、n、b の4文字なので len は 4 で、通常の 'a\nb' は a、改行、b の3文字なので len は 3 です。r を付けても文字列の型は str のままで、特別な型になるわけではありません。

文字列メソッドの働きと、間違えやすい点(実行して確認した値)
式結果間違えやすい点
'a,,b'.split(',')['a', '', 'b']区切りが連続すると空文字列が残る
'x y z'.split()['x', 'y', 'z']引数なしは連続空白をまとめる
','.join(['x', 'y'])'x,y'呼ぶのは区切り文字の側
'abcba'.strip('ab')'c'引数は集合。両端から削り続ける
' ab '.strip()'ab'省略時は空白文字を削る
'strawberry'.find('grape')-1見つからなくても例外にならない
'strawberry'.index('raw')2位置の返し方は find() と同じ
'Hello, Python'[::-1]'nohtyP ,olleH'ステップ -1 で反転できる
'HELLO' in 'Hello'Falsein は大文字小文字を区別する
len(r'C:\tmp')6raw文字列ではバックスラッシュも1文字
文字列の切り出しと検索、f-string と raw文字列
s = 'Hello, Python'          # 13文字print(s[7:])                 # Python        添字7から末尾までprint(s[-6:])                # Python        末尾から6文字print(s[::-1])               # nohtyP ,olleH 反転print(s.split(', '))         # ['Hello', 'Python']print(s.find('Ruby'))        # -1            見つからないprint(s.index('Python'))     # 7             見つかった位置print('python' in s)         # False         大文字小文字を区別する name = '花子'score = 91.5print(f'{name}さんは{score:.1f}点')   # 花子さんは91.5点 print(len('C:\tmp'), len(r'C:\tmp'))  # 5 6   \t がタブか2文字かの違い

用語

スライス
s[start:stop:step] で部分文字列を取り出す記法。stop の位置は含まれない。step に -1 を指定すると逆順になる。
範囲外のスライス
スライスは範囲が長さを超えても例外にならず、重なる部分だけを返す。まったく重ならなければ空文字列。単独の添字なら IndexError。
イミュータブル
生成後に中身を変更できない性質。str はイミュータブルなので、添字への代入は TypeError になる。
f-string
文字列の前に f を付け、波括弧に式を書いて埋め込む記法。コロンのあとに書式指定、!r で repr() 表示を指定できる。
書式指定 :.2f
小数点以下の桁数を指定して丸める書式。切り捨てではない。f-string と str.format() で共通に使える。
split()
文字列を分割してリストにするメソッド。引数なしは連続空白をまとめ、区切り文字を明示すると空文字列が残る。第2引数は maxsplit。
join()
区切り文字の側から呼び、反復可能オブジェクトの要素をつなぐメソッド。区切りは要素と要素のあいだにだけ入る。
strip()
両端から文字を取り除くメソッド。引数は「取り除く文字の集合」であり、部分文字列ではない。省略すると空白文字を削る。
replace()
部分文字列を別の文字列に置き換えて、新しい文字列を返すメソッド。第3引数で置換回数の上限を指定できる。
in 演算子
部分文字列が含まれるかを真偽値で返す演算子。大文字と小文字を区別する。
find() と index()
部分文字列の位置を返すメソッド。見つからないとき find() は -1 を返し、index() は ValueError を送出する。
エスケープシーケンス
バックスラッシュで始まる特別な表記。\n は改行、\t はタブを表し、バックスラッシュ自体は2つ重ねて書く。
raw文字列
リテラルの前に r を付けた文字列。バックスラッシュがエスケープとして解釈されない。型は通常の str のまま。

例題

例題:s = 'Hello, Python' のとき、s[0:5]、s[-6:]、s[100:200]、s[5:2] はそれぞれ何を返すか。
答えと考え方 s[0:5] は 'Hello'。添字0から始めて添字5の手前まで、つまり5文字を取り出す。s[-6:] は 'Python'。負の添字は末尾から数えるので、末尾から6文字目を始点として最後までになる。s[100:200] は ''。文字列は13文字しかなく範囲がまったく重ならないが、スライスは例外にならず空文字列を返す。s[5:2] も '' で、始点が終点より後ろにあるときも同様に空文字列になる。単独の添字 s[100] なら IndexError になるので、そこが対照的である。スライスは黙って空を返すので、期待した長さが取れているかは len() で確かめる習慣をつけたい。
例題:' Python ' の前後の空白を消したい。strip() と replace(' ', '') はどう違うか。'abcba'.strip('ab') が 'c' になる理由も説明しなさい。
答えと考え方 strip() は両端だけを対象にするので、' Python '.strip() は 'Python' になり、語の中に空白があってもそこは残る。replace(' ', '') は文字列全体からすべての空白を消すので、'a b'.replace(' ', '') は 'ab' になってしまう。単語の区切りを保ちたいなら strip() を選ぶ。'abcba'.strip('ab') が 'c' になるのは、引数が「取り除く文字の集合」だからである。部分文字列 'ab' を1回消すのではなく、左端から a、b と続くかぎり削り、右端からも a、b と続くかぎり削る。その結果、両端が食い尽くされて中央の c だけが残る。集合なので 'ba' と書いても結果は同じで、順序は関係ない。

出典・根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python チュートリアル 3. 形式ばらない Python の紹介」Python 3.14 ドキュメント(2026年8月確認)/Python Software Foundation「Python 言語リファレンス 2. 字句解析」Python 3.14 ドキュメント(2026年8月確認)

確認問題(30問)

四肢択一。「正解と解説」を開くと、正解の理由と他の選択肢が違う理由を確認できます。

問1|主教材

Python 3 エンジニア認定基礎試験の主教材として正しい書籍はどれか。

  1. オライリー・ジャパンが刊行する『Pythonチュートリアル』
  2. 技術評論社が刊行する『Python実践レシピ』
  3. 翔泳社が刊行する『あたらしいデータ分析の教科書』
  4. インプレスが刊行する『Pythonデータ分析 実践ハンドブック』
正解と解説
正解:A. オライリー・ジャパンが刊行する『Pythonチュートリアル』

基礎試験の主教材はオライリー・ジャパンの『Pythonチュートリアル』で、公式ページには2021年9月1日より第4版に対応すると示されている。出題範囲もこの本の章番号と章名で公開されるため、対策はこの本の内容を章ごとの重みに沿って押さえる形になる。技術評論社『Python実践レシピ』は実践試験、翔泳社『Pythonによるあたらしいデータ分析の教科書』はデータ分析試験、インプレス『Pythonデータ分析 実践ハンドブック』はデータ分析実践試験の主教材であり、いずれも同じ協会が実施する別の試験のものである。教材を取り違えると範囲外を延々と勉強することになるので、最初に確かめておきたい。

根拠:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)

問2|最多の章

基礎試験の出題範囲において、主教材の中から最も多くの問題が出る章はどれか。

  1. 3章「気楽な入門編」
  2. 5章「データ構造」
  3. 4章「制御構造ツール」
  4. 8章「エラーと例外」
正解と解説
正解:C. 4章「制御構造ツール」

最も多いのは4章「制御構造ツール」で、40問中9問が割り当てられている。次いで5章「データ構造」が7問、3章「気楽な入門編」が6問と続き、8章「エラーと例外」は4問である。3章と4章と5章の3つだけで22問となり、全体の半分を超える。したがって学習時間もこの3章に厚く配分するのが合理的で、とくに for 文や関数定義を扱う4章を後回しにすると取り返しがつかない。

根拠:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)

問3|章別の配分

基礎試験の出題範囲において、4章「制御構造ツール」が占める割合はどれか。

  1. 10.0%
  2. 15.0%
  3. 17.5%
  4. 22.5%
正解と解説
正解:D. 22.5%

4章「制御構造ツール」は40問中9問で、割合にすると22.5パーセントである。章別では最大で、これに次ぐのが5章「データ構造」の7問、17.5パーセントである。15.0パーセントは3章「気楽な入門編」の6問にあたり、10.0パーセントは8章「エラーと例外」および10章「標準ライブラリめぐり」の4問にあたる割合である。この配分は運用上の数字ではなく出題範囲そのものとして公開されているので、学習計画の根拠として使える。

根拠:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)

問4|13章の配分

基礎試験の出題範囲において、13章「次はなに?」に割り当てられている問題数はどれか。

  1. 0問
  2. 1問
  3. 2問
  4. 4問
正解と解説
正解:A. 0問

13章「次はなに?」は0問で、出題範囲の中で唯一まったく出題されない章である。学習の次の一歩を案内する内容なので、文法を問う試験としては対象から外されている。1問が割り当てられているのは1章・2章・7章・11章・12章・14章、2問は6章と9章、4問は8章「エラーと例外」と10章「標準ライブラリめぐり」である。13章以外はすべて1問以上あるので、配分が少ない章も用語を眺める程度の備えはしておきたい。

根拠:一般社団法人Pythonエンジニア育成推進協会「Python 3 エンジニア認定基礎試験 出題範囲」(2026年8月確認)

問5|printのsep

次のプログラムを実行したとき、画面に出力される文字列はどれか。

print('Python', 3, 'exam', sep='/')
  1. Python 3 exam
  2. Python/3/exam
  3. Python3exam
  4. Python/3/exam/
正解と解説
正解:B. Python/3/exam

print() は受け取った引数をキーワード引数 sep でつないで並べる。sep の既定は半角空白1つなので、指定しなければ Python 3 exam となるが、ここでは sep='/' を指定しているのでスラッシュでつながれ Python/3/exam になる。Python3exam は sep を空文字列にしたときの出力である。末尾にも区切りが付く Python/3/exam/ を選んでしまうのは、sep が要素の後ろごとに付くと考えた場合で、実際には引数と引数のあいだにだけ入る。末尾に付くのは end のほうである。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問6|printのend

次の3行を上から順に実行したとき、画面に出るものはどれか。

print('A', end='')print('B', end='')print('C')
  1. A B C と1行だけ出力される
  2. A、B、C が3行に出力される
  3. AB と C が2行に出力される
  4. ABC と1行だけ出力される
正解と解説
正解:D. ABC と1行だけ出力される

print() は出力の末尾にキーワード引数 end を付ける。既定は改行文字なので、指定しなければ print() を呼ぶたびに改行される。ここでは最初の2つで end='' として改行を止めているため A と B が続けて出力され、最後の print() が既定の改行を付けるので ABC と1行だけ出力される。A B C のように空白が入るのは1回の print() に3つの引数を渡した場合、3行に分かれるのは end を一切指定しなかった場合、2行になるのは end='' を1つだけ外した場合である。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問7|アンパック出力

リストを展開して表示する次のプログラムの出力はどれか。

nums = [10, 20, 30]print(*nums, sep=', ')
  1. [10, 20, 30] と出力される
  2. 10, 20, 30 と出力される
  3. 10 20 30 と出力される
  4. 102030 と出力される
正解と解説
正解:B. 10, 20, 30 と出力される

アスタリスクを付けた print(*nums) は、リストの各要素を個別の引数として print() に渡す。したがって3つの引数が sep でつながれ、sep=', ' なので 10, 20, 30 となる。アスタリスクを付けずに print(nums) と書くとリストが1つの引数として渡され、角括弧の付いた [10, 20, 30] がそのまま出る。sep を指定しなければ既定の半角空白で 10 20 30 となり、sep='' なら 102030 と詰まって出力される。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問8|コメント記号

Python のコメントについての説明として、正しいものはどれか。

  1. // から行末までがコメントとして無視される
  2. -- から行末までがコメントとして無視される
  3. # から行末までがコメントとして無視される
  4. /* と */ で囲まれた範囲がコメントとして無視される
正解と解説
正解:C. # から行末までがコメントとして無視される

Python のコメントはシャープ記号で書き、そこから行末までが無視される。行の先頭に置けばその行全体が、途中に置けばそれ以降が対象になる。複数行をまとめる専用の構文は無いので、行ごとにシャープを置く。三重引用符で囲む書き方をブロックコメント代わりに使うことはあるが、あれは文法上は文字列リテラルであり、関数やクラスの先頭に置いた場合は docstring として実行時に保持される。二重スラッシュはPythonでは床除算の演算子、スラッシュとアスタリスクの組やハイフン2つは他言語のコメント記法である。

根拠:Python Software Foundation「Python チュートリアル 3. 形式ばらない Python の紹介」Python 3.14 ドキュメント(2026年8月確認)

問9|インデント

次のプログラムをファイルに保存して実行したとき、何が起こるか。

if True:    print('one')        print('two')
  1. IndentationError になり止まる
  2. one と two がこの順に出力される
  3. one だけが出力されて処理が終わる
  4. two だけが出力されて処理が終わる
正解と解説
正解:A. IndentationError になり止まる

Python はインデントの深さでブロックを表すので、同じブロックに属する文は字下げ幅をそろえなければならない。3行目だけが深くなっており、しかも直前の行は新しいブロックを導く行(コロンで終わる行)ではないため、IndentationError: unexpected indent となる。これは実行前の構文解析で検出されるので、2行目の print も実行されず、one すら出力されない。字下げが必要な場所でしなければ expected an indented block、途中で幅が合わなくなれば unindent does not match any outer indentation level という別のメッセージになるが、いずれも IndentationError である。

根拠:Python Software Foundation「Python チュートリアル 3. 形式ばらない Python の紹介」Python 3.14 ドキュメント(2026年8月確認)

問10|文字コード

Python 3 のソースファイルの文字エンコーディングについて、正しい説明はどれか。

  1. ASCII が既定であり、日本語を含めるには宣言が要る
  2. Shift_JIS が既定であり、宣言すれば変更できる
  3. EUC-JP が既定であり、日本語をそのまま書ける
  4. UTF-8 が既定であり、日本語をそのまま書ける
正解と解説
正解:D. UTF-8 が既定であり、日本語をそのまま書ける

Python 3 のソースファイルは既定でUTF-8として読まれるので、コメントにも文字列リテラルにも日本語をそのまま書ける。Python 2 では既定がASCIIで、日本語を含めるときはファイルの1行目か2行目に coding 宣言を書く必要があったが、Python 3 ではその宣言が不要になった。宣言を書くのは、UTF-8 以外の文字コードで保存したファイルを読ませたい場合だけである。なお、識別子(変数名や関数名)にも日本語を使うことはできるが、可読性の観点から推奨されない。

根拠:Python Software Foundation「Python チュートリアル 2. Python インタプリタを使う」Python 3.14 ドキュメント(2026年8月確認)

問11|割り算の型

整数どうしの割り算を扱う次のプログラムは、1行目に値を、2行目に型の名前を出力する。その組み合わせはどれか。

print(9 / 3)print(type(9 / 3).__name__)
  1. 値が 3 で、型は int
  2. 値が 3 で、型は float
  3. 値が 3.0 で、型は float
  4. 値が 3.0 で、型は int
正解と解説
正解:C. 値が 3.0 で、型は float

スラッシュ1つの / は真の除算で、結果は必ず float になる。割り切れる場合も例外ではないので、9 / 3 は 3 ではなく 3.0 であり、型も float である。整数どうしの計算だから int になると考えると 3 と int を選んでしまうが、int が欲しいときは床除算を使って 9 // 3 と書く必要があり、こちらなら 3 と int になる。3 と float、3.0 と int のように値の見た目と型が食い違う組み合わせは、この式からは生じない。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問12|負数の床除算

床除算を並べた次のプログラムの出力はどれか。

print(9 // 4)print(-9 // 4)
  1. 1行目が 2、2行目が -2
  2. 1行目が 2、2行目が -3
  3. 1行目が 2.25、2行目が -2.25
  4. 1行目が 2.0、2行目が -3.0
正解と解説
正解:B. 1行目が 2、2行目が -3

スラッシュ2つの // は床除算で、商を下方向、つまり数直線上の小さいほうへ切り捨てる。9 / 4 は 2.25 なので 9 // 4 は 2、-9 / 4 は -2.25 なので -9 // 4 は -2 ではなく -3 になる。0 に近づける向きではない点が要点で、-2 を選ぶのはC言語のように0方向へ切り捨てると考えた場合である。2.25 と -2.25 は // ではなく / を使ったときの値、2.0 と -3.0 はオペランドに float を混ぜて 9.0 // 4 と書いたときの値であり、両辺が int ならば結果も int になる。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問13|divmod

divmod(-11, 3) が返す値はどれか。

  1. (-3, -2)
  2. (-4, 1)
  3. (-3, 2)
  4. (-4, -2)
正解と解説
正解:B. (-4, 1)

divmod(a, b) は (a // b, a % b) のタプルを返す。Python の // は下方向への切り捨てなので -11 // 3 は -4 になり、剰余の符号は右辺に合わせられるので -11 % 3 は 1 になる。よって (-4, 1) である。0 方向へ切り捨てる方式で考えると商が -3、余りが -2 となって (-3, -2) を選んでしまうが、Python はこの方式をとらない。商と余りは常に、除数 かける 商 たす 余り が元の値に戻る関係を保つので、3 かける -4 たす 1 で -11 となり検算できる。この関係で確かめると (-3, 2) も (-4, -2) も -11 に戻らない。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問14|intの切り捨て

切り捨ての向きを比べる次のプログラムの出力はどれか。

print(int(-2.7))print(-2.7 // 1)
  1. 1行目が -3、2行目が -2.0
  2. 1行目が -2、2行目が -2.0
  3. 1行目が -3、2行目が -3.0
  4. 1行目が -2、2行目が -3.0
正解と解説
正解:D. 1行目が -2、2行目が -3.0

組み込み関数 int() は小数部を捨てて 0 に近づける向きに丸めるので、int(-2.7) は -3 ではなく -2 になる。一方 // は下方向への切り捨てなので -2.7 // 1 は -3 側になり、オペランドに float が含まれるため結果も float の -3.0 である。正の数では int(2.7) も 2.7 // 1 もどちらも 2 側になるので違いが見えないが、負の数で向きが分かれる。どちらも四捨五入ではないので、-2.7 を -3 にしたいときは round(-2.7) を使う。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問15|小数の誤差

真偽値を2行に出す次のプログラムの出力はどれか。

print(0.1 + 0.7 == 0.8)print(round(0.1 + 0.7, 2) == 0.8)
  1. 1行目が False、2行目が True
  2. 1行目が True、2行目が True
  3. 1行目が False、2行目が False
  4. 1行目が True、2行目が False
正解と解説
正解:A. 1行目が False、2行目が True

float は小数を2進数で保持するため、10進では簡潔な 0.1 や 0.7 を正確には表せない。実際に 0.1 + 0.7 を表示すると 0.7999999999999999 となり、0.8 とはわずかに違うので1行目は False になる。2行目は round() で小数点以下2桁に丸めてから比べているため、両辺が 0.8 になって True である。これは Python 固有の欠陥ではなく IEEE 754 の二進浮動小数点の性質で、0.1 + 0.2 が 0.30000000000000004 に、1.1 + 2.2 が 3.3000000000000003 になるのも同じ理由である。float の等値比較は避け、必要な桁で丸めてから比べるか、許容誤差と差の絶対値を比べるか、金額のように厳密さが要る場面では decimal モジュールを使う。

根拠:Python Software Foundation「Python チュートリアル 15. 浮動小数点演算、その問題と制限」Python 3.14 ドキュメント(2026年8月確認)

問16|roundの丸め

丸めた値を1行に並べる次のプログラムの出力はどれか。

print(round(1.5), round(2.5), round(3.5))
  1. 2 3 4
  2. 2 2 4
  3. 1 2 3
  4. 1 3 3
正解と解説
正解:B. 2 2 4

Python の round() は最近接偶数への丸め、いわゆる銀行家の丸めを行う。ちょうど半分の値のときだけ近いほうの偶数へ寄せるので、1.5 は 2、2.5 は 2、3.5 は 4 となり、出力は 2 2 4 である。学校で習う四捨五入なら 2 3 4 になるが、Python はこの方式をとらない。1 2 3 は小数点以下を単純に切り捨てた場合の値、1 3 3 は奇数側へ寄せた場合の値で、いずれも実際の挙動とは異なる。なお第2引数を省略した round() は int を返し、round(2.5, 0) のように桁数を指定すると float の 2.0 が返る。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問17|boolはint

真偽値を数値として扱う次のプログラムの出力はどれか。

print(True + True)print(isinstance(True, int))
  1. 1行目が True、2行目が True
  2. 1行目が True、2行目が False
  3. 1行目が 2、2行目が True
  4. 1行目が 2、2行目が False
正解と解説
正解:C. 1行目が 2、2行目が True

bool は int を継承した型なので、True は整数の 1、False は整数の 0 としてそのまま数値演算に使える。True + True は 1 たす 1 で 2 になり、isinstance(True, int) は True を返す。1行目を True と考えてしまうのは、+ を論理和と取り違えた場合で、Python の論理和は or であり True or True なら True になる。issubclass(bool, int) も True で、sum([True, False, True]) が 2 になるのも同じ理由である。条件を満たした個数を数えるときにこの性質がよく使われる。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問18|整数の精度

Python 3 の int 型についての説明として、正しいものはどれか。

  1. 桁数の上限がなく、メモリの許すかぎり大きな値を扱える
  2. 64ビットを超えると自動的に float に変換されて計算される
  3. 32ビットを超える値はあふれて負の値になることがある
  4. 桁数が上限を超えたところで OverflowError が送出される
正解と解説
正解:A. 桁数の上限がなく、メモリの許すかぎり大きな値を扱える

Python 3 の int は任意精度で、桁数に上限がない。3 ** 40 は 12157665459056928801 と正確に求まり、これは符号付き64ビットの範囲を超えているが型は int のままである。2 ** 1000 のような値も扱え、桁数を len(str(2 ** 1000)) で数えると302桁になる。C言語のような固定長整数ではないので、あふれて負になることも、勝手に float へ切り替わることもない。OverflowError は float が表現できる範囲を超えたときなどに出るもので、int の桁数が増えただけでは発生しない。ただし桁が増えるほど計算時間とメモリは増える。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問19|bytesの添字

バイト列を扱う次のプログラムの、2行目と3行目の出力はどれか。

b = 'abc'.encode()print(b[0])print(b[0:1])
  1. 1行目が b'a'、2行目が b'a'
  2. 1行目が 97、2行目が 97
  3. 1行目が a、2行目が b'a'
  4. 1行目が 97、2行目が b'a'
正解と解説
正解:D. 1行目が 97、2行目が b'a'

bytes に整数の添字でアクセスすると、その位置のバイト値が int として返る。'abc' をUTF-8で符号化した b'abc' の先頭バイトは 'a' のコードポイントなので 97 になる。一方スライスで取り出すと長さ1の bytes が返るので、b[0:1] は b'a' である。str なら s[0] も s[0:1] も同じ 'a' という str になるので、ここが str と bytes の対照的なところである。表示が a ではなく b'a' になるのは、print() が bytes を repr の形で出すためで、文字列に戻したいときは b.decode() を使う。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問20|進数と文字

基数変換と文字コード変換を並べた次のプログラムの出力はどれか。

print(int('1010', 2), bin(10), hex(255), ord('A'))
  1. 10 0b1010 0xFF 65
  2. 1010 0b1010 0xff 65
  3. 10 0b1010 0xff 65
  4. 10 0b1010 0xff 97
正解と解説
正解:C. 10 0b1010 0xff 65

int() の第2引数は基数なので、int('1010', 2) は文字列を2進数として読み取り 10 を返す。1010 のまま出ると考えるのは基数の指定を見落とした場合である。bin() は接頭辞 0b の付いた文字列を返すので '0b1010'、hex() は 0x の付いた小文字の文字列を返すので '0xff' となる。大文字の 0xFF になることはなく、大文字表記が欲しいときは format(255, 'X') を使う。ord() は文字のコードポイントを返し、大文字の A は 65 である。97 は小文字の a のコードポイントで、逆向きの変換は chr(65) と書けば 'A' に戻る。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み関数」Python 3.14 ドキュメント(2026年8月確認)

問21|スライス

文字列のスライスを扱う次のプログラムの出力はどれか。

s = 'Pythonic'print(s[2:5])print(s[-3:])
  1. 1行目が thon、2行目が nic
  2. 1行目が tho、2行目が nic
  3. 1行目が tho、2行目が ic
  4. 1行目が yth、2行目が nic
正解と解説
正解:B. 1行目が tho、2行目が nic

s[2:5] は添字2の位置から始めて添字5の手前までを取り出す。'Pythonic' の添字2は t なので、t、h、o の3文字で tho になる。終端の位置は含まれないため thon にはならない。添字を1から数えて「2文字目から」と読むと s[1:4] にあたる yth を選んでしまう。s[-3:] は負の添字なので末尾から数え、末尾から3文字目の n を始点として最後までを返すので nic である。-3 を「末尾から3文字目まで」と読み違えると s[-2:] にあたる ic を選んでしまう。添字は0から始まり、負の添字は末尾を -1 として数えるという2点を押さえれば迷わない。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問22|範囲外とin

2つの判定結果を表示する次のプログラムの出力はどれか。

s = 'Python'print(s[100:200] == '')print('py' in s)
  1. 1行目が False、2行目が True
  2. 1行目が True、2行目が True
  3. 1行目が False、2行目が False
  4. 1行目が True、2行目が False
正解と解説
正解:D. 1行目が True、2行目が False

スライスは範囲が文字列の長さを超えていても例外にならず、重なっている部分だけを返す。'Python' は6文字しかないので s[100:200] は空文字列となり、空文字列との比較は True になる。単独の添字 s[100] であれば IndexError になるので、そこが対照的である。2行目の in 演算子は部分文字列の有無を調べるが、大文字と小文字を区別するため、小文字の 'py' は 'Python' には含まれず False になる。'Py' や 'th' であれば True である。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問23|文字列は不変

次のプログラムをファイルに書いて実行すると、どうなるか。

s = 'abc's[0] = 'z'print(s)
  1. zbc に置き換わって出力される
  2. abc のまま変わらず出力される
  3. TypeError になり代入できない
  4. IndexError になり代入できない
正解と解説
正解:C. TypeError になり代入できない

str はイミュータブル、つまり生成後に中身を変更できない型なので、添字を使って一部の文字だけを書き換えることはできない。s[0] = 'z' は TypeError: 'str' object does not support item assignment となり、そこで止まるので print も実行されない。IndexError は添字が範囲外のときに出るものだが、ここでは 0 は正しい範囲内なので別の話である。中身を変えたいときは s = 'z' + s[1:] のように新しい文字列を作って結び直す。リストはミュータブルなので、同じ書き方で要素を書き換えられる。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問24|メソッドの戻り

文字列メソッドを呼ぶ次のプログラムの出力はどれか。

s = 'exam's.upper()print(s)print(s.replace('e', 'E'))
  1. 1行目が exam、2行目が Exam
  2. 1行目が EXAM、2行目が Exam
  3. 1行目が exam、2行目が exam
  4. 1行目が EXAM、2行目が EXAM
正解と解説
正解:A. 1行目が exam、2行目が Exam

文字列メソッドは元の文字列を書き換えず、新しい文字列を作って返す。2行目の s.upper() は 'EXAM' を作るが、どこにも代入していないのでその値は捨てられ、s は 'exam' のままである。したがって print(s) の出力は exam になる。4行目は s.replace('e', 'E') の戻り値をそのまま表示しているので Exam が出るが、これも s 自体は変えていない。結果を残したいときは s = s.upper() のように代入し直す。リストの sort() のように、その場で並べ替えて None を返すメソッドとは対照的である。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問25|f-string

書式を指定して表示する次のプログラムの出力はどれか。

n = 2.71828print(f'{n:.2f}')print(f'{"ok"!r}')
  1. 1行目が 2.71、2行目が 'ok'
  2. 1行目が 2.718、2行目が ok
  3. 1行目が 2.72、2行目が 'ok'
  4. 1行目が 2.72、2行目が ok
正解と解説
正解:C. 1行目が 2.72、2行目が 'ok'

f-string の書式指定 :.2f は小数点以下を2桁に丸めて表示するので、2.71828 は 2.72 になる。切り捨てではないので 2.71 にはならず、2.718 は :.3f と書いた場合の値である。2行目の !r は変換指定で、値を repr() の形で表示する。文字列に対して使うとクォートが付くので 'ok' となり、!r を付けなければ ok とだけ出る。書式指定の文法は str.format() と共通なので、'{n:.2f}'.format(n=2.71828) と書いても同じ 2.72 が得られる。

根拠:Python Software Foundation「Python チュートリアル 7. 入力と出力」Python 3.14 ドキュメント(2026年8月確認)

問26|split

文字列を分割する次のプログラムの出力はどれか。

print('a b  c'.split())print('a,b,c'.split(',', 1))
  1. ['a', 'b', '', 'c'] と ['a', 'b,c']
  2. ['a', 'b', 'c'] と ['a', 'b', 'c']
  3. ['a', 'b', '', 'c'] と ['a', 'b', 'c']
  4. ['a', 'b', 'c'] と ['a', 'b,c']
正解と解説
正解:D. ['a', 'b', 'c'] と ['a', 'b,c']

split() を引数なしで呼ぶと、連続する空白をひとまとめの区切りとして扱い、空の要素を作らない。そのため 'a b c'.split() は3要素の ['a', 'b', 'c'] になる。区切り文字を明示して 'a b c'.split(' ') と書いた場合は空白1つずつで切るので、空文字列が残って ['a', 'b', '', 'c'] という4要素になる。第2引数は maxsplit で分割回数の上限を表し、1 を渡すと最初の1回だけ切るので ['a', 'b,c'] となり、残りは切らずに1つの要素にまとまる。省略すれば ['a', 'b', 'c'] と全部が切れる。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問27|strip

両端の文字を削る次のプログラムの出力はどれか。

print('xxabxx'.strip('x'))print('xxabxx'.lstrip('x'))
  1. 1行目が ab、2行目が xxab
  2. 1行目が ab、2行目が abxx
  3. 1行目が abxx、2行目が ab
  4. 1行目が xabx、2行目が abxx
正解と解説
正解:B. 1行目が ab、2行目が abxx

strip() の引数は「取り除く文字の集合」であり、両端からその集合に含まれる文字が続くかぎり削り続ける。部分文字列としての 'x' を1つだけ消すわけではないので、'xxabxx'.strip('x') は両端の x をすべて落として ab になる。1文字ずつしか消さないと考えると xabx を選んでしまう。lstrip() は左端だけを対象にするので abxx、rstrip() は右端だけなので xxab になる。引数を省略すると空白文字を削る。集合として扱われるため、'xxabxx'.strip('xa') と書くと左端の xx と a まで落ちて b だけが残る。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問28|joinと繰り返し

文字列をつなぐ次のプログラムの出力はどれか。

print('-'.join('abc'))print('ab' * 3)
  1. 1行目が a-b-c、2行目が ababab
  2. 1行目が abc、2行目が ababab
  3. 1行目が -a-b-c-、2行目が ababab
  4. 1行目が a-b-c、2行目が ab ab ab
正解と解説
正解:A. 1行目が a-b-c、2行目が ababab

join() は呼び出し側の文字列を区切りとして、渡された反復可能オブジェクトの各要素をつなぐ。文字列も1文字ずつを取り出せる反復可能オブジェクトなので、'-'.join('abc') は 'a' と 'b' と 'c' をハイフンでつないで a-b-c になる。区切りは要素と要素のあいだにだけ入るので、先頭や末尾には付かず -a-b-c- にはならない。区切りが入らない abc になるのは ''.join('abc') と書いた場合である。* 演算子は文字列を指定回数だけ繰り返すので 'ab' * 3 は ababab となり、あいだに空白は入らない。ab ab ab が欲しいなら ' '.join(['ab'] * 3) と書く。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問29|findとindex

部分文字列を探す次のプログラムの出力はどれか。

print('banana'.find('z'))print('banana'.index('n'))
  1. 1行目が -1、2行目が 4
  2. 1行目が 0、2行目が 2
  3. 1行目が -1、2行目が 2
  4. 1行目が -1、2行目が 3
正解と解説
正解:C. 1行目が -1、2行目が 2

find() は部分文字列が見つからないとき -1 を返し、例外にはならない。'banana' に 'z' は無いので -1 である。0 は先頭で見つかったときの値なので、見つからない場合と取り違えないようにしたい。index() は見つかった位置を返す点では find() と同じで、'banana' の中で 'n' が最初に現れるのは添字2なので 2 になる。3 になるのは添字を1から数えて「3文字目」と読んだ場合、4 は最後に現れる位置で、これを得たいときは rfind() や rindex() を使う。両者の違いは見つからなかったときだけで、index() は ValueError: substring not found を送出して処理を止める。

根拠:Python Software Foundation「Python 標準ライブラリ 組み込み型」Python 3.14 ドキュメント(2026年8月確認)

問30|raw文字列

文字数を数える次のプログラムの出力はどれか。

print(len(r'a\nb'), len('a\nb'))
  1. 4 3
  2. 3 3
  3. 4 4
  4. 3 4
正解と解説
正解:A. 4 3

リテラルの前に r を付けた raw文字列では、バックスラッシュがエスケープの開始として解釈されない。r'a\nb' は a、バックスラッシュ、n、b の4文字なので len は 4 になる。一方、通常の文字列 'a\nb' では \n が改行1文字に置き換わるため、a、改行、b の3文字で len は 3 である。両方をエスケープとして数えると 3 3、両方を生の文字として数えると 4 4 になるが、r の有無で扱いが変わるところが要点である。r を付けても型は通常の str のままで、特別な型になるわけではない。なお len('\\') は 1 で、バックスラッシュ1文字を書くために2つ重ねている。

根拠:Python Software Foundation「Python 言語リファレンス 2. 字句解析」Python 3.14 ドキュメント(2026年8月確認)

演習:この章の問題を解く

ランダム出題の演習ツールです(JavaScript が有効な場合に動きます)。上の「確認問題」はそのままでもすべて読めます。

※ 解説は学習用の情報提供です。最新の出題範囲・制度は必ず公式発表をご確認ください。
※ 出題は、AWS公式ドキュメント・試験ガイド、JDLA「G検定 試験出題範囲(シラバス2024)第1.4版」、一般社団法人Pythonエンジニア育成推進協会の公開情報とPython公式ドキュメントに沿った仮の宿 学習室のオリジナル問題です(2026年8月時点で確認)。Pythonの問題はすべて実行して確認しています。試験制度・出題範囲は各実施団体の公式発表をご確認ください。