我对python的生成器有点困惑,使用for
循环与在它们上使用next()
。
我需要解析一个文本文件,其中包含有关以下信息的信息,即每行上的汽车,每辆车在强制行之后有多个非强制性行,型号名称以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)
输出为:
# 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
相同的结果?
您
每次都在实例化生成器。试试这个
gen = iter_cars(lineit)
print(next(gen))
print(next(gen))
print(next(gen))