2020秋招季,终于开始刷第一套真题了,整套试卷就一道编程题,还是剑指offer上的原题,结果答案死活不对,最后干脆直接提交答案算了,看了下别人的答案,原来是输入数据没有获取的原因,不过这个语法sys.stdin以前还真是没有碰到过,以前用的都是input,不得不感慨一句,永远不要觉得自己学的多牛x,还是有很多东西都是自己根本不知道的,或者根本就没有意识到自己不知道,好了下面回到正题!
下面的讲解参考文章链接:
【不仅对sys.stdin和input进行讲解,对sys.stdout和print也进行了对比讲解】
下面根据参考文章写得自己的理解
一、sys.stdout与Print
原始的sys.stdout指向控制台,如果把文件的对象引用赋给sys.stdout,那么print调用的就是文件对象的write方法。即在调用print方法的时候,事实上调用了sys.stdout.write(obj+'\n')
print 将需要的内容打印到控制台,然后追加一个换行符
以下两行代码等价:
sys.stdout.write('hello' + '\n')print('hello')
二、sys.stdin与input
1、sys.stdin是一个标准化的输入方法,以sys.stdin.readline()为例讲解,下面先来看看一个小例子。
importsysprint('Plase input your name:')
name=sys.stdin.readline()print('Hello', name)
输出结果:
Plase input your name:
marry
Hello marry
2、python3中使用sys.stdin.readline()可以实现标准输入,其中默认输入的格式是字符串,如果是int,float类型则需要强制转换。
importsystry:whileTrue:print('Please input a number1:')
n1= sys.stdin.readline().strip('\n') #去掉输入行最后的\n,
print('Please input a number2:')
n2= sys.stdin.readline() #对比上面的输入结果,说明最后读取的数据最后将\n一起读取,最后是“字符串+\n”的形式
print('Please input some numbers:')
sn= sys.stdin.readline().strip() #若是多输入,strip()默认是以空格分隔
print(sn) #直接输出结果,说明读取的数据将最后的空格给去掉了,这里输入的时候在结尾的位置特意多加了一个空格
if sn == '':breaksn= list(map(int, sn.split())) #如果要强制转换成int等类型,可以调用map()函数。
print(n2+n1) #44 55\n 77 88
print(n1+n2) #77 8844 55 \n 用于演示说明strip可以实现将最后输入的指定字符去掉
print(sn)except:pass
输出结果:
Please input a number1:77 88Please input a number2:44 55Please input some numbers:78 45 12 #备注:这里输入的时候在最后是特意加了一个空格的,下一行是输出结果,可以看到,空格是没有读取到的,读取的内容是去掉空格之后的字符。
78 45 12
44 55
77 88#备注:这里是为了验证加了strip和不加strip的区别,strip可以实现将最后输入的指定字符去掉,不读取。
77 8844 55[78, 45, 12]
3、python3中sys.stdin与input的区别
(1)input()括号内可以直接填写说明文字,sys.stdin还需要加个print方法给出提示信息。
importsys
name1= input('请输入姓名1:')print('请输入姓名2:')
name2=sys.stdin.readline()print(name1)print(name2)
输出结果:
请输入姓名1:mike
请输入姓名2:
tom
mike
tom
(2)sys.stdin.readline( )会将标准输入全部获取,包括末尾的'\n',因此用len计算长度时是把换行符'\n'算进去了的,但是input( )获取输入时返回的结果是不包含末尾的换行符'\n'的。
importsys
name1=input()
name2=sys.stdin.readline()print(len(name1))print(len(name2))
输出结果:
mike
mike4
5
因此如果在平时使用sys.stdin.readline( )获取输入的话,不要忘了去掉末尾的换行符,可以用strip( )函数(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]这两种方法去掉换行。
#示例二:比较使用strip方法之后的区别
importsys
name1=input()
name2=sys.stdin.readline()
name3= sys.stdin.readline().strip('\n')
name4= sys.stdin.readline()[:-1]print(len(name1))print(len(name2))print(len(name3))print(len(name4))
输出结果:
mike
mike
mike
mike4
5
4
4
三、sys.stdin循环读取输入数据
下面给出的示例用于跟牛客网的代码解析器进行对比,结果表明,两个代码都是可以运行的,为了方便使用,推荐用第一种,第一种不好理解的话,其原理参考示例二。
#示例:循环读取输入结果,下面的示例一是参考答案给的输入代码,但是没有弄明白这个程序怎么结束输入,#牛客网有自己的程序验证机制,两个程序进行对比,两个代码都是可以实现循环读取数据,#为了方便使用,推荐用第一种,不好理解的话,实现原理参考示例二。
importsys#示例一:循环读取输入的数据,不考虑以什么结尾来结束输入
names =[]for each insys.stdin:
names.append(int(each))print(names)#示例二:循环读取输入的数据,以\n结尾来结束输入
names =[]for each insys.stdin:if each == '\n':break
else:
names.append(int(each))print(names)
四、把读取输入数据拿下后,结合真题来看看求连续子数组的最大和怎么解决?
输入一个整形数组(可能有正数和负数),求数组中连续子数组(最少有一个元素)的最大和。要求时间复杂度为O(n)。
defFind_max_num(array):if notarray:returnNone
pre_count=0
max_count= -0xffffff
for each inarray:if pre_count <0:
pre_count=eachelse:
pre_count+=eachif pre_count >max_count:
max_count=pre_countreturnmax_countimportsys
N=input()
nums=[]for each insys.stdin:
nums.append(int(each))
maxnum=Find_max_num(nums)print(maxnum)
由于牛客网上提交代码的时候不能添加中文注释,所以单独给出以下注释:
N = input() #获取第一行的数据,数组的长度N
nums.append(int(each)) #由于sys.stdin输入的是字符类型的数据,所以需要进行数据格式转化
好了,到这就写完了,虽然花了很长时间进行代码验证,但是还是很值得的!