python:反復器、ジェネレータ
11081 ワード
反復可能オブジェクト:内部に'_が含まれていますiter__’メソッドのオブジェクト
メリット:
保存されたデータは直接表示でき、比較的直感的である.
持つ方法が多い
欠点:
メモリ使用量
直接forサイクルで値を取ることはできません.内部で反復器に変換します.
反復器
反復可能オブジェクトを反復に変換
ビルダー
ジェネレータ:反復器で見ることができるのは一種で、ジェネレータの本質は反復器です
生成は私たち自身がpythonコードで構築したデータ構造であり、反復器はpythonが提供したり、変換したりします.
ジェネレータを取得するには、次の3つの方法があります.
ジェネレータ関数で自分で書く
ジェネレータ式で自分で書く
python内部提供
yield from反復可能なオブジェクトをジェネレータに変更
ジェネレータ式取得ジェネレータ
ジェネレータに値を生成させる3つの方法:next(),forループ,list(),本質はnext()を呼び出す.
メリット:
保存されたデータは直接表示でき、比較的直感的である.
持つ方法が多い
欠点:
メモリ使用量
直接forサイクルで値を取ることはできません.内部で反復器に変換します.
# dir():
s1 = 'abcde'
print(dir(s1)) # list, s1 ,
print('__iter__' in dir(s1)) #
反復器
'''
: '__iter__' '__next__'
'__next__' , for
:'__iter__' in dir(f1) and '__next__' in dir(f1)
iter(object)/object.__iter__() ,
next(object)/object.__next__() ,
, , , ,
:
:next , next
:
'''
反復可能オブジェクトを反復に変換
s = [11,22,33,44]
obj = s.__iter__() # iter(s), s , obj
print(s) # [11, 22, 33, 44]
print(obj) #
s = [11,22,33,44]
obj = s.__iter__()
print(obj.__next__()) # 11, next(obj), '__next__()' ,
print(next(obj)) # 22
print(obj.__next__()) # 33
# while for
s = [11,22,33,44,55,66,77,88]
obj = iter(s)
while 1:
try:
print(next(obj))
except StopIteration:
break
s = [11,22,33,44,55,66,77,88,99]
obj = iter(s)
for i in range(4):
print(next(obj))
for j in range(4):
print(obj.__next__())
ビルダー
ジェネレータ:反復器で見ることができるのは一種で、ジェネレータの本質は反復器です
生成は私たち自身がpythonコードで構築したデータ構造であり、反復器はpythonが提供したり、変換したりします.
ジェネレータを取得するには、次の3つの方法があります.
ジェネレータ関数で自分で書く
ジェネレータ式で自分で書く
python内部提供
# yield, , yield
# yield ,
def fun():
print(111)
yield 3 # next(), , 3 , , next()
print(222)
yield 4
ret = func() # yield, ,
print(ret) #
print(next(ret)) # 111 3 next, yield,
print(next(ret)) # yield , next, yield
#
def func():
for i in range(1,50):
yield f'{i} '
ret = func()
for i in range(10):
print(next(ret))
yield from反復可能なオブジェクトをジェネレータに変更
def func():
l1 = [1,2,3,4,5]
yield l1
ret = func()
print(ret) #
print(next(ret)) # [1, 2, 3, 4, 5]
def func1():
l2 = [1,2,3,4,5]
yield from l2 # yield from list
ret = func1() # ret
for i in ret: # for ,
print(i)
def func():
list1 = [1,2,3,4,5]
list2 = [6,7,8,9,0]
yield from list1
yield from list2
ret = func()
for i in ret:
print(i) # 1 2 3 4 5 6 7 8 9 0
ジェネレータ式取得ジェネレータ
ret = (i for i in range(1,11))
print(ret) # at 0x00000000023E8570>
for i in ret:
print(i)
ジェネレータに値を生成させる3つの方法:next(),forループ,list(),本質はnext()を呼び出す.
# list(generator) , list
def chain(*iterables):
for it in iterables:
for i in it:
yiled i
ret = chain('abc',(1,2,3))
print(ret) #
print(list(ret)) # ['a', 'b', 'c', 0, 1, 2]
def chain(*iterables):
for it in iterables:
yield from it
ret = chain('abc',(1,2,3))
print(list(ret)) # ['a', 'b', 'c', 0, 1, 2]