sys.stdin.read() 如何改变文字参数的结构?
How Does sys.stdin.read() Change the Structure of a Literal Parameter?
背景故事: 在我之前的 post 中,我想知道某个函数是否可以有效地替换另一个函数,所以,从技术上讲,我不知道需要一个答案来帮助我的项目,但我只是想知道 “如果我继续使用 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!)
即使这个代码^^^ 也不起作用!请告诉我原因。 –
您对“匹配几个接受的字符串之一”的测试与 this question's mistake 类似,是错误的;由于使用了括号,它并不完全相同,但在这种情况下,您的两个测试都等同于测试 leftside != 'p'
,因为 or
链评估为第一个真实值,或者最后一个值,如果全部都是假的,任何 non-empty 字符串都是真值,所以带括号的分组简化为 'p'
。你想要 leftside in ('p', 'P', 's', 'S')
(或者在现代 Python 上可能稍微快一点,它优化了针对 set
文字的文字的测试,以在编译时构造一个等效的 frozenset
并重用它,允许 O(1)
平均案例查找,而不是 O(n)
tuple
扫描工作,leftside in {'p', 'P', 's', 'S'}
).
此外,input
将读取一行,去除换行符,然后 return 它,而 sys.stdin.read()
会消耗标准输入的 全部 在第一次调用(所有线路)时,将其留空,因此再次尝试调用它不会收到任何信息。如果出于某种原因 不能 使用 input
,则 next(sys.stdin).rstrip('\n')
或 sys.stdin.readline().rstrip('\n')
将大致等同于普通的 input()
( input
在某些方面更强大,例如它具有 readline
集成,但它很接近)。
最后,一个小提示:没有理由做 str(choice_1)
或 str(err_test)
(它们已经 str
,所以用 str
包装是没有意义的)。
背景故事: 在我之前的 post 中,我想知道某个函数是否可以有效地替换另一个函数,所以,从技术上讲,我不知道需要一个答案来帮助我的项目,但我只是想知道 “如果我继续使用 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!)
即使这个代码^^^ 也不起作用!请告诉我原因。 –
您对“匹配几个接受的字符串之一”的测试与 this question's mistake 类似,是错误的;由于使用了括号,它并不完全相同,但在这种情况下,您的两个测试都等同于测试 leftside != 'p'
,因为 or
链评估为第一个真实值,或者最后一个值,如果全部都是假的,任何 non-empty 字符串都是真值,所以带括号的分组简化为 'p'
。你想要 leftside in ('p', 'P', 's', 'S')
(或者在现代 Python 上可能稍微快一点,它优化了针对 set
文字的文字的测试,以在编译时构造一个等效的 frozenset
并重用它,允许 O(1)
平均案例查找,而不是 O(n)
tuple
扫描工作,leftside in {'p', 'P', 's', 'S'}
).
此外,input
将读取一行,去除换行符,然后 return 它,而 sys.stdin.read()
会消耗标准输入的 全部 在第一次调用(所有线路)时,将其留空,因此再次尝试调用它不会收到任何信息。如果出于某种原因 不能 使用 input
,则 next(sys.stdin).rstrip('\n')
或 sys.stdin.readline().rstrip('\n')
将大致等同于普通的 input()
( input
在某些方面更强大,例如它具有 readline
集成,但它很接近)。
最后,一个小提示:没有理由做 str(choice_1)
或 str(err_test)
(它们已经 str
,所以用 str
包装是没有意义的)。