Python中常用到的两种标准化输入方式:分别sys.stdin和input,两者使用方式大致相同,但是总的来说sys.stdin使用方式更加多样化一些,下面就例子说明两者之间的使用差别。
input/raw_input 输入
input输入很简单,就是获得用户的输入,一般是在控制台界面。
1 | word=input('please input one or more word\n') |
运行之后就可以等待用户输入了,最终系统会认为回车键是输入的结束,接下来对输入做任何处理就是你自己的事情啦。
sys.stdin 输入
第一他也可以实现和input一样的功能,比如
1 | import sys |
但是,他更常见的是另外一种使用方式,可以直接使用文件作为整体的输入,可以很简洁。1
2
3
4import sys
print('please input one or more word\n')
word=sys.stdin.readline()
print (word)
使用方法,将文件重定向到输入中去就可以很方便的使用。
控制台中,比如:1
$ python test.py < test.txt
关于raw_input( )和sys.stdin.readline( )的区别
之前一直认为用raw_input( )和sys.stdin.readline( )来获取输入的效果完全相同,但是最近在写程序时有类似这样一段代码:1
2
3
4
5
6import sys
line = sys.stdin.readline()
for i in range(len(line)):
print line[i]+'hello'
它的运行结果让我百思不得其解:1
2
3
4
5
6
7123
1hello
2hello
3hello
hello
请按任意键继续。。。
怎么会多输出一个空行和hello?然后特意输出了line的长度,发现是4,然后重新调试了几次,发现无论输入什么,len(line)的长度总比输入的长度大1,然后用raw_input( )试着运行了一下,运行是正常的,然后查阅了一下文档,发现sys.stdin.readline( )会将标准输入全部获取,包括末尾的’\n’,因此用len计算长度时是把换行符’\n’算进去了的,但是raw_input( )获取输入时返回的结果是不包含末尾的换行符’\n’的。
因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )
函数去掉 sys.stdin.readline( ).strip('\n')
,这样处理一下就行了。
其他等价写法
print 与 sys.stdout()
print 'hello'
等价于 sys.stdout.write('hello' + '\n')
输出并且显示,末尾有换行
raw_input 与 sys.stdin()
s = raw_input('请输入:')
等价于 print('请输入:')
(可用上式替换)
s = sys.stdin.readline()
值得注意的是:
在输入的后面可用split
分割输入的字符串使之成为一个列表。例:s = sys.stdin.readline().split()
在输入的后面还可用 strip
去掉末尾空格。
Python 中 read() 和 readline() readlines() 区别
read()
:将文件一次全部读取成一个字符串,包括特殊字符,需要较大内存
readline()
:将文件根据换行符一行一行读取
readlines()
:将文件一次性读取到内存,依行为单位读取为一个列表对象
上述主要是进行标准化输入与获取,这一部分要和参数传递分清楚,其实Python最常用的就是参数传递也就是argpares模块和sys模块。
题目oj平台实例:
案例一:
输入描述:
第一行有三个整数N, M, K
接下来N行,每行M个整数为输入的矩阵
获取输入实现: 利用stdin1
2
3
4
5
6
7import sys
list_num = sys.stdin.readline().split() #读取第一行,分割,即[ 'N', 'M', 'K' ]
N,M,K = [int(list_num[i]) for i in range(len(list_num))] #对字符列表 int() 类型转化,得到 int
...
for i in range(N):
line = sys.stdin.readline() #依次遍历所有行,每行存入变量line进行处理
... ...
案例二:
输入描述:
第一行一个整数N,表示数组长度
第二行N个整数,分别表示数组内的元素
获取输入实现: 利用input1
2length = int(input()) # 读取第一行 ['N'], int()转换得到 N
arr = list(map(int, input().split())) # 读取第二行,map()操作每个元素int()转换,得到 int列表
案例三:
输入描述:
第一行有两个整数n, k
接下来一行有n个整数表示数组内的元素
获取输入实现:1
2length, target = map(int, input().split())
arr = list(map(int, input().split()))
案例四:
输入描述:
第一行输入一个整数N,表示对栈进行的操作总数。
下面N行每行输入一个字符串S,表示操作的种类。
如果S为”push”,则后面还有一个整数X表示向栈里压入整数X。
如果S为”pop”,则表示弹出栈顶操作。
如果S为”getMin”,则表示询问当前栈中的最小元素是多少。
获取输入实现:1
2
3
4
5
6
7
8
9
10# N = int(input()) 也可以
N = int(sys.stdin.readline().strip()) #这里的去空格 都是保险操作,没有也行
for i in range(N):
#command = sys.stdin.readline().split() 不用去空格也行
command = sys.stdin.readline().strip()
command = command.split() # 每个command即 ["push/pop/getMin", "num"]
command[0] == "push/pop/getMin"
(int)command[1] == num
... ...