python - 在 Python 3 中返回迭代器时, `yield from` 应该优先于 `return` 吗?

标签 python python-3.x iterator

在 Python 3 中,我们有 yield from 关键字,这对于在其他 yield 语句之间拼接现有迭代器的内容很有用。但是,如果我们只想从现有迭代器中产生所有结果,我们可以使用 yield from iterable 或简单地 return iterable 来获得相同的结果。显然,如果您需要您的代码在 Python 2 和 Python 3 中工作,您将被锁定在 return 选项中。但是,如果您只针对 Python 3,是否有充分的理由更喜欢其中一个? yield from 版本的优点是,任何阅读代码的人都可以立即看出此函数正在返回一个迭代器。另一方面,我认为 yield from 的原始实现可能比简单地返回现有迭代器要慢,但 CPython 或其他实现可能已经优化了这种情况。那么应该首选以下哪项?

def returns_an_iterator():
    return iter([1,2,3])

def yields_from_an_iterator():
    yield from iter([1,2,3])

最佳答案

除非你有其他原因包装一个迭代器,否则你应该直接返回它。

def with_return():
    return range(10)
>>> with_return()
range(0, 10)

如果您使用 yield from,您将创建一个中间生成器并在从迭代器读取每个值时增加开销。直接返回迭代器将避免这种开销。

def with_yield_from():
    yield from range(10)
>>> with_yield_from()
<generator object with_yield_from at 0x030DEDB0>

关于python - 在 Python 3 中返回迭代器时, `yield from` 应该优先于 `return` 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43809970/

相关文章:

python - 百分位计算 : Can I convert this for loop to a vector operation?

python - TensorFlow 从源错误 ValueError : invalid literal for int() with base 10: '' during cuda path configuration? 构建

java - LRU缓存: linkedhashmap and iterator implementation not working

python - 获取用户输入来读取文件中的那么多行

python - 为什么文本没有在 Canvas 上渲染 Pygame

python-3.x - python while循环不终止

C++ std::vector::const_iterator 问题

c++ - 我可以将 std::begin 和 std::end 专门化为 equal_range() 的返回值吗?

python - 如何加快url生成速度?

mysql - Airflow如何获取和处理mysql记录?