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
返回的任何内容都会被迭代,每个结果项都分配给 x
和 print
ed。
唯一可能的区别是 在 循环之后,在第二种形式中您可以访问 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
是一个错误的选择。
例如,在性能上有区别吗:
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
返回的任何内容都会被迭代,每个结果项都分配给 x
和 print
ed。
唯一可能的区别是 在 循环之后,在第二种形式中您可以访问 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
是一个错误的选择。