Python 为什么我能';不能多次使用发电机功能?

Python 为什么我能';不能多次使用发电机功能?,python,generator,Python,Generator,我使用以下函数在多个视频帧上应用滑动窗口: def window(seq, size=3, step=1): if size < 1 or step < 1: raise ValueError("Error: infinite loops.") it = iter(seq) result = list(islice(it, size)) while len(result) == size: yield

我使用以下函数在多个视频帧上应用滑动窗口:

def window(seq, size=3, step=1):
    if size < 1 or step < 1:
        raise ValueError("Error: infinite loops.")
    it = iter(seq)
    result = list(islice(it, size))
    while len(result) == size:
        yield result
        if step >= size:
            result = list(islice(it, step-size, step))
        else:
            result = result[step:] + list(islice(it, step))
def窗口(顺序,大小=3,步骤=1):
如果尺寸小于1或步长小于1:
raise VALUERROR(“错误:无限循环”)
it=国际热核实验堆(序号)
结果=列表(islice(it,大小))
而len(结果)=大小:
产量结果
如果步骤>=大小:
结果=列表(islice(it、步长、步长))
其他:
结果=结果[步骤:]+列表(islice(it,步骤))
当我调用此函数1次时,没有出现错误,但当我多次调用此函数时,如下所示:

def window(seq, size=3, step=1):
    if size < 1 or step < 1:
        raise ValueError("Error: infinite loops.")
    it = iter(seq)
    result = list(islice(it, size))
    while len(result) == size:
        yield result
        if step >= size:
            result = list(islice(it, step-size, step))
        else:
            result = result[step:] + list(islice(it, step))



with tf.device('/gpu:1'):
    adl_window_list= []
    for items in window(adl_list,55, 5):
        if items[0][48]== items[-1][48] and items[0][49]== items[-1][49]: # Faire correspondre le même numèro de video pour le 1er et derniere élèmen de la liste
            adl_window_list.append(items)

with tf.device('/gpu:1'):
    falls_window_list= []
    for item in window(falls_list,55, 1):
        stand_indexes = [idx for idx, elem in enumerate(item) if elem.endswith("/-1")]
        fall_indexes = [idx for idx, elem in enumerate(item) if elem.endswith("/1")]
        if stand_indexes and fall_indexes and max(stand_indexes) < min(fall_indexes):
            falls_window_list.append(item)

def窗口(顺序,大小=3,步骤=1):
如果尺寸小于1或步长小于1:
raise VALUERROR(“错误:无限循环”)
it=国际热核实验堆(序号)
结果=列表(islice(it,大小))
而len(结果)=大小:
产量结果
如果步骤>=大小:
结果=列表(islice(it、步长、步长))
其他:
结果=结果[步骤:]+列表(islice(it,步骤))
使用tf.device('/gpu:1'):
adl_窗口_列表=[]
对于窗口中的项目(adl_列表,55,5):
如果项目[0][48]==项目[-1][48]和项目[0][49]==项目[-1][49]:#公平对应于一个和多个项目的视频
adl_窗口_列表。追加(项目)
使用tf.device('/gpu:1'):
落下窗口列表=[]
对于窗口中的项目(列表,55,1):
stand_INDEX=[idx代表idx,枚举(项)中的元素,如果元素endswith(“/-1”)]
fall_indexes=[idx代表idx,枚举(项)中的元素,如果元素为endswith(“/1”)]
如果站姿指数和落差指数以及最大值(站姿指数)<最小值(落差指数):
落下窗口列表。追加(项)
我犯了以下错误

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-62-081aa7b2897c> in <module>
    225 with tf.device('/gpu:1'):
    226     falls_window_list= []
--> 227     for item in window(falls_list,55, 1):
    228         stand_indexes = [idx for idx, elem in enumerate(item) if elem.endswith("/-1")]
    229         fall_indexes = [idx for idx, elem in enumerate(item) if elem.endswith("/1")]

TypeError: 'list' object is not callable 
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在里面
225带tf.设备('/gpu:1'):
226瀑布_窗口_列表=[]
-->227对于窗口中的项目(falls_列表,55,1):
228 stand_index=[idx代表idx,枚举(项目)中的元素,如果元素endswith(“/-1”)]
229 fall_indexes=[idx代表idx,枚举(项)中的元素,如果元素为endswith(“/1”)]
TypeError:“列表”对象不可调用
每次我想调用该函数时,我都需要创建另一个窗口函数。 我以为每次调用函数时都会创建生成器


你能解释一下为什么它不能像这样工作吗?我怎么能多次使用这个函数,而不复制我想使用的次数?

你发布的代码不会引起这个错误。您可能没有发布导致问题的实际代码。我猜是在您的实际代码
窗口中1\u list
称为
list
。另外,在提问时,请始终发布完整的错误消息,并进行完整的回溯。当您从生成器中提取项目时,生成器会“消耗”自身。拉动最后一项时,发电机已耗尽。如果需要再次运行,请将生成器转换为列表。您可以多次从列表中提取。错误消息表明,您实际运行的代码中有许多代码没有进入问题。在所有未发布的代码中的某个地方,您重新定义了
window
。您确定代码中没有以
window=…
开头的行吗?您是否使用了“查找”功能来搜索它?显然,Python解释器认为
窗口
列表
类型的对象,而不是
函数
。这类事情很少是错误的。