草庐IT

Generator

全部标签

python - 如果 Python 生成器不再使用但尚未达到 StopIteration,它会被垃圾收集吗?

当不再使用生成器时,它应该被垃圾回收,对吧?我尝试了以下代码,但我不确定我错了哪一部分。importweakrefimportgcdefcountdown(n):whilen:yieldnn-=1cd=countdown(10)cdw=weakref.ref(cd)()printcd.next()gc.collect()printcd.next()gc.collect()printcdw.next()在倒数第二行,我调用了垃圾收集器,因为不再调用cd。gc应该释放cd权利。但是当我调用cdw.next()时,它仍然在打印8。我又尝试了几个cdw.next(),它可以成功打印所有剩余的,

python在一个循环中产生和停止迭代?

我有一个生成器,我想在其中为实际内容添加一个初始值和最终值,它是这样的:#anygenericqueuewhereiwouldliketogetsomethingfromq=Queue()defgen(header='something',footer='anything'):#initialvalueheaderyieldheaderforcincount():#getfromthequeuei=q.get()#ifwedon'thaveanymoredatafromthequeue,spitoutthefooterandstopifi==None:yieldfooterraiseS

python在一个循环中产生和停止迭代?

我有一个生成器,我想在其中为实际内容添加一个初始值和最终值,它是这样的:#anygenericqueuewhereiwouldliketogetsomethingfromq=Queue()defgen(header='something',footer='anything'):#initialvalueheaderyieldheaderforcincount():#getfromthequeuei=q.get()#ifwedon'thaveanymoredatafromthequeue,spitoutthefooterandstopifi==None:yieldfooterraiseS

python - 对生成器使用前瞻

我在Python中实现了一个基于生成器的扫描器,它将字符串标记为(token类型,token值)形式的元组:fortokeninscan("a(b)"):printtoken会打印("literal","a")("l_paren","(")...下一个任务意味着解析token流,为此,我需要能够在不向前移动指针的情况下从当前项向前查看一项。迭代器和生成器不会一次提供完整的项目序列,而是根据需要提供每个项目的事实,这使得与列表相比,前瞻有点棘手,因为除非调用__next__(),否则下一个项目是未知的.基于生成器的前瞻的简单实现是什么样的?目前我正在使用一种解决方法,这意味着从生成器中列

python - 对生成器使用前瞻

我在Python中实现了一个基于生成器的扫描器,它将字符串标记为(token类型,token值)形式的元组:fortokeninscan("a(b)"):printtoken会打印("literal","a")("l_paren","(")...下一个任务意味着解析token流,为此,我需要能够在不向前移动指针的情况下从当前项向前查看一项。迭代器和生成器不会一次提供完整的项目序列,而是根据需要提供每个项目的事实,这使得与列表相比,前瞻有点棘手,因为除非调用__next__(),否则下一个项目是未知的.基于生成器的前瞻的简单实现是什么样的?目前我正在使用一种解决方法,这意味着从生成器中列

Python对控制流使用异常被认为是不好的?

好吧,我过去曾多次看到这种情况,但最近一次是myquestionhere.所以,我很好奇为什么会出现这种情况,在python中,因为生成器使用异常来指示数据的结束。如果这对使用python的每个人来说都如此糟糕,为什么该语言将它包含在被认为是基本控制结构中?对于那些想要阅读相关PEP的人gohere. 最佳答案 因为结束生成器不是一个常见的事件(我知道它总是会发生,但它只会发生一次)。抛出异常被认为是昂贵的。如果一个事件将在99%的时间内成功并在1%的情况下失败,那么使用try/except比检查是否可以访问该数据要快得多(请求宽恕

Python对控制流使用异常被认为是不好的?

好吧,我过去曾多次看到这种情况,但最近一次是myquestionhere.所以,我很好奇为什么会出现这种情况,在python中,因为生成器使用异常来指示数据的结束。如果这对使用python的每个人来说都如此糟糕,为什么该语言将它包含在被认为是基本控制结构中?对于那些想要阅读相关PEP的人gohere. 最佳答案 因为结束生成器不是一个常见的事件(我知道它总是会发生,但它只会发生一次)。抛出异常被认为是昂贵的。如果一个事件将在99%的时间内成功并在1%的情况下失败,那么使用try/except比检查是否可以访问该数据要快得多(请求宽恕

python - 使用列表生成器时 Python 3 中的 pdb 模块中可能存在错误

在Python3中运行此代码后:importpdbdeffoo():nums=[1,2,3]a=5pdb.set_trace()foo()以下表达式有效:(Pdb)print(nums)[1,2,3](Pdb)print(a)5(Pdb)[xforxinnums][1,2,3]但以下表达式失败:(Pdb)[x*aforxinnums]***NameError:globalname'a'isnotdefined以上在Python2.7中运行良好。这是一个错误还是我遗漏了什么?更新:查看新接受的答案。这确实是一个错误(或有问题的设计),现在已通过在pdb中引入新的命令和模式来解决。

python - 使用列表生成器时 Python 3 中的 pdb 模块中可能存在错误

在Python3中运行此代码后:importpdbdeffoo():nums=[1,2,3]a=5pdb.set_trace()foo()以下表达式有效:(Pdb)print(nums)[1,2,3](Pdb)print(a)5(Pdb)[xforxinnums][1,2,3]但以下表达式失败:(Pdb)[x*aforxinnums]***NameError:globalname'a'isnotdefined以上在Python2.7中运行良好。这是一个错误还是我遗漏了什么?更新:查看新接受的答案。这确实是一个错误(或有问题的设计),现在已通过在pdb中引入新的命令和模式来解决。

Python `yield from` ,还是返回一个生成器?

我写了这段简单的代码:defmymap(func,*seq):return(func(*args)forargsinzip(*seq))我应该使用上面的'return'语句来返回一个生成器,还是使用这样的'yieldfrom'指令:defmymap(func,*seq):yieldfrom(func(*args)forargsinzip(*seq))除了“return”和“yieldfrom”之间的技术差异之外,一般情况下哪种方法更好? 最佳答案 不同的是,你的第一个mymap只是一个普通的函数,在这种情况下,工厂返回一个生成器。一