我想要一个函数,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 2中,当函数定义中的return与yield一起时,出现了错误.但对于Python 3.3中的这段代码
def f():
return 3
yield 2
x = f()
print(x.__next__())
Run Code Online (Sandbox Code Playgroud)
没有错误,返回用于带有yield的函数.但是,当__next__调用该函数时,会抛出异常StopIteration.为什么不只是返回价值3?这种回报是否被忽略了?
有没有办法让生成器进入node.js?
我目前正在使用回调伪装它们,但我必须记得检查我的生成器函数内部回调的响应,这会产生很多 if (callback(arg) === false) return;
我想要像python中的东西:
for p in primes():
if p > 100: break
do_something(p)
Run Code Online (Sandbox Code Playgroud)
我正在节点中这样做:
primes(function(p) {
if (p > 100) return false;
do_something(p)
});
Run Code Online (Sandbox Code Playgroud)
也许像coffeescript这样的东西可以帮忙吗?
(这个问题与这一个和这个问题有关,但那些是预先走动的发电机,这正是我想要避免的)
我想把一个发电机拆分成块.要求是:
我试过以下代码:
def head(iterable, max=10):
for cnt, el in enumerate(iterable):
yield el
if cnt >= max:
break
def chunks(iterable, size=10):
i = iter(iterable)
while True:
yield head(i, size)
# Sample generator: the real data is much more complex, and expensive to compute
els = xrange(7)
for n, chunk in enumerate(chunks(els, 3)):
for el in chunk:
print 'Chunk %3d, value %d' % (n, el)
Run Code Online (Sandbox Code Playgroud)
这有点工作:
Chunk 0, value 0
Chunk 0, value 1 …Run Code Online (Sandbox Code Playgroud) 如何使用Sphinx-Napoleon为Google风格的文档字符串指示生成器的列表,可选参数和返回类型的类型?
我试过了
List[type]
list of type
Optional[type]
type, optional
Run Code Online (Sandbox Code Playgroud)
和
Yields:
type:
Run Code Online (Sandbox Code Playgroud)
分别; 但是所有产生的输出都不令人满意,与生成的文档的其余部分不一致.例如
Optional[type]
Run Code Online (Sandbox Code Playgroud)
只是给
可选[类型]
没有任何链接type.
我尝试过每个内置主题并遇到同样的问题.
我应该如何使用Sphinx-Napoleon的Google风格文档来记录这些元素?
我有一个生成器和一个消耗它的函数:
def read():
while something():
yield something_else()
def process():
for item in read():
do stuff
Run Code Online (Sandbox Code Playgroud)
如果生成器抛出异常,我想在使用者函数中处理它,然后继续使用迭代器直到它耗尽.请注意,我不希望在生成器中有任何异常处理代码.
我想到了类似的东西:
reader = read()
while True:
try:
item = next(reader)
except StopIteration:
break
except Exception as e:
log error
continue
do_stuff(item)
Run Code Online (Sandbox Code Playgroud)
但这对我来说相当尴尬.
如何使用Eclipse创建在Android中生成随机数的应用程序,然后在TextView字段中显示结果?随机数必须在用户选择的范围内.因此,用户将输入范围的最大值和最小值,然后我将输出答案.
我有一个python列表,其中元素可以重复.
>>> a = [1,2,2,3,3,4,5,6]
Run Code Online (Sandbox Code Playgroud)
我想n从列表中获取第一个独特的元素.所以,在这种情况下,如果我想要前5个独特元素,它们将是:
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
我已经提出了使用生成器的解决方案:
def iterate(itr, upper=5):
count = 0
for index, element in enumerate(itr):
if index==0:
count += 1
yield element
elif element not in itr[:index] and count<upper:
count += 1
yield element
Run Code Online (Sandbox Code Playgroud)
正在使用:
>>> i = iterate(a, 5)
>>> [e for e in i]
[1,2,3,4,5]
Run Code Online (Sandbox Code Playgroud)
我怀疑这是最优化的解决方案.是否有一种替代策略可以实现以更加pythonic和更有效的方式编写它?
假设我有一个列表,我希望不返回,但要从中产生值.什么是最pythonic的方式呢?
这就是我的意思.由于一些非惰性计算我已经计算了列表['a', 'b', 'c', 'd'],但我的代码通过项目使用延迟计算,所以我想从我的函数中产生值而不是返回整个列表.
我目前写的如下:
my_list = ['a', 'b', 'c', 'd']
for item in my_list:
yield item
Run Code Online (Sandbox Code Playgroud)
但这对我来说并不像是pythonic.
我正在使用生成器在列表中执行搜索,就像这个简单的例子:
>>> a = [1,2,3,4]
>>> (i for i, v in enumerate(a) if v == 4).next()
3
Run Code Online (Sandbox Code Playgroud)
(只是为了对示例进行框架化,我使用的列表与上面的列表相比要长得多,而且条目有点复杂int.我这样做,所以每次我都不会遍历整个列表搜索他们)
现在如果我改为那样i == 666,它会返回一个,StopIteration因为它找不到任何666条目a.
我怎样才能让它返回None?我当然可以将它包装在一个try ... except子句中,但有更多的pythonic方法吗?