Python是否有任何for循环等效(不是foreach)

EMP*_*EMP 12 python loops for-loop

Python的迭代器很棒,但有时候我确实想要一个C风格的循环 - 而不是一个foreach循环.例如,我有一个开始日期和结束日期,我想在该范围内的每一天做一些事情.当然,我可以使用while循环执行此操作:

    current = start
    while current <= finish:
        do_stuff(current)
        current += timedelta(1)
Run Code Online (Sandbox Code Playgroud)

这是有效的,但它是3行而不是1行(在基于C或C的语言中),我经常发现自己忘记编写递增行,特别是如果循环体非常复杂.在Python中有没有更优雅,更不容易出错的方法?

Ned*_*der 29

优雅和Pythonic的方法是在自己的生成器中封装一系列日期的想法,然后在代码中使用该生成器:

import datetime

def daterange(start, end, delta):
    """ Just like `range`, but for dates! """
    current = start
    while current < end:
        yield current
        current += delta

start = datetime.datetime.now()
end = start + datetime.timedelta(days=20)

for d in daterange(start, end, datetime.timedelta(days=1)):
    print d
Run Code Online (Sandbox Code Playgroud)

打印:

2009-12-22 20:12:41.245000
2009-12-23 20:12:41.245000
2009-12-24 20:12:41.245000
2009-12-25 20:12:41.245000
2009-12-26 20:12:41.245000
2009-12-27 20:12:41.245000
2009-12-28 20:12:41.245000
2009-12-29 20:12:41.245000
2009-12-30 20:12:41.245000
2009-12-31 20:12:41.245000
2010-01-01 20:12:41.245000
2010-01-02 20:12:41.245000
2010-01-03 20:12:41.245000
2010-01-04 20:12:41.245000
2010-01-05 20:12:41.245000
2010-01-06 20:12:41.245000
2010-01-07 20:12:41.245000
2010-01-08 20:12:41.245000
2010-01-09 20:12:41.245000
2010-01-10 20:12:41.245000
Run Code Online (Sandbox Code Playgroud)

这类似于答案range,除了内置函数range不适用于日期时间,所以我们必须创建自己的,但至少我们只能以封装的方式执行一次.

  • +1不仅因为它是**真正有效**的唯一答案,而且因为它是正确的。说真的,不要投票给那些“看起来不错”的答案 (2认同)