编辑:我想查看使用该next语句的解决方案。我正在访问一个返回json对象的天气应用程序API,该对象的一部分信息是每天的日出和日落时间,这是它的内容(三天):
my_dict = {
"daily": [
{
"dt": "2020-06-10 12:00:00+01:00",
"sunrise": "2020-06-10 05:09:15+01:00",
"sunset": "2020-06-10 19:47:50+01:00"
},
{
"dt": "2020-06-11 12:00:00+01:00",
"sunrise": "2020-06-11 05:09:11+01:00",
"sunset": "2020-06-11 19:48:17+01:00"
},
{
"dt": "2020-06-12 12:00:00+01:00",
"sunrise": "2020-06-12 05:09:08+01:00",
"sunset": "2020-06-12 19:48:43+01:00"
}
]
}
Run Code Online (Sandbox Code Playgroud)
这是应该每天返回一个元组的函数,但它没有。它不断返回同一天(第一天)的一组数据。
daily_return = my_dict['daily']
def forecast(daily_return):
# daily_return is a list
for day in daily_return:
# day becomes a dict
sunrise = day['sunrise']
sunset = day['sunset']
yield sunrise, sunset
for i in range(3):
print(next(forecast(daily_return)))
Run Code Online (Sandbox Code Playgroud)
这是输出:
('2020-06-10 05:09:15+01:00', '2020-06-10 19:47:50+01:00')
('2020-06-10 05:09:15+01:00', '2020-06-10 19:47:50+01:00')
('2020-06-10 05:09:15+01:00', '2020-06-10 19:47:50+01:00')
Run Code Online (Sandbox Code Playgroud)
因为您每次循环时都会启动生成器,而不是循环范围,只需迭代生成器:
for sunrise, sunset in forecast(daily_return):
print(sunrise, sunset)
Run Code Online (Sandbox Code Playgroud)
如果您只想要前 3 个,您可以将其压缩为一个范围或使用itertools.islice@cs95 所示:
for sunrise, sunset, _ in zip(forecast(daily_return), range(3)):
print(rise, set)
Run Code Online (Sandbox Code Playgroud)
如果必须使用,next则在循环外启动生成器:
gen = forecast(daily_return)
for i in range(3):
print(next(gen))
Run Code Online (Sandbox Code Playgroud)
您还可以使用operator.itemgetter来实现相同的功能而不是您的自定义功能:
from operator import itemgetter
from itertools import islice
forecast_gen = map(itemgetter('sunrise', 'sunset'), daily_return)
for sunrise, sunset in islice(forecast_gen, 3):
print(sunrise, sunset)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
294 次 |
| 最近记录: |