3️⃣アンパック演算子としての ``*``, ``**`` ============================================================ 使ったことある方〜?🙋‍♂️🙋‍♀️ 2つのアンパック演算子 -------------------------------------------------- * (A)イテラブルアンパック演算子 * (B)辞書アンパック演算子 用語は「`What's New In Python 3.5 `_」より 3️⃣-🅰️ イテラブルアンパック演算子 ``*`` ============================================================ イテラブルとは(`用語集 `_ より) ---------------------------------------------------------------------------------------------------- 要素を一度に 1 つずつ返せるオブジェクト 「反復可能オブジェクト」 これらがイテラブル(用語集より) -------------------------------------------------- * シーケンス(リスト、文字列、タプルなど) * 辞書 * ファイルオブジェクト * など(※自作もできます) イテラブルアンパック演算子を使ってみる -------------------------------------------------- .. code-block:: python >>> # タプル (1, 2) は(シーケンスであり)イテラブル >>> [*(1, 2)] [1, 2] タプルと同じ要素を持つリストを作る方法の1つ イテラブルアンパック演算子で新しいリストを作る -------------------------------------------------- .. code-block:: python >>> [*(1, 2), 3] [1, 2, 3] タプルと同じ要素 + 加えた要素 他のイテラブルでも新しいリスト作り -------------------------------------------------- .. code-block:: python >>> [0, *[1, 2]] [0, 1, 2] >>> [*range(2), 2] [0, 1, 2] >>> [*"12", 3] ['1', '2', 3] 新しいタプルも作れます -------------------------------------------------- .. code-block:: python >>> (*(1, 2), 3) (1, 2, 3) カッコつけずに書けます(タプルの肝はカンマ) -------------------------------------------------- .. code-block:: python >>> *(1, 2), 3 # (*(1, 2), 3) をカッコつけずに (1, 2, 3) >>> *(1, 2), # (*(1, 2),) をカッコつけずに (1, 2) >>> *(1, 2) # doctest: +SKIP File "", line 1 SyntaxError: can't use starred expression here 辞書にイテラブルアンパック演算子を使うと ------------------------------------------------------------ .. code-block:: python >>> # 辞書はイテラブル >>> fruits_prices = {"apple": 100, "banana": 50} >>> *fruits_prices, ('apple', 'banana') **キー** が取り出されます 3️⃣-🅱️ 辞書アンパック演算子 ``**`` ============================================================ 辞書アンパック演算子を使ってみる -------------------------------------------------- .. code-block:: python >>> fruits_prices = {"apple": 100, "banana": 50} >>> {**fruits_prices} {'apple': 100, 'banana': 50} キーと値の組が同じ新しい辞書を作った キーと値の組を **追加** した辞書を作れます -------------------------------------------------- .. code-block:: python >>> {**fruits_prices, "melon": 777} {'apple': 100, 'banana': 50, 'melon': 777} >>> {"melon": 777, **fruits_prices} {'melon': 777, 'apple': 100, 'banana': 50} アンパック演算子は **一度に複数** 使える! ============================================================ * Python 3.5から可能になりました * `PEP 448 – Additional Unpacking Generalizations `_ アンパック演算子を一度に複数使う例 -------------------------------------------------- .. code-block:: python >>> [*(1, 2), 3, *range(2)] [1, 2, 3, 0, 1] >>> d1, d2 = {"x": 11, "y": 22}, {"v": 101, "w": 201} >>> {**d1, "z": -33, **d2} {'x': 11, 'y': 22, 'z': -33, 'v': 101, 'w': 201} 2つの辞書をマージして新しい辞書を作りたい -------------------------------------------------- * 「forで回しているマージしているんですけど、もっとシュッと書けないですかね?」 * 💡それ、 **辞書アンパック演算子** でできます!! .. revealjs-break:: .. code-block:: python >>> d1, d2 = {"x": 11, "y": 22}, {"v": 101, "y": -22} >>> {**d1, **d2} # キーが重複したら後勝ち {'x': 11, 'y': -22, 'v': 101} プロポーザルの「私は先日2つの辞書のマージが ``*`` でスッキリ書けました」回収✌️ まとめ🥟:アンパック演算子としての ``*``, ``**`` ============================================================ .. list-table:: :widths: 45 10 45 * - **イテラブル** アンパック演算子 - ``*`` - 新しい **リストやタプル** を作れる * - **辞書** アンパック演算子 - ``**`` - 新しい **辞書** を作れる 一度に複数使える!(PEP 448) さら知り🏃‍♂️:再びの『`Python実践入門`_』がオススメ ------------------------------------------------------------ * 4.9 そのほかの型を表す概念 * シーケンスやイテラブルなど説明 * Pythonの型を学ぶのにオススメのリソース知っている方はぜひ教えてください!🙏 さら知り🏃‍♂️:過去のPyCon JPからのオススメトーク -------------------------------------------------- * 2019年 `ListはIteratorですか? `_ * 2020年 `Python Charity Talks in Japan `_ にてnext版 * `スライド `_ * `動画アーカイブ `_