복붙노트

[PYTHON] 파이썬에서 생성자와 for 루프

PYTHON

파이썬에서 생성자와 for 루프

그래서 나는 이와 같이 보이는 생성 함수를 가지고 있습니다.

def generator():
    while True:
        for x in range(3):
            for j in range(5):
                yield x

이 함수를로드하고 "다음"을 여러 번 호출하면 값을 산출 할 것으로 기대합니다.

0 0 0 0 0 1 1 1 1 1 2 2 2 2 2 0 0 0 0 0 ...

하지만 대신에 항상 0을 얻습니다. 왜 그런가요?

>>> execfile("test.py")
>>> generator
<function generator at 0x10b6121b8>
>>> generator().next()
0
>>> generator().next()
0
>>> generator().next()
0
>>> generator().next()
0
>>> generator().next()
0
>>> generator().next()
0
>>> generator().next()
0

해결법

  1. ==============================

    1.generator ()는 새로운 생성자 객체를 초기화합니다.

    generator ()는 새로운 생성자 객체를 초기화합니다.

    In [4]: generator() is generator() # Creating 2 separate objects
    Out[4]: False
    

    그런 다음 generator (). next ()가 새로 생성 된 생성기 객체의 첫 번째 값을 가져옵니다 (사용자의 경우 0).

    발전기를 한 번 호출해야합니다.

    In [5]: gen = generator() # Storing new generator object, will reuse it
    
    In [6]: [gen.next() for _ in range(6)] # Get first 6 values for demonstration purposes
    Out[6]: [0, 0, 0, 0, 0, 1]
    

    참고 : generator.next가 Python 3 (PEP 3114)에서 제거되었습니다. 대신 다음 함수를 사용하십시오.

    In [7]: next(gen)
    Out[7]: 1
    
  2. ==============================

    2.생성기를 호출 할 때마다 새 생성기 객체를 만듭니다.

    생성기를 호출 할 때마다 새 생성기 객체를 만듭니다.

    generator().next() # 1st item in 1st generator 
    generator().next() # 1st item in 2nd generator
    

    하나의 발전기를 생성하고 다음 항목에 대해 다음 호출 :

    g = generator()
    
    g.next() # 1st item in 1st generator
    g.next() # 2nd item in 1st generator
    
  3. ==============================

    3.내가 코멘트에 글을 적었을 때, 당신이 실수로 보는 질문과 병행하여 이것을 보았다고 생각한다.

    내가 코멘트에 글을 적었을 때, 당신이 실수로 보는 질문과 병행하여 이것을 보았다고 생각한다.

    with open('my_file.txt', 'r') as f: 
        print(f.readline())               # `readline` simply reads a single line
    
    with open('my_file.txt', 'r') as f: 
        print(f.readline())
    
    with open('my_file.txt', 'r') as f: 
        print(f.readline())
    
    with open('my_file.txt', 'r') as f: 
        print(f.readline())    
    

    매번 새로운 생성기 객체를 만드는 대신, 한번 생성 한 다음 고갈 될 때까지 사용해야합니다.

    mygen = generator()
    mygen.next()
    mygen.next()
    ...
    etc
    
  4. from https://stackoverflow.com/questions/29570348/generators-and-for-loops-in-python by cc-by-sa and MIT license