Python 输入输出全整理:别让 input() 成为你笔试路上的绊脚石
很多同学学 Python 的时候,最先接触的可能不是算法,也不是面向对象,而是这句朴素得像白开水一样的代码:
name = input()
它看起来平平无奇,但在编程题里,输入输出就是“门票”。算法写得再牛,如果输入没读对,输出格式不对,判题系统会用两个字温柔地安慰你:
Wrong Answer。
甚至有时候不是你算法错了,是你把列表原样输出成了:
[1, 2, 3]
而题目要的是:
1 2 3
判题系统看完沉默了三秒,然后坚定地给你判错。它不是不懂你,它只是太严格。
所以这篇文章就来系统整理一下 Python 编程题中常见的输入输出写法。
一、最基础输入:input()
input() 的作用是读取一整行输入,返回的是字符串。
s = input()
print(s)
输入:
hello
输出:
hello
注意,input() 读进来的一定是字符串。
也就是说:
n = input()
即使你输入的是:
123
变量 n 的类型也是字符串,不是整数。
如果你想读整数,要这样写:
n = int(input())
这就像你去饭店点菜,服务员听到了“123”,但她不知道你是要 123 号桌,还是 123 块钱,还是 123 份米饭。你必须告诉 Python:这是整数。
二、读取一个整数
很多题第一行会给一个整数,比如:
5
表示有 5 个数字、5 组数据、5 个怪兽、5 个老板,反正就是 5 个什么东西。
代码写法:
n = int(input())
完整例子:
n = int(input())
print(n)
输入:
5
输出:
5
这个写法非常常用,属于刷题必备。
三、读取一行多个整数
比如输入:
3 10
表示 n = 3,m = 10。
这时候可以用:
n, m = map(int, input().split())
解释一下:
input()
先读取一整行,得到:
"3 10"
然后:
split()
按空格切开,得到:
["3", "10"]
然后:
map(int, ...)
把字符串转成整数。
最后赋值给:
n, m
完整代码:
n, m = map(int, input().split())
print(n, m)
输入:
3 10
输出:
3 10
这一句在笔试里出现频率极高,建议直接背下来。
它的地位大概相当于 Java 里的 public static void main,C++ 里的 #include <bits/stdc++.h>,以及面试里的“我简单介绍一下自己”。
四、读取一行整数数组
比如输入:
6 5 10
想得到列表:
[6, 5, 10]
代码:
nums = list(map(int, input().split()))
完整例子:
nums = list(map(int, input().split()))
print(nums)
输入:
6 5 10
输出:
[6, 5, 10]
这里的 list() 很重要。
因为 map() 返回的不是直接的列表,而是一个可迭代对象。你可以理解为它像一个外卖员:东西在路上,但还没放到你桌上。加上 list(),才是真正把东西摆盘。
五、读取多行输入
有些题输入是这样的:
3
1 2
3 4
5 6
第一行表示有 3 组数据,后面每行两个数。
代码可以这样写:
n = int(input())
for _ in range(n):
a, b = map(int, input().split())
print(a + b)
输入:
3
1 2
3 4
5 6
输出:
3
7
11
这里的 _ 表示循环变量用不上。
它的意思大概是:“我只是来循环的,别问我是谁。”
六、使用 sys.stdin.read() 一次性读取所有输入
当数据量比较大时,很多人会用:
import sys
data = sys.stdin.read()
它会一次性读取所有输入。
比如输入:
3 10
6 5 10
代码:
import sys
data = list(map(int, sys.stdin.read().split()))
print(data)
输出:
[3, 10, 6, 5, 10]
这样不管输入是分成两行:
3 10
6 5 10
还是写成一行:
3 10 6 5 10
都能读到。
所以对于一些输入格式比较“豪放”的题目,sys.stdin.read() 非常稳。
比如:
import sys
def main():
data = list(map(int, sys.stdin.read().split()))
n = data[0]
m = data[1]
nums = data[2:]
print(n, m, nums)
if __name__ == "__main__":
main()
这个写法很适合笔试。
它的优点是:
第一,速度快。
第二,不怕换行乱。
第三,代码看起来有一种“我经常刷题”的专业感。
七、使用 sys.stdin.readline() 按行快速读取
还有一种写法:
import sys
s = sys.stdin.readline()
它和 input() 很像,也是读取一行。
区别是:sys.stdin.readline() 通常更快一些。
常见写法:
import sys
n = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))
不过要注意,readline() 读进来的字符串末尾可能带换行符 \n。
比如:
s = sys.stdin.readline()
如果输入是:
hello
那么 s 可能是:
"hello\n"
所以很多时候会配合:
strip()
例如:
s = sys.stdin.readline().strip()
strip() 的作用是去掉首尾空白字符,包括换行符。
可以理解为给字符串洗了个澡,把前后的空格和换行洗掉。
八、三种输入方式怎么选?
简单总结:
1. 普通题目,用 input()
n = int(input())
nums = list(map(int, input().split()))
适合输入格式清晰、数据量不大的题。
2. 数据量大,用 sys.stdin.readline()
import sys
n = int(sys.stdin.readline())
nums = list(map(int, sys.stdin.readline().split()))
适合大量按行读取。
3. 输入很多且格式不太固定,用 sys.stdin.read()
import sys
data = list(map(int, sys.stdin.read().split()))
适合一次性读取所有数据。
我的建议是:
如果是平时刷题,input() 足够。
如果是入职笔试、在线考试,推荐掌握 sys.stdin.read(),因为它快、稳、不挑食。
九、最常见输出:print()
输出最常用的就是:
print()
比如:
print("hello")
print(123)
输出:
hello
123
print() 默认输出之后会换行。
也就是说:
print("hello")
print("world")
输出:
hello
world
它不会输出成:
hello world
因为 print() 很讲礼貌,每次说完话都换行。
十、一行输出多个变量
比如:
a = 3
b = 5
print(a, b)
输出:
3 5
默认中间用空格隔开。
如果你想自定义分隔符,可以用 sep。
print(1, 2, 3, sep=",")
输出:
1,2,3
如果用:
print(1, 2, 3, sep="-")
输出:
1-2-3
sep 就是 separator,分隔符。
你可以理解为它是数字之间的“中介”,负责决定大家之间隔着什么。
十一、控制输出结尾:end
print() 默认结尾是换行。
比如:
print("hello")
print("world")
输出:
hello
world
如果你不想换行,可以写:
print("hello", end=" ")
print("world")
输出:
hello world
这里:
end=" "
表示输出结束后不要换行,而是输出一个空格。
再比如:
print("A", end="")
print("B")
输出:
AB
end 的作用就是控制一句话说完之后干什么。
默认是换行,相当于说完就走。
设置成空格,就是说完还站旁边。
设置成空字符串,就是说完直接贴上去。
十二、输出列表的正确姿势
这是很多新手最容易踩坑的地方。
假设有一个列表:
nums = [1, 2, 3]
如果你直接写:
print(nums)
输出是:
[1, 2, 3]
但很多题目要求输出:
1 2 3
这时候应该写:
print(*nums)
输出:
1 2 3
这里的 *nums 可以理解为把列表“拆开”。
原来是一个整体:
[1, 2, 3]
拆开后就是:
1 2 3
就像你买了一袋橘子,print(nums) 是把整袋橘子扔给别人,print(*nums) 是把橘子一个一个摆出来。
十三、用 join 输出数组
还有一种更常见于字符串拼接的写法:
nums = [1, 2, 3]
print(" ".join(map(str, nums)))
输出:
1 2 3
为什么要 map(str, nums)?
因为 join() 只能拼接字符串,不能直接拼接整数。
错误写法:
print(" ".join(nums))
会报错。
正确写法:
print(" ".join(map(str, nums)))
这句话的意思是:
先把数字变成字符串:
[1, 2, 3] -> ["1", "2", "3"]
再用空格拼起来:
1 2 3
十四、多行输出
如果答案是一个列表,每个元素单独一行,比如:
ans = [3, 5, 7]
可以这样写:
for x in ans:
print(x)
输出:
3
5
7
也可以用:
print("\n".join(map(str, ans)))
输出同样是:
3
5
7
当输出内容很多时,第二种写法更高效。
因为频繁 print() 就像一个人每次只搬一块砖,来回跑很多趟。
join() 是先把砖码好,然后一车拉走。
十五、笔试推荐模板一:普通输入版
适合大多数简单题:
def main():
n, m = map(int, input().split())
nums = list(map(int, input().split()))
ans = 0
# 在这里写你的算法逻辑
print(ans)
if __name__ == "__main__":
main()
这个模板结构清晰,适合笔试和面试。
十六、笔试推荐模板二:快速输入版
适合数据量大、输入多的题:
import sys
def main():
data = list(map(int, sys.stdin.read().split()))
n = data[0]
m = data[1]
nums = data[2:]
ans = 0
# 在这里写你的算法逻辑
print(ans)
if __name__ == "__main__":
main()
这个模板非常适合在线笔试。
优点是输入快,而且不怕题目样例换行奇怪。
十七、常见输入输出场景总结
场景一:输入一个整数
n = int(input())
场景二:输入两个整数
a, b = map(int, input().split())
场景三:输入一行数组
nums = list(map(int, input().split()))
场景四:输入 n 行,每行两个数
n = int(input())
for _ in range(n):
a, b = map(int, input().split())
场景五:一次性读取所有整数
import sys
data = list(map(int, sys.stdin.read().split()))
场景六:输出一个答案
print(ans)
场景七:一行输出多个数
print(a, b, c)
场景八:输出列表,空格分隔
print(*nums)
或者:
print(" ".join(map(str, nums)))
场景九:列表每个元素单独一行
print("\n".join(map(str, nums)))
十八、最容易犯的错误
错误一:忘记把输入转成整数
错误写法:
n = input()
print(n + 1)
这会报错,因为 n 是字符串。
正确写法:
n = int(input())
print(n + 1)
错误二:输出列表格式不符合要求
错误写法:
nums = [1, 2, 3]
print(nums)
输出:
[1, 2, 3]
正确写法:
print(*nums)
输出:
1 2 3
错误三:输入行数和代码不匹配
题目输入:
3 10
6 5 10
你却写:
n = int(input())
m = int(input())
这就会出问题。
因为第一行有两个数,不是一个数。
正确写法:
n, m = map(int, input().split())
nums = list(map(int, input().split()))
错误四:大数据还疯狂用 input()
一般情况下 input() 没问题,但如果输入量特别大,可能会慢。
更稳的写法是:
import sys
data = sys.stdin.read().split()
十九、最后给一份万能笔试模板
如果你不知道该用哪种,入职笔试可以优先用这个:
import sys
def main():
data = list(map(int, sys.stdin.read().split()))
# 按题目要求解析数据
# 例如:
# n = data[0]
# nums = data[1:]
ans = 0
# 写你的算法逻辑
print(ans)
if __name__ == "__main__":
main()
这个模板就像出门带充电宝,不一定每次都用得上,但用上的时候你会感谢自己。
二十、结语
Python 输入输出看起来简单,但在编程题里非常关键。
很多时候,你不是输给了算法,而是输给了:
input().split()
不是败给了动态规划,而是败给了输出格式。
不是不会做题,而是 print(nums) 多打了两个中括号。
所以建议大家把常见输入输出写法练熟,形成肌肉记忆。
真正考试的时候,你的大脑应该用来想算法,而不是现场思考:
“这个 map 到底要不要加 list?”
“这个数组输出到底能不能直接 print?”
“为什么我样例对了,提交却错了?”
记住一句话:
输入输出写得稳,判题系统才会觉得你是自己人。
更多推荐
所有评论(0)