python:反復器、ジェネレータ

11081 ワード

反復可能オブジェクト:内部に'_が含まれていますiter__’メソッドのオブジェクト
メリット:
保存されたデータは直接表示でき、比較的直感的である.
持つ方法が多い
欠点:
メモリ使用量
直接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]