【问题标题】:Understanding input in iter理解 iter 中的输入
【发布时间】:2023-01-25 16:11:45
【问题描述】:

我一直在寻找在 python 中进行多行输入的解决方案。我找到了 this 使用以下代码的答案。

sentinel = '' # ends when this string is seen
for line in iter(input, sentinel):
    pass # do things here

我从 python 文档中读到,如果 iter 收到第二个参数,那么它将调用第一个参数的 __next__()。但我认为 input 没有实现 __next__()(我无法通过文档或浏览源代码来验证这一点)。有人可以解释它是如何工作的吗?

此外,我通过以下代码观察到这种奇怪的行为。

sentinel = ''
itr = iter(input, sentinel)
print("Hello")
print(set(itr))

这是输出

[dvsingla Documents]$ python3 temp.py
Hello
lksfjal
falkja
 aldfj

{' aldfj', 'falkja', 'lksfjal'}
[dvsingla Documents]$ 

打印后提示开始接受输入你好这不是逐行解释。

谢谢你的帮助

【问题讨论】:

  • 我相信该代码中的 input 不是内置的 input 函数。相反,有人为局部变量选择了一个不幸的名称,如input = "abcd"
  • 您是否尝试阅读iter 的文档?
  • @zvone。不,那是输入功能好吧
  • @MadPhysicist 哦,那更糟 :D 在我看来,代码真的很丑。
  • @zvone。为什么?我认为如果你了解它的作用就好了

标签: python


【解决方案1】:

iter 有两种形式:一种是通常的单参数调用,用于检索迭代器对象。另一个很少使用(并且可能鲜为人知)。它有两个参数:一个无参数的可调用对象和一个指示序列结束的返回值。可调用对象将被重复调用,直到它返回指定的值。这就是您在此处看到使用的版本。

打印输出如此发生的原因是 iter 的第二种形式仍然创建一个惰性迭代器,就像第一种形式一样。 itr 在调用set 之前不会执行任何操作,它将重复调用input 直到用户输入一个空行,这将等于所选的sentinel

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-03-13
    • 1970-01-01
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多