2017-11-02 1 views
0

저는 파이썬의 생성자와 약간 혼동 스러우며 for 루프를 사용하여 대 next()을 사용합니다.파이썬 생성기 for..in vs next()

각 줄에 자동차 정보 (예 : a.으로 시작하는 모델 이름의 필수 줄 다음에 여러 개의 필수가 아닌 줄이 있음)가 포함 된 텍스트 파일을 구문 분석해야합니다. 그래서 저는 파이썬적인 방식으로 자동차를 반복하고 싶습니다.

I는 다음 코드 비트 가지고

lines = """a. car1 model 
b. car1 price 
c. car1 details 
a. car2 model 
b. car2 price 
a. car3 model 
b. car3 price 
c. car3 details 
d. car3 comments 
""" 

def iter_cars(lineit): 
    res = [] 
    for line in lineit: 
     if line.startswith('a') and res: 
      yield res 
      res = [] 

     res.append(line) 
    yield res 

# print the cars with next..., 
lineit = iter(lines.split('\n')) 
print(next(iter_cars(lineit))) 
print(next(iter_cars(lineit))) 
print(next(iter_cars(lineit))) 

# reset the iterator and print the cars with for 
lineit = iter(lines.split('\n')) 
for car in iter_cars(lineit): 
    print(car) 

출력은 :

# using next() 
a. car1 model 
b. car1 price 
c. car1 details 

b. car2 price 

b. car3 price 
c. car3 details 
d. car3 comments 


# using for..in 
a. car1 model 
b. car1 price 
c. car1 details 

a. car2 model 
b. car2 price 

a. car3 model 
b. car3 price 
c. car3 details 
d. car3 comments 

이유는 두 개의 출력이 다르다? next()가 첫 번째 이후 각 차량의 a. 라인을 건너 뛰는 이유는 무엇입니까? next()을 사용하면 for..in을 사용할 때와 동일한 결과가 나오도록 반복기를 다시 작성할 수 있습니까?

답변

5

매번 생성기를 인스턴스화합니다. 이것을 사용해보십시오

gen = iter_cars(lineit) 
print(next(gen)) 
print(next(gen)) 
print(next(gen)) 
+0

그게 전부입니다! 너무 바보 같아. 고마워요! –

+1

문제 없습니다, 아름다운 하루 되세요! – jalanga

+1

감사합니다. :) –