Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
callable() / iter() / next()
オブジェクトが呼び出し可能かどうかの確認や、イテレータの作成・手動での要素取得を行う組み込み関数です。
構文
# オブジェクトが呼び出し可能(関数・クラスなど)か確認します。 callable(オブジェクト) # イテラブルからイテレータを作成します。 iter(オブジェクト) iter(呼び出し可能オブジェクト, 番兵値) # イテレータから次の要素を取得します。 next(イテレータ, デフォルト値) # オブジェクトのハッシュ値を返します。 hash(オブジェクト)
関数一覧
| 関数 | 概要 |
|---|---|
| callable(obj) | オブジェクトが呼び出し可能であれば True を返します。関数・クラス・__call__ を持つオブジェクトが対象です。 |
| iter(obj) | イテラブルオブジェクトからイテレータを生成します。2引数形式では番兵値まで繰り返し呼び出します。 |
| next(iterator, default) | イテレータの次の要素を返します。要素がなくなったとき、default を指定していれば返し、なければ StopIteration を発生させます。 |
| hash(obj) | オブジェクトのハッシュ値(整数)を返します。辞書のキーやセットの要素に使えるオブジェクトが対象です。 |
サンプルコード
# callable() でオブジェクトが呼び出し可能か確認します。
def greet():
return "こんにちは"
print(callable(greet)) # True(関数は呼び出し可能)
print(callable(42)) # False(整数は呼び出せません)
print(callable(str)) # True(クラスは呼び出し可能)
print(callable(print)) # True(組み込み関数も呼び出し可能)
# __call__ を持つオブジェクトも呼び出し可能です。
class Multiplier:
def __init__(self, factor):
self.factor = factor
def __call__(self, x):
return x * self.factor
triple = Multiplier(3)
print(callable(triple)) # True
print(triple(5)) # 15
# iter() と next() でリストを手動で反復します。
fruits = ["りんご", "みかん", "ぶどう"]
it = iter(fruits)
print(next(it)) # りんご
print(next(it)) # みかん
print(next(it)) # ぶどう
# print(next(it)) # StopIteration が発生します。
# デフォルト値を指定すると例外が発生しません。
it2 = iter(fruits)
print(next(it2, "なし")) # りんご
print(next(it2, "なし")) # みかん
print(next(it2, "なし")) # ぶどう
print(next(it2, "なし")) # なし(要素がなくなった)
# iter() の2引数形式:番兵値が返るまで関数を繰り返し呼び出します。
import random
# random.randint が 6 を返すまで繰り返す疑似サイコロ
rolls = list(iter(lambda: random.randint(1, 6), 6))
print(f"{len(rolls)}回で 6 が出ました。")
# hash() でオブジェクトのハッシュ値を確認します。
print(hash("hello")) # 文字列のハッシュ値(実行ごとに変わります)
print(hash(42)) # 42(整数のハッシュ値は値そのものになることが多い)
print(hash((1, 2, 3))) # タプルはハッシュ可能です。
# print(hash([1, 2, 3])) # TypeError: リストはハッシュ不可能です。
概要
Pythonのfor文は内部で『iter()』でイテレータを作成し、『next()』を繰り返し呼び出してStopIterationが発生したらループを終了しています。この仕組みを理解することで、ジェネレータやカスタムイテレータの挙動が理解しやすくなります。
『next()』でデフォルト値を指定しない場合、イテレータが空になるとStopIteration 例外が発生します。ループ外で『next()』を使う場合は必ずデフォルト値を指定するか、try-except で例外を捕捉してください。
『hash()』はリストや辞書など、変更可能(ミュータブル)なオブジェクトには使えません。辞書のキーやセットの要素に使えるのはハッシュ可能(イミュータブル)なオブジェクトだけです。独自クラスでハッシュを有効にするには『__hash__()』メソッドを実装します。ファイルを反復処理する場合は『open()』を参照してください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。