javascript

java

python

c#

android

c++

node.js

php

html

jquery

ios

reactjs

css

.net

git

ruby-on-rails

sql

c

ruby

string

.net-C#:收益率返回范围/集合

我使用了yield return关键字很多,但是当我想将范围添加到IEnumerable时发现它缺少关键字。这是我想做的一个简单示例:

IEnumerable<string> SomeRecursiveMethod()
{
    // some code 
    // ...
    yield return SomeRecursiveMethod();
}

自然会导致错误,可以通过执行简单的循环来解决。 有一个更好的方法吗? 循环感觉有些笨拙。

trans by 2020-08-11T18:00:51Z

C#:foreach中的收益返回失败-主体不能为迭代器b

考虑一下这段混淆的代码。 目的是通过匿名构造函数动态创建一个新对象,然后yield return对其进行创建。 目的是避免仅维护return就不必维护本地集合。

public static List<DesktopComputer> BuildComputerAssets()
{           
    List<string> idTags = GetComputerIdTags();

    foreach (var pcTag in idTags)
    {
        yield return new DesktopComputer() {AssetTag= pcTag
                                          , Description = "PC " + pcTag
                                          , AcquireDate = DateTime.Now
                                           };
    }            
}

不幸的是,这段代码产生了一个异常:

错误28'Foo.BuildComputerAssets()'的正文不能是迭代器块,因为'System.Collections.Generic.List'不是迭代器接口类型

问题

  • 此错误消息是什么意思?
  • 如何避免此错误并正确使用yield return
trans by 2020-08-11T01:42:51Z

python-如何以Python方式从列表中产生所有值?

假设我有一个列表,希望不返回而是从中产生值。 最Python的方式是什么?

这就是我的意思。 多亏了一些非延迟计算,我才计算出了列表2989579180238238701568,但是我在整个项目中的代码使用了延迟计算,因此我想从函数中产生值,而不是返回整个列表。

我目前将其编写如下:

my_list = ['a', 'b', 'c', 'd']
for item in my_list:
    yield item

但这对我来说并不好用。

trans by 2020-07-30T17:35:23Z

函数式编程-与计算机科学有关的Ruby yield特性

我最近发现了Ruby的块和屈服功能,我想知道:从计算机科学理论的角度来看,这适合什么? 它是一种功能编程技术,还是更具体的东西?

trans by 2020-02-05T01:23:21Z

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

我想要一个函数.gi_running,该函数的行为如下:

>>> 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

如何实现此功能?

我查看了.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

但是,这似乎很可恶。

trans by 2020-02-04T08:08:45Z

generator-Python中的收益中断

根据对这个问题的回答,C#中的yield break等同于python中的return。 在正常情况下,“返回”确实会停止发电机。 但是,如果您的函数只执行返回操作,则将获得None而不是空的迭代器,该迭代器由C#中的yield break返回

def generate_nothing():
    return

for i in generate_nothing():
    print i

您将收到TypeError:'NoneType'对象不可迭代。但是,如果我在返回前添加了永不运行的收益,则此函数将返回我期望的结果。

def generate_nothing():
    if False: yield None
    return

如果可行,但似乎有线。 谁有更好的主意?

谢谢,

trans by 2020-01-29T09:42:13Z

递归函数中的收益

我正在尝试对给定路径下的所有文件进行操作。 我不想事先收集所有文件名,然后对它们进行处理,因此我尝试了以下操作:

import os
import stat

def explore(p):
  s = ''
  list = os.listdir(p)
  for a in list:
    path = p + '/' + a
    stat_info = os.lstat(path )
    if stat.S_ISDIR(stat_info.st_mode):
     explore(path)
    else:
      yield path

if __name__ == "__main__":
  for x in explore('.'):
    print '-->', x

但是,此代码在命中目录时会跳过目录,而不是产生目录内容。 我究竟做错了什么?

trans by 2020-01-07T18:57:41Z

javascript-检查函数是否为gen

我在Nodejs v0.11.2中使用了生成器,我想知道如何检查函数的自变量是生成器函数。

我找到了typeof f === 'function' && Object.getPrototypeOf(f) !== Object.getPrototypeOf(Function)的这种方式,但是我不确定这是否很好(并且将来会继续工作)。

您对此问题有何看法?

trans by 2020-01-05T22:18:10Z

generator-Python中yield表达式的结果是什么?

我知道yield将函数转换为生成器,但是yield表达式本身的返回值是多少? 例如:

def whizbang(): 
    for i in range(10): 
        x = yield i

执行此函数时变量x的值是什么?

我已经阅读了Python文档:[http://docs.python.org/reference/simple_stmts.html#grammar-token-yield_stmt],并且似乎没有提及yield表达式本身的值。

trans by 2019-12-24T18:48:02Z

产量-产量内部有什么作用?

请考虑以下代码:

def mygen():
     yield (yield 1)
a = mygen()
print(next(a))
print(next(a)) 

输出结果:

1
None

口译员到底在“外部”做什么?

trans by 2019-11-13T23:17:50Z

python-在相同的函数中返回和yield

像这样在Python的同一函数中使用yield和return时,究竟发生了什么?

def find_all(a_str, sub):
    start = 0
    while True:
        start = a_str.find(sub, start)
        if start == -1: return
        yield start
        start += len(sub) # use start += 1 to find overlapping matches

还是发电机吗?

trans by 2019-11-10T03:02:27Z

使用yield的递归

有什么方法可以混合递归和start语句? 例如,无限数生成器(使用递归)将类似于:

def infinity(start):
    yield start
    # recursion here ...

>>> it = infinity(1)
>>> next(it)
1
>>> next(it)
2

我试过了:

def infinity(start):
    yield start
    infinity(start + 1)

def infinity(start):
    yield start
    yield infinity(start + 1)

但是他们都不满足我的要求,第一个停产了start,第二个停产了start,然后发电机又停了下来。

注意:请知道,您可以使用while循环来做到这一点:

def infinity(start):
    while True:
        yield start
        start += 1

我只想知道这是否可以递归完成。

trans by 2019-10-24T16:10:21Z

python-列表推导和生成器表达式中的yield

以下行为对我来说似乎很违反直觉(Python 3.4):

>>> [(yield i) for i in range(3)]
<generator object <listcomp> at 0x0245C148>
>>> list([(yield i) for i in range(3)])
[0, 1, 2]
>>> list((yield i) for i in range(3))
[0, None, 1, None, 2, None]

最后一行的中间值实际上并不总是yield,它们是我们生成器中的SyntaxError,等于(我想)以下生成器:

def f():
   for i in range(3):
      yield (yield i)

这三行代码完全起作用使我感到很有趣。 参考文献指出yield仅在函数定义中允许使用(尽管我可能读错了它,并且/或者可能只是从较旧的版本复制而来)。 前两行在Python 2.7中产生SyntaxError,但第三行则没有。

而且,这似乎很奇怪

  • 列表理解返回一个生成器而不是一个列表
  • 并且生成器表达式转换为列表和相应的列表理解包含不同的值。

有人可以提供更多信息吗?

trans by 2019-09-28T22:32:07Z

Python:生成器表达式与yield

在Python中,通过生成器表达式创建生成器对象与使用yield语句之间有什么区别吗?

使用产量:

def Generator(x, y):
    for i in xrange(x):
        for j in xrange(y):
            yield(i, j)

使用生成器表达:

def Generator(x, y):
    return ((i, j) for i in xrange(x) for j in xrange(y))

这两个函数都返回生成元组的生成器对象,例如, (0,0),(0,1)等

一个或另一个的任何优点?思考?


谢谢大家! 这些答案中有很多很棒的信息和进一步的参考资料!

trans by 2019-09-17T02:52:33Z

等效的C ++到Python生成器模式

我有一些示例Python代码,我需要在C ++中模仿它。 我不需要任何特定的解决方案(例如基于协同例程的产量解决方案,尽管它们也是可接受的答案),我只需要以某种方式重现语义。

蟒蛇

这是一个基本的序列生成器,显然太大而无法存储物化版本。

def pair_sequence():
    for i in range(2**32):
        for j in range(2**32):
            yield (i, j)

目标是维护上面序列的两个实例,并以半锁步方式迭代它们,但是以块为单位。 在下面的示例中,yield使用对序列来初始化缓冲区,second_pass重新生成相同的精确序列并再次处理缓冲区。

def run():
    seq1 = pair_sequence()
    seq2 = pair_sequence()

    buffer = [0] * 1000
    first_pass(seq1, buffer)
    second_pass(seq2, buffer)
    ... repeat ...

C ++

我在C ++中找到解决方案的唯一办法就是模仿yield与C ++协同程序,但我没有找到任何关于如何做到这一点的好参考。 我也对这个问题的替代(非一般)解决方案感兴趣。 我没有足够的内存预算来保存传递之间序列的副本。

trans by 2019-09-08T19:00:12Z

layout - Rails检查yield:area是否在content_中定义

我想在布局级别做一个基于实际模板定义的条件渲染content_for(:an__area),任何想法如何完成这个?

trans by 2019-08-25T10:38:05Z

Java是否等同于C#的'yield'关键字?

我知道Java本身没有直接的等价物,但也许是第三方?

真的很方便。 目前我想实现一个迭代器,它产生一个树中的所有节点,这是大约五行带有yield的代码。

trans by 2019-07-23T23:26:30Z

Ruby:Proc#call vs yield

thrice方法的Ruby中,以下两个实现之间的行为差异是什么?

module WithYield
  def self.thrice
    3.times { yield }      # yield to the implicit block argument
  end
end

module WithProcCall
  def self.thrice(&block)  # & converts implicit block to an explicit, named Proc
    3.times { block.call } # invoke Proc#call
  end
end

WithYield::thrice { puts "Hello world" }
WithProcCall::thrice { puts "Hello world" }

通过“行为差异”,我包括错误处理,性能,工具支持等。

trans by 2019-06-15T23:54:39Z

c# - 使用IEnumerable进行嵌套的yield返回

我有以下功能来获取卡的验证错误。 我的问题涉及处理GetErrors。 两种方法都具有相同的返回类型GetMoreErrors

private static IEnumerable<ErrorInfo> GetErrors(Card card)
{
    var errors = GetMoreErrors(card);
    foreach (var e in errors)
        yield return e;

    // further yield returns for more validation errors
}

是否可以返回GetMoreErrors中的所有错误而无需通过它们进行枚举?

想一想这可能是一个愚蠢的问题,但我想确保我不会出错。

trans by 2019-05-20T04:10:50Z

c# - 何时不使用收益率(返回)

这个问题在这里已有答案:
返回IEnumerable时是否有理由不使用'yield return'?

关于yield的好处,这里有几个有用的问题。例如,

  • 有人可以揭开产量的神秘面纱关键词

  • 有趣地使用c#yield
    关键词

  • 什么是yield关键字

我正在寻找关于何时不使用yield的想法。例如,如果我希望需要返回集合中的所有项目,它似乎不会像yield那样有用,对吧?

使用yield会有什么限制,不必要,让我陷入困境,或者应该避免的情况是什么?

trans by 2019-04-27T19:16:08Z

1 2 下一页 共2页