sys.stdin.read()如何更改文字参数的结构



Backstory:在我之前的帖子中,我想知道某个函数是否可以替换另一个函数,所以,从技术上讲,我不需要答案来帮助我的项目,但我只是想知道"如果我继续使用sys.stdin.read((而不是input((,我将如何克服其中的一个障碍">

我的问题:由于某种原因,当我使用sys.stdin.read((时,它无法处理文本字符串或字符。这是对我的代码的一次懒惰但有效的重建。。。

print("Type p or P for a pyramid")
print("Type s or S for the sum and product of two numbers")
choice_1 = sys.stdin.read()
# edge case for inputted char being invalid
if str(choice_1) != ('p' or 'P' or 's' or 'S')
err_test = 'z'
while str(err_test) != ('p' or 'P' or 's' or 'S')
print("Invalid option!)
print("Type p or P for a pyramid")
print("Type s or S for the sum and product of two numbers"
err_test = sys.stdin.read()
if err_test == ('p' or 'P' or 's' or 'S')
break

这段代码大致就是我写的。我不是在家里写这个问题,所以我不能逐字逐句地抄写。如果你看到任何问题,请列出它们,无论是语法错误还是格式错误。我想尽可能多地学习,但如果你知道为什么评论下面的行(第6行(不起作用,请告诉我!谢谢

**编辑:**非常感谢您的反馈!不过,我忘了提一下,有一次,我试图隔离这个问题,所以我创建了一个新的python文件,并创建了一种永远持续的循环,只用一个字符进行了测试。我会让它超级简化:

char = sys.stdin.read()
if char == 'a':
print("This works!")
if char != 'a':
print("This failed!)

甚至这个代码^^^也不起作用!请告诉我原因

您的"匹配几个可接受的字符串之一";与这个问题的错误相似;由于使用了括号,所以不完全相同,但在这种情况下,两个测试都等效于测试leftside != 'p',因为or链的计算结果是第一个truthy值,或者如果所有值都是falsy,则是最后一个值,并且任何非空字符串都是truthy,因此带括号的分组简化为仅'p'。您想要leftside in ('p', 'P', 's', 'S')(或者在现代Python上可能稍微快一点,它优化了针对set文本的测试,以在编译时构造等效的frozenset并重用它,允许O(1)平均大小写查找,而不是O(n)tuple扫描工作,leftside in {'p', 'P', 's', 'S'}(。

此外,input将读取一行,剥去换行符并返回它,而sys.stdin.read()在第一次调用(所有行(时消耗stdin的完整,使其为空,因此尝试再次调用它将不会收到任何内容。如果由于某种原因不能使用input,则next(sys.stdin).rstrip('n')sys.stdin.readline().rstrip('n')将大致等同于普通input()(input在某些方面更强大,例如它具有readline集成,但它很接近(。

最后,需要注意的是:没有理由做str(choice_1)str(err_test)(它们已经是str了,所以用str包装是毫无意义的(。

最新更新