yieldPython中关键字的用途是什么?它有什么作用?
例如,我试图理解这段代码1:
def _get_child_candidates(self, distance, min_dist, max_dist):
if self._leftchild and distance - max_dist < self._median:
yield self._leftchild
if self._rightchild and distance + max_dist >= self._median:
yield self._rightchild
Run Code Online (Sandbox Code Playgroud)
这是来电者:
result, candidates = [], [self]
while candidates:
node = candidates.pop()
distance = node._get_dist(obj)
if distance <= max_dist and distance >= min_dist:
result.extend(node._values)
candidates.extend(node._get_child_candidates(distance, min_dist, max_dist))
return result
Run Code Online (Sandbox Code Playgroud)
_get_child_candidates调用该方法时会发生什么?列表是否返回?单个元素?它又被召唤了吗?后续通话何时停止?
1.代码来自Jochen Schulz(jrschulz),他为度量空间创建了一个很棒的Python库.这是完整源代码的链接:模块mspace.
显然xrange更快但我不知道为什么它更快(除了轶事到目前为止没有证据表明它更快)或者除此之外还有什么不同
for i in range(0, 20):
for i in xrange(0, 20):
Run Code Online (Sandbox Code Playgroud) 我知道如何zip()在Python 3中使用该函数.我的问题是关于以下我觉得非常奇怪的:
我定义了两个列表:
lis1 = [0, 1, 2, 3]
lis2 = [4, 5, 6, 7]
Run Code Online (Sandbox Code Playgroud)
我通过zip()以下方式使用这些:
1. test1 = zip( lis1, lis2)
2. test2 = list(zip(lis1, lis2))
Run Code Online (Sandbox Code Playgroud)
当我输入test1翻译时,我得到了这个:
"zip object at 0x1007a06c8"
Run Code Online (Sandbox Code Playgroud)
所以,我输入list(test1)解释器,我得到了预期的结果,但是当我list(test1)再次输入时,我得到一个空列表.
我觉得奇怪的是,无论我test2在解释器上输入多少次,我总能得到预期的结果,而不是空列表.
我想要一个函数,is_just_started其行为类似于以下内容:
>>> def gen(): yield 0; yield 1
>>> a = gen()
>>> is_just_started(a)
True
>>> next(a)
0
>>> is_just_started(a)
False
>>> next(a)
1
>>> is_just_started(a)
False
>>> next(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
StopIteration
>>> is_just_started(a)
False
Run Code Online (Sandbox Code Playgroud)
我该如何实现这个功能?
我查看了该.gi_running属性,但它似乎用于其他东西.
如果我知道需要发送到生成器的第一个值,我可以这样做:
def safe_send(gen, a):
try:
return gen.send(a)
except TypeError as e:
if "just-started" in e.args[0]:
gen.send(None)
return gen.send(a)
else:
raise
Run Code Online (Sandbox Code Playgroud)
然而,这似乎令人憎恶.
作为一个完整的Python新手,它肯定是这样的.运行以下...
x = enumerate(['fee', 'fie', 'foe'])
x.next()
# Out[1]: (0, 'fee')
list(x)
# Out[2]: [(1, 'fie'), (2, 'foe')]
list(x)
# Out[3]: []
Run Code Online (Sandbox Code Playgroud)
......我注意到:(a)x确实有一个next方法,似乎是生成器所需要的,而(b)x只能迭代一次,这个着名的python标签答案中强调了生成器的一个特征.
在另一方面,这两个最高度upvoted回答这个问题,
如何确定一个对象是否是发电机似乎表明,enumerate()它不会返回发电机.
import types
import inspect
x = enumerate(['fee', 'fie', 'foe'])
isinstance(x, types.GeneratorType)
# Out[4]: False
inspect.isgenerator(x)
# Out[5]: False
Run Code Online (Sandbox Code Playgroud)
......虽然对该问题的第三个低调的回答似乎表明实际上enumerate() 确实返回了一个发电机:
def isgenerator(iterable):
return hasattr(iterable,'__iter__') and not hasattr(iterable,'__len__')
isgenerator(x)
# Out[8]: True
Run Code Online (Sandbox Code Playgroud)
发生什么了?是x发电机还是没有?它在某种意义上是"类似发电机",但不是真正的发电机吗?Python使用duck-typing是否意味着上面最后一个代码块中概述的测试实际上是最好的?
我不会继续写下我头脑中可能存在的可能性,而是将其抛给那些立即知道答案的人.
我想从冻结集中获取一个元素(当然,不修改它,因为frozensets是不可变的).到目前为止我找到的最佳解决方案是:
s = frozenset(['a'])
iter(s).next()
Run Code Online (Sandbox Code Playgroud)
按预期返回:
'a'
Run Code Online (Sandbox Code Playgroud)
换句话说,有没有任何方法可以从冻结集中"弹出"一个元素而不实际弹出它?
如何使Python的enumerate函数从较大的数字枚举到较小的数字(降序,递减,倒计时)?或者一般来说,如何使用不同的步进增量/减量enumerate?
例如,应用于list的此函数['a', 'b', 'c']具有起始值10和步骤-2,将生成迭代器[(10, 'a'), (8, 'b'), (6, 'c')].
我有 Matlab 背景,我发现很难在 Python 中理解生成器的概念。
有人可以回答我以下问题吗:
通过将yield语句重新定义为PEP 342中的表达式 - 通过增强型生成器的协同程序,Python中添加了强大的新功能.David Beasley在Python协同程序上提供了很好的演示,这是关于协同程序和并发的好奇课程.
正如PEP所述,每当通过正常的next()调用恢复生成器时,yield表达式的值为None.要实例化生成器,必须调用next()或send(None)(即最初不能发送非None值).
调用next()vs send(None)有什么好处吗?next()是一个Built_in函数,所以也许这是一个因素,但似乎没有任何其他差异.我有些惊讶,将下一个可选变量添加到Pythonic会比添加一个执行相同操作的新函数更加令人惊讶.我错过了什么吗?
这是一个简单的协程,通过将它们发送到协程来保持输入的总数.
import numbers
def running_sum() :
g_in = 0
g_out = 0
while g_in is not None :
g_in = (yield g_out)
if isinstance(g_in, numbers.Number) :
g_out += g_in
print 'in_val =',g_in,'sum =',g_out
Run Code Online (Sandbox Code Playgroud)