Python中的sys.stdin和input、sys.stdout與print--附帶講解劍指offer42-連續子數組的最大和


2020秋招季,終於開始刷第一套真題了,整套試卷就一道編程題,還是劍指offer上的原題,結果答案死活不對,最后干脆直接提交答案算了,看了下別人的答案,原來是輸入數據沒有獲取的原因,不過這個語法sys.stdin以前還真是沒有碰到過,以前用的都是input,不得不感慨一句,永遠不要覺得自己學的多牛x,還是有很多東西都是自己根本不知道的,或者根本就沒有意識到自己不知道,好了下面回到正題!

下面的講解參考文章鏈接:

https://blog.csdn.net/CAU_Ayao/article/details/81985103【只結合了sys.stdin和input進行講解,給出的例子也比較全面】

https://www.cnblogs.com/keye/p/7859181.html【不僅對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()為例講解,下面先來看看一個小例子。

import sys
print('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類型則需要強制轉換。

import sys
try:
    while True:
        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 == '':
            break
        sn = 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 88
Please input a number2:
44 55
Please 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方法給出提示信息。

import  sys
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'的。

import  sys
name1 = input()
name2 = sys.stdin.readline()
print(len(name1))
print(len(name2))

  輸出結果:

mike
mike
4
5

因此如果在平時使用sys.stdin.readline( )獲取輸入的話,不要忘了去掉末尾的換行符,可以用strip( )函數(sys.stdin.readline( ).strip('\n'))或sys.stdin.readline( )[:-1]這兩種方法去掉換行。

# 示例二:比較使用strip方法之后的區別
import  sys
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
mike
4
5
4
4

 三、sys.stdin循環讀取輸入數據

下面給出的示例用於跟牛客網的代碼解析器進行對比,結果表明,兩個代碼都是可以運行的,為了方便使用,推薦用第一種,第一種不好理解的話,其原理參考示例二。

# 示例:循環讀取輸入結果,下面的示例一是參考答案給的輸入代碼,但是沒有弄明白這個程序怎么結束輸入,
# 牛客網有自己的程序驗證機制,兩個程序進行對比,兩個代碼都是可以實現循環讀取數據,
# 為了方便使用,推薦用第一種,不好理解的話,實現原理參考示例二。
import  sys
# 示例一:循環讀取輸入的數據,不考慮以什么結尾來結束輸入
names = []
for each in sys.stdin:
    names.append(int(each))
print(names)
# 示例二:循環讀取輸入的數據,以\n結尾來結束輸入
names = []
for each in sys.stdin:
    if each == '\n':
        break
    else:
        names.append(int(each))
print(names)

四、把讀取輸入數據拿下后,結合真題來看看求連續子數組的最大和怎么解決?

輸入一個整形數組(可能有正數和負數),求數組中連續子數組(最少有一個元素)的最大和。要求時間復雜度為O(n)。

def Find_max_num(array):
    if not array:
        return None
    pre_count = 0
    max_count = -0xffffff
    for each in array:
        if pre_count < 0:
            pre_count = each
        else:
            pre_count += each
        if pre_count > max_count:
             max_count = pre_count
    return max_count
import sys
N = input()
nums = []
for each in sys.stdin:
    nums.append(int(each))
maxnum = Find_max_num(nums)
print(maxnum)

由於牛客網上提交代碼的時候不能添加中文注釋,所以單獨給出以下注釋:

N = input() # 獲取第一行的數據,數組的長度N
nums.append(int(each))  # 由於sys.stdin輸入的是字符類型的數據,所以需要進行數據格式轉化

 

 

好了,到這就寫完了,雖然花了很長時間進行代碼驗證,但是還是很值得的!

 

最后說明:博主尊重原創,如有侵權,聯系刪帖,歡迎監督和提醒!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM