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
包装是毫无意义的(。