0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python初心者】アンパックはエラーになるのに、zipはエラーにならない理由を整理してみた

Posted at

Pythonの学習中に、こんな違いに気づきました。

アンパック代入は要素数が合っていないとエラーになるのに、zip関数はそうじゃない…?
これって何が違うんだろう?

自分なりに調べてみた内容を、Python初心者向けにまとめてみます。

アンパック代入とは?

まず、アンパックとは「リストやタプルなどの中身を複数の変数に一度に代入する書き方」です。

a, b, c = [1, 2, 3]
print(a, b, c)  # 1 2 3

しかし、右辺の要素数と左辺の変数の数が一致していないとエラーになります。

a, b, c, d = "aiu"  # 要素が3つしかない
# 実行結果(エラー)
ValueError: not enough values to unpack (expected 4, got 3)

このように、アンパックは**「個数がぴったり一致している」ことが絶対条件**です。

zip関数とは?

一方で、zip関数は「複数のイテラブル(例:リスト、文字列など)をまとめて処理するための関数」です。

list(zip([1, 2, 3], ['a', 'b', 'c']))
# 実行結果
[(1, 'a'), (2, 'b'), (3, 'c')]

要素数が合ってなくてもOK!

list(zip([1, 2, 3], ['a', 'b']))
# 実行結果(エラーなし)
[(1, 'a'), (2, 'b')]

zipは、一番短いイテラブルに合わせて出力してくれます。
この仕様のおかげで、アンパックとは違って要素数のズレでエラーになることがありません。

for文での使い方も比較してみる

アンパックでエラーになる例

a, b = [1, 2, 3]  # 変数が2つなのに要素が3つ → エラー
# 実行結果
ValueError: too many values to unpack (expected 2)

zipを使ったループは安全

for x, y in zip("abc", [1, 2]):
    print(x, y)
# 実行結果
a 1
b 2

zipは余った要素を自動的に無視してくれるため、ループ処理にも便利です。

表で整理してみる

比較項目 アンパック代入 zip関数
要素数の一致 必要(違うとエラー) 不要(短い方に合わせる)
エラーの可能性 あり(ValueError) 原則なし
イテラブルの扱い 各要素を個別に代入 複数イテラブルの同時処理
for文との相性 要素数が合わないとエラー 柔軟に扱える(長さが違ってもOK)

補足:zipの中身はイテレータ

zip関数は イテレータ を返します。
必要に応じて list() などで展開して中身を見ます。

z = zip([1, 2], ['a', 'b'])
print(z)          # <zip object at ...>
print(list(z))    # [(1, 'a'), (2, 'b')]

一度 list(z) で中身を取り出すと、zipオブジェクトは使い切られる点にも注意が必要です。

まとめ

  • アンパックは「要素数が一致しないとエラー」になる
  • zipは「最も短いイテラブルに合わせて処理」されるためエラーにならない
  • 初心者目線だと混乱しやすい違いだが、役割や設計思想がそもそも違う

以上、Python学習中のメモとして「アンパックとzipの違い」を整理してみました。
どなたかの学習の参考になればうれしいです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?