使递归函数返回列表而不是使用全局变量

时间:2014-04-10 17:51:47

标签: python function recursion global

unsampled_date_ranges = []

def recursive(start, end, datelist):

    results = ga.GAnalytics().create_query(profile_id, 
                             metrics, 
                             start,
                             end,
                             dimensions).execute()

    if results.get("containsSampledData") is True:

        x = len(datelist) / 2

        recursive(datelist[0],datelist[:x][-1],datelist[:x])
        recursive(datelist[x:][0],datelist[-1],datelist[x:])

    else:

        global unsampled_date_ranges

        unsampled_date_ranges.append((start, end))


recursive(start_date, end_date, date_list)
print unsampled_date_ranges

上述功能根据开始日期和结束日期获取开始日期,结束日期和包含日期的列表。如果首先检查是否对初始日期范围返回的数据进行了采样,如果采样,则将日期范围分成两半然后进行检查,依此类推。

目前正在按预期工作,但我知道使用全局变量不是最佳实践,因此我正在寻找有关如何放弃使用全局变量以及如何让我的函数返回列表的指导。

2 个答案:

答案 0 :(得分:2)

变化:

def recursive(start, end, datelist)
...
recursive(datelist[0],datelist[:x][-1],datelist[:x])
recursive(datelist[x:][0],datelist[-1],datelist[x:])
...
recursive(start_date, end_date, date_list)
print unsampled_date_ranges

为:

def recursive(start, end, datelist, unsampled_date_ranges)
...
recursive(datelist[0],datelist[:x][-1],datelist[:x], unsampled_date_ranges)
recursive(datelist[x:][0],datelist[-1],datelist[x:], unsampled_date_ranges)
...
unsampled_date_ranges = []
recursive(start_date, end_date, date_list, unsampled_date_ranges)
print unsampled_date_ranges

然后删除全局行

答案 1 :(得分:1)

作为传入将附加到的列表对象的替代方法,您可以动态创建一个并将结果组合在一起。

def recursive(start, end, datelist):

    results = ga.GAnalytics().create_query(profile_id, 
                             metrics, 
                             start,
                             end,
                             dimensions).execute()

    if results.get("containsSampledData") is True:

        x = len(datelist) / 2
        return recursive(datelist[0],datelist[:x][-1],datelist[:x]) + recursive(datelist[x:][0],datelist[-1],datelist[x:])

    else:
        return [start, end]


unsampled_date_ranges = recursive(start_date, end_date, date_list)
print unsampled_date_ranges

这种方式需要更多内存,因为它在每个步骤中创建临时列表,但您可能会认为这可以忽略不计,具体取决于数据的大小。

顺便说一下,将基本案例放在递归函数中是常规的,所以你可能想要交换if / else块的逻辑。

def recursive(start, end, datelist):

    results = ga.GAnalytics().create_query(profile_id, 
                             metrics, 
                             start,
                             end,
                             dimensions).execute()

    if not results.get("containsSampledData"):
        return [start, end]    
    else:
        x = len(datelist) / 2
        return recursive(datelist[0],datelist[:x][-1],datelist[:x]) + recursive(datelist[x:][0],datelist[-1],datelist[x:])