gpt4 book ai didi

python - 如何在 Python3 的 repl/ipython 中检查生成器

转载 作者:行者123 更新时间:2023-11-28 22:45:29 26 4
gpt4 key购买 nike

我一直在尝试切换到 Python3。令人惊讶的是,我的困难不在于模块或我自己的代码破坏。我的问题是,在编写代码时,我总是在 IPython 中尝试和测试我的代码的不同方面,默认情况下使用生成器会让这令人恼火。我希望我的知识存在差距,或者有某种解决方法可以解决这个问题。

我的问题是:

  • 每当我测试几行代码或一个函数并得到一个生成器时,我都不知道里面是什么,因为我收到这样的响应:<generator object <genexpr> at 0x0000000007947168> .绕过它意味着我不能直接从我的编辑器运行代码——我需要将输出转储到一个变量和/或将它包装在一个 list() 中。

  • 一旦我开始检查生成器,我要么消耗它(全部或部分),如果我想进一步测试它,它就会弄乱它。部分消费特别烦人,因为有时我没有注意到并看到后续代码的奇怪结果。

奇怪的是,我一直发现我引入了错误(或无关代码),不是因为我不了解惰性求值,而是因为我在控制台中求值的内容与进入控制台的内容不匹配我的编辑从我的视线中溜走。

在我的脑海中,我想执行以下操作之一:

  • 以某种方式配置 IPython 以强制进行某种严格的评估(除非我明确关闭它)
  • 在不消耗发电机的情况下检查它(或者检查它然后自行重启?)

最佳答案

在一般情况下,您的预览或倒带发电机的想法是不可能的。这是因为生成器可能有副作用,您可能会比预期更早(预览时)或多次(倒带前后)。例如,考虑以下生成器:

def foo_gen():
print("start")
yield 1
print("middle")
yield 2
print("end")

如果您可以预览此生成器产生的结果(12),您是否也希望得到打印输出?

也就是说,可能有一些方法可以让您的代码更易于处理。

考虑使用列表理解而不是生成器表达式。在大多数情况下这很简单,只需将您已有的 genexp 放在方括号中即可。在您将生成器传递给其他代码的许多情况下,任何可迭代对象(例如 list)都同样有效。

同样,如果您要从其他地方将生成器传递到您的代码中,您通常可以将生成器传递给 list 并在以后的代码中使用该列表。这当然不是很节省内存,因为您要预先使用整个生成器,但如果您想在交互式控制台中查看这些值,这可能是必要的。

您还可以使用 itertools.tee获得两个(或更多)迭代器,它们将产生与您传入的可迭代对象相同的值。这将允许您检查一个的值,同时传递另一个。请注意,tee 代码将需要存储任何迭代器产生的所有值,直到它也被所有其他迭代器产生(因此,如果您运行一个迭代器远远领先于其他人,您最终可能会使用与仅使用 list 一样多或更多的内存。

关于python - 如何在 Python3 的 repl/ipython 中检查生成器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28537618/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com