python生成器for..in vs next()

Nin*_*els 0 python parsing iterator for-loop generator

我对python的生成器有点困惑,并使用for循环vs使用next()它们.

我需要解析一个文本文件,其中包含有关每条线路上汽车的信息,每条汽车在强制性线路后面有多条非强制性线路,型号名称以a开头a..所以我想以pythonic的方式迭代汽车.

我有以下一点代码:

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)
Run Code Online (Sandbox Code Playgroud)

输出是:

# 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
Run Code Online (Sandbox Code Playgroud)

为什么两个输出不同?为什么在第一辆车之后next()跳过a.每辆车的线路?我怎样才能重写迭代器,以便使用next()yield(笑)与使用相同的结果for..in

jal*_*nga 5

你每次都要实例化生成器.试试这个

gen = iter_cars(lineit)
print(next(gen))
print(next(gen))
print(next(gen))
Run Code Online (Sandbox Code Playgroud)