プログラムとか 思ったこととか 徒然ブログ 投稿一覧へ戻る

タグ "iterable" が付いている投稿一覧

【Python 雑談・雑学 + coding challenge】iterator protocol の実装 --- __iter__ 特殊関数は何を返すべき? イテレータオブジェクト ( iterator object ) なら何でも、そう、generator expression でもOKです!

Tags: Python , generator , iterable , iterator , __iter__ , miscellaneous , challenge , __next__ , stopiteration

Published 2020年8月13日17:06 by T.Tsuyoshi

さて、今回もちょっとしたコーディングチャレンジ ( coding challenge ) から。 問題 ( 制限時間: 25 分 ): 2 つの引数 (シーケンスと数値) を取るイテラブルクラス ( iterable class ) …

【 Effective Python, 2nd Edition 】throw() メソッドを利用したジェネレータ ( generator ) 内部での状態遷移はなるだけ避けましょう。ネストが深くなってコードの読解性が落ちちゃいますよ!

Tags: Python , generator , iterable , send , iterator , yield , Effective , throw

Published 2020年7月4日23:31 by T.Tsuyoshi

yield from 文や send() メソッドに加えて、ジェネレータを使う際にあまり利用されていない機能として throw() メソッドがあります。 ジェネレータが throw() メソッドによって呼び出されると、再開した時点の、すなわち、前回終了した時点の yield 式自体が渡された例外を即座に投げます。 そして、ジェネレータ内でその例外をキャッチしない場合、呼び出し元にその例外を投げてジェネレータはその時点で動作を終了します。 class MyError(Exception): pass def my_generator(): yield 1 …

【 Effective Python, 2nd Edition 】引数として受け取った値を関数内で複数回「消費」する場合には要注意! イテレータ ( iterator ) とコンテナ ( container ) の違いをちゃんと認識しよう!

Tags: Python , generator , iterable , iterator , Effective , container , protocol

Published 2020年6月29日20:44 by T.Tsuyoshi

関数が引数としてリストをとる場合、そのリストを関数内部で複数回参照することはよくあります。 例えば、台湾旅行に行った日本人が訪れた観光地ごとの訪問者数のリストがあるとします (千人/年)。 そして人気度をみるために、それぞれの観光地が占める割合を計算したいとしましょう。 そのためには、まず訪問者数の合計を求め、続けて、それぞれの観光地の訪問数をその合計で割ることになりますね。 def normalize(numbers): total = sum(numbers) print(f"合計訪問者数: {total}") result = [] for value in numbers: percent …

【 Effective Python, 2nd Edition 】アンパックのちょっとした使い方 - 1: 一時変数を使わずにスワップする、2: インデックス番号を用いないでネストしている iterable の要素を取り出す -

Tags: Python , iterable , enumerate , unpack , swap , Effective

Published 2020年6月10日16:03 by T.Tsuyoshi

1: 次のようなリストをアルファベット順に並べ替えるとします( sort() を使っちゃダメですよ)。 friends = ['Hana', 'Yuka', 'Nana', 'Saki'] Python に馴染みが薄い方は、次のように一時変数を利用して入れ替えを行うと思います。 def bubble_sort(a): for _ in range(len(a)): for i …

Python Cookbook [Implementing the Iterator Protocol : イテレータープロトコルの実装]

Tags: Python , Cookbook , generator , iterable , iteration , iterator , yield

Published 2020年5月9日9:29 by T.Tsuyoshi

Problem: イテレーションをサポートするカスタムオブジェクトを作成したいが、イテレータプロトコルの実装では苦労したくない。 Solution: イテレーションをサポートするオブジェクトを作成する一番簡単な手段は generator 関数を利用することでしょう。 " Delegating Iteration " の項で取り上げたクラスを再利用してみます。 今回は Node クラスとしてツリー構造を模倣し、ルート階層から子階層へとノードを縦断していくようなイテレータを実装します。 class Node: def __init__(self, value): self._value …