python 支持生成的对象吗?

Do python support generated objects?

例如,在性能上有区别吗:

for x in someFunc(): 
    print x

result = someFunc()
for x in result:
    print x

结果现在是生成器对象,所以这两种情况的操作相同吗?

在您的示例中,在这两种情况下,函数都被调用一次。这是因为函数的 return 在这里被用作数据。对于显示的示例,首先调用函数并且 return 数据用于整个 for 循环。在第二个示例中,您将函数的 return 设置为一个变量,并将该变量用于您的 for 循环。

因此在这两种情况下,相同的数据将用于 for 循环。是的,对于 Java,如果代码以这种方式构建,C 也是一样的。

对于 C/C++,如果编译器无法优化那段代码,它总是被调用。你可以自己试试:

#include <cstdio>
#include <cstring>

size_t getLength(char *s)
{   puts("Called");
    return strlen(s);
}

int main(void)
{   char s[] = "test";
    for(int i = 0; i < getLength(s); i++)
        ;
    return 0;
}

输出:

Called
Called
Called
Called
Called

在Python中完全没有区别:

for x in someFunc(): 
    print x

result = someFunc()
for x in result:
    print x

无论哪种方式,从 someFunc 返回的任何内容都会被迭代,每个结果项都分配给 xprinted。

唯一可能的区别是 循环之后,在第二种形式中您可以访问 result。如果它是,这可能是有用的。一个序列(list,等等),但如果它是一个(现在已经用尽的)迭代器,可能不会那么多。在第一种形式中,除了对其进行迭代之外,无法访问 someFunc 的返回值。

某些语言,您展示了一个 python 示例,支持没有 return 语句的 生成器 ,它们 yield每次迭代的值。

在Python中,语句:

result = someFunc()

使 result 引用 生成器对象 ,然后您可以使用 next() 内置函数获取下一个值。

在 Python for 循环中,为您调用 next(),因此我们遍历 惰性列表 值(a惰性列表是一次只提供一项的地方。

所以你的陈述实际上是:

result = someFunc()
for x in result:
    print x

产生相同的结果!那是因为 result 是一个生成器对象:名称 result 是一个错误的选择。