相关疑难解决方法(0)

"yield"关键字有什么作用?

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.

python iterator yield generator coroutine

9664
推荐指数
46
解决办法
212万
查看次数

Python 2.X中range和xrange函数有什么区别?

显然xrange更快但我不知道为什么它更快(除了轶事到目前为止没有证据表明它更快)或者除此之外还有什么不同

for i in range(0, 20):
for i in xrange(0, 20):
Run Code Online (Sandbox Code Playgroud)

python loops range xrange python-2.x

690
推荐指数
15
解决办法
36万
查看次数

Python 3中的zip()函数

我知道如何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在解释器上输入多少次,我总能得到预期的结果,而不是空列表.

python

57
推荐指数
2
解决办法
11万
查看次数

如何判断发电机是否刚启动?

我想要一个函数,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 yield generator

49
推荐指数
3
解决办法
1961
查看次数

31
推荐指数
5
解决办法
1万
查看次数

enumerate()是否生成生成器对象?

作为一个完整的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是否意味着上面最后一个代码块中概述的测试实际上是最好的?

我不会继续写下我头脑中可能存在的可能性,而是将其抛给那些立即知道答案的人.

python

31
推荐指数
2
解决办法
6233
查看次数

如何从冻结集中获取任意元素?

我想从冻结集中获取一个元素(当然,不修改它,因为frozensets是不可变的).到目前为止我找到的最佳解决方案是:

s = frozenset(['a'])
iter(s).next()
Run Code Online (Sandbox Code Playgroud)

按预期返回:

'a'
Run Code Online (Sandbox Code Playgroud)

换句话说,有没有任何方法可以从冻结集中"弹出"一个元素而不实际弹出它?

python iterator set immutability

13
推荐指数
3
解决办法
1万
查看次数

Python向下枚举或使用自定义步骤进行枚举

如何使Python的enumerate函数从较大的数字枚举到较小的数字(降序,递减,倒计时)?或者一般来说,如何使用不同的步进增量/减量enumerate

例如,应用于list的此函数['a', 'b', 'c']具有起始值10和步骤-2,将生成迭代器[(10, 'a'), (8, 'b'), (6, 'c')].

python enumerate

12
推荐指数
2
解决办法
5377
查看次数

Python 中何时使用生成器函数以及何时使用循环

我有 Matlab 背景,我发现很难在 Python 中理解生成器的概念。

有人可以回答我以下问题吗:

  1. 生成器函数和循环之间的区别
  2. 每一项何时应实施

python iterator loops generator

8
推荐指数
1
解决办法
3892
查看次数

send(None)和Next()之间的区别

通过将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)

python generator

7
推荐指数
1
解决办法
707
查看次数