背景
sys.stdin主要用來讀取鍵盤的一行或者多行輸入,讀取后表達形式為字符串。
下文主要探討sys.stdin.readline()的使用,sys.stdin.read()參考:
- sys.stdin.readline()是逐行讀取,通常會配合.strip()清除首尾的換行符/空格
- sys.stdin.read()會讀取所有行,并合并為一個字符串,同樣可以搭配.strip()使用

1. 讀取單行鍵盤輸入
1.1 普通數字
這里的注釋先不看,是1.2嵌套字符串的注釋說明;
# input_ = sys.stdin.read().strip() # 一次性讀取多行內容并合并成一個字符串
# input_ = sys.stdin.readline() # 一次讀取一行,會帶上(首尾的)行結束符/行回車符
input_ = sys.stdin.readline().strip() # 刪去首尾的空格符(一般都用這個)
# input_ = input() # (不建議)多行情況下很不方便,單行等效于sys.stdin.readline().strip()print(input_) # "abcde" | 'abcde' <這里實際上是'"abcde"',字符串顯示是不顯示外層的雙引號 | 如果輸入是'abcde',則實際上是"'abcde'">
print(repr(input_)) # 驗證一下有沒有嵌套字符串,
print(type(input_)) # str
# 平常我們以為英文單引號,雙引號是一樣的即.split('"')?=.split("'")), 其實不一樣,內層的' or "才是split的分割字符
# 還有一個細節是split的對象是字符串的內層,也就是打印出來的我們看到的那一部分
# 最難崩的一點是如果split生效,結果會在外層再套上一層''(注意這里不管內層是''還是""最后都會套上'')
# 這里split生效指的是分割字符存在于字符串的內層,如'"abcde"'.split('"')就會生效,否則會返回只包含字符串整體(即包含外層)的列表
print(input_.split('"')) # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'")) # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))右鍵run,鍵盤輸入123,回車!

1.2 嵌套字符串
輸入"abcde",回車:

輸入'abcde',回車:
- 根據輸入字符串中外層""或''的不同,以及split("'")與split('"')的不同,分割結果也不一樣:
- 具體可以通過repr()函數進行驗證,repr()函數顯示字符串整體,
- 直接print會隱藏字符串外層的''或""

1.3 字符串+列表 (仍會在外層嵌套字符串)
輸入"abcde",["a", "b", "c", "d", "e"],回車:
由兩部分構成:
第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中間用英文,隔開

那么怎么讀取"abcde",["a", "b", "c", "d", "e"]并得到"abcde"和["a", "b", "c", "d", "e"]兩部分呢?
--核心思想是找到分隔符所在的位置,然后分離兩部分,之后使用json.loads方法解析回列表:
# 從標準輸入讀取內容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割輸入為兩部分(字符串部分和列表部分)
# 找到第一個點是第一個逗號,確保只在列表內部
split_index = input_data.find(',')
print(repr(input_data[:split_index])) # '"abcde"'
str_part = input_data[:split_index].strip('"') # 提取字符串部分并去除引號
list_part_str = input_data[split_index+1:] # 提取列表部分的字符串# 將列表部分的字符串解析為Python列表
list_part = json.loads(list_part_str)# 輸出結果及類型驗證
print("字符串部分:", str_part)
print("字符串部分整體:", repr(str_part))
print("字符串部分類型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整體:", repr(list_part))
print("列表部分類型:", type(list_part))輸入"abcde",["a", "b", "c", "d", "e"],回車:

2. 讀取多行鍵盤輸入
一個算法經典示例:
題目:第一行是數據的組數,接下來每一行都有倆整數(空格隔開),求每一行倆整數和
輸入:
3 1 1 2 2 3 3
輸出:

真正示例的輸出應該直接是:(因為鍵盤輸入已經完全提前寫入了)
2 4 6
最后給一下code,結合著注釋著看應該回好一些~
- 1.1,1.2, 1.3
# 通過sys實現鍵盤輸入讀取
# 注意sys讀取輸入為字符串形式,即會在外面套上''
import sys
import json# 1. sys讀取一/多行輸入
# input_ = sys.stdin.read().strip() # 一次性讀取多行內容并合并成一個字符串
# input_ = sys.stdin.readline() # 一次讀取一行,會帶上(首尾的)行結束符/行回車符
input_ = sys.stdin.readline().strip() # 刪去首尾的空格符(一般都用這個)
# input_ = input() # (不建議)多行情況下很不方便,單行等效于sys.stdin.readline().strip()print(input_) # "abcde" | 'abcde' <這里實際上是'"abcde"',字符串顯示是不顯示外層的雙引號 | 如果輸入是'abcde',則實際上是"'abcde'">
print(repr(input_)) # 驗證一下有沒有嵌套字符串,
print(type(input_)) # str
# 平常我們以為英文單引號,雙引號是一樣的即.split('"')?=.split("'")), 其實不一樣,內層的' or "才是split的分割字符
# 還有一個細節是split的對象是字符串的內層,也就是打印出來的我們看到的那一部分
# 最難崩的一點是如果split生效,結果會在外層再套上一層''(注意這里不管內層是''還是""最后都會套上'')
# 這里split生效指的是分割字符存在于字符串的內層,如'"abcde"'.split('"')就會生效,否則會返回只包含字符串整體(即包含外層)的列表
print(input_.split('"')) # ['', 'abcde', ''] | ["'abcde'"]
print(input_.split("'")) # ['"abcde"'] | ['', 'abcde', '']
print(input_.split(','))"""
--例1【數字】:
123
123 <這里實際上是'123',數據類型是str>
'123'
<class 'str'>
['123']
['123']
['123']--例2【嵌套字符串】:
"abcde" | 'abcde'
"abcde" <這里實際上是'"abcde"',字符串顯示是不顯示最外層的雙引號> | <如果輸入是'abcde',則實際上是"'abcde'">
<class 'str'>
'"abcde"' | "'abcde'"
['', 'abcde', ''] | ["'abcde'"]
['"abcde"'] | ['', 'abcde', '']
['"abcde"'] | ["'abcde'"]--例三【混合情況】:
由兩部分構成,第一部分是字符串"abcde",第二部分是字符串列表["a", "b", "c", "d", "e"],中間用英文,隔開
"abcde",["a", "b", "c", "d", "e"] <實際上是'"abcde",["a", "b", "c", "d", "e"]'>
'"abcde",["a", "b", "c", "d", "e"]'
<class 'str'>
['', 'abcde', ',[', 'a', ', ', 'b', ', ', 'c', ', ', 'd', ', ', 'e', ']']
['"abcde",["a", "b", "c", "d", "e"]'] <只包含字符串整體(即包含外層)的列表>
['"abcde"', '["a"', ' "b"', ' "c"', ' "d"', ' "e"]']
包含6個元素'"abcde"'和'["a"' 和 ' "b"' 和 ' "c"' 和 ' "d"' 和 ' "e"]' (這里是因為列表中的字符串元素也是用英文,分割的,且,后有空格)
"""- 1.3解法
# 從標準輸入讀取內容并去除首尾空白
input_data = sys.stdin.readline().strip()# 分割輸入為兩部分(字符串部分和列表部分)
# 找到第一個點是第一個逗號,確保只在列表內部
split_index = input_data.find(',')
# print(repr(input_data[:split_index])) # '"abcde"'
str_part = input_data[:split_index].strip('"') # 提取字符串部分并去除引號
list_part_str = input_data[split_index+1:] # 提取列表部分的字符串# 將列表部分的字符串解析為Python列表
list_part = json.loads(list_part_str)# 輸出結果及類型驗證
print("字符串部分:", str_part)
print("字符串部分整體:", repr(str_part))
print("字符串部分類型:", type(str_part))
print("列表部分:", list_part)
print("列表部分整體:", repr(list_part))
print("列表部分類型:", type(list_part))"""
字符串部分: abcde
字符串部分整體: 'abcde'
字符串部分類型: <class 'str'>
列表部分: ['a', 'b', 'c', 'd', 'e']
列表部分整體: ['a', 'b', 'c', 'd', 'e']
列表部分類型: <class 'list'>
"""- 2
# 算法示例題(用sys讀取多行輸入)
# 題目:第一行是數據的組數,接下來每一行都有倆整數(空格隔開),求每一行倆整數和
n = int(sys.stdin.readline().strip()) # 得到第一行數據,即數據組數(下面一共有多少行)
for _ in range(n):pair = sys.stdin.readline().strip() # 開始讀空格隔開的整數對num1, num2 = int(pair.split()[0]), int(pair.split()[1])print(num1 + num2)"""
--測試樣例:
3
1 1
2 2
3 3--輸出:
2
4
6
"""