很多同学学 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 = 3m = 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?”

“为什么我样例对了,提交却错了?”

记住一句话:

输入输出写得稳,判题系统才会觉得你是自己人。

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐