Python輸入函數input()的總結與相應拓展(python input()、 python3 input())

目錄

一、正常形式

二、運用異常處理結構

三、接收多個數據

四、利用eval()函數


Python3裏面輸入函數是input(),該函數將所有的輸入都當做string來處理,但是實際運用中,需要各種類型的數據,需要進行轉換,且在轉換過程中可能會存在各種問題。我針對我最近遇到的幾個小習題做了些總結,作爲菜鳥,水平一般,如果有不全或錯誤,望海涵。

 

一、正常形式

Python3提供了input()函數來接收用戶從鍵盤的輸入,input()函數將所有輸入都作爲string類型來處理。

例如:

num=input("請輸入一個整數:")
print(type(num))

'''
執行結果如下:

請輸入一個整數:2018
<class 'str'>
'''

亦或是

num=input("請輸入一個浮點數:")
print(type(num))

'''
執行結果如下:

請輸入一個浮點數:13.14
<class 'str'>
'''

也就是說,不管輸入什麼類型的數據,都返回一個string類型的數據。

二、運用異常處理結構

但是在實際使用中我們需要各種類型的數據,比如整型,最簡單的方式就是用int()來轉換。

比如,這題:

#編寫程序:從鍵盤輸入某個分鐘數,將其轉換爲用小時和分鐘表示

num=int(input("please input a number "))    #這裏面就是用int()來轉換
hour=num//60  #整除
min=num%60 #求餘
print("hour is %.f"%hour)
print("min is %.f"%min)

'''
輸出結果
please input a number 366
hour is 6
min is 6
'''

但是,在上題中,你如果輸入一個“整數”可以順利轉換,但是如果你輸入一個“英文字母串”,就會轉換失敗,這時候就需要運用Python裏面的異常處理結構try……except……,且使用ValueError來接收拋出的錯誤。

#如果輸入“字母”程序將無法執行,產生如下錯誤

please input a number abcd
Traceback (most recent call last):
  File "D:/Python/習題解析/Temp.py", line 1, in <module>
    num = int(input("please input a number"))
ValueError: invalid literal for int() with base 10: 'abcd'

運用異常處理後:

try:
    num=int(input("please input a number: "))
    hour=num//60
    min=num%60
    print("hour is %.f"%hour)
    print("min is %.f"%min)
except ValueError:  #由於值錯誤,而不能順利轉換,會拋出ValueError錯誤
    print("請輸入一個整形數據!")

'''
執行結果如下:

please input a number: abcdefg
請輸入一個整形數據!
'''

如果加上循環,就可以實現重複輸入,直到得到符合要求的數據。例如下面這題:

#輸入半徑,求圓的面積

PI=3.1415926  #半徑
while True:
    try:
        r=input("Please input a number:")
        r=float(r)  #如果不能轉換成float類型,則拋出異常,執行except 後面的語句,不會執行下面這句break
        break     #如果上面順利轉換,沒有拋出異常,執行break語句,結束循環,轉到 area=r*r*PI
    except ValueError:
        print("請輸入一個整數或者小數")
        continue  #結束本次循環,接着輸入數據

area=r*r*PI
print("area is %.4f"%area)

'''
實驗結果如下:

Please input a number:abc
請輸入一個整數或者小數
Please input a number:123abc
請輸入一個整數或者小數
Please input a number:1  2
請輸入一個整數或者小數
Please input a number:10
area is 314.1593

'''

三、接收多個數據

實際運用中,我們可能會需要一次輸入多個數據,或者說將一個數據當多個用,比如需要統計“一句句子”由多少個“單詞”組成,這時候一句input()語句,要接收一整個句子,我們需要使用str.split()函數來處理。該函數具體可參考str.split()  ,split()函數運用指定的分隔符對字符串進行分割,返回一個列表,列表裏面是分割好的子字符串。

#輸入一句英文句子,統計其中包含多少個單詞 (假設沒有逗號和句號!!!)
s=input("please input a string:")  #輸入句子
counter=0
for i in s.split(" "):   #用字符串s調用split方法,分割符爲" "(空格)
    #返回列表,將列表裏面的子字符串迭代出來。
    if i:
        counter+=1
print("The counter is:%.f"%counter)

'''
運行結果如下

please input a string:bu po lou lan zhong bu huan
The counter is:7

'''

但是實際的句子是有逗號和句號的,這時候也需要有分割,但是,是多分割。str.split()只能指定單個分隔符,如果需要指定多個分隔符,需要導入re模塊,使用re.split()方法。具體可參考:Python中使用多個分隔符分隔字符串re.split

#輸入一段英文,統計其中包含多少個單詞
import re
s=input("please input a string:")
counter=0

for i in re.split(r'[\s,。]',s):  #多分割,分割附分別是 空格 逗號(英文) 句號
    if i:
        counter+=1

print("The counter is:%.f"%counter)

'''
運行結果如下

please input a string:ni,hao ma。wo hen hao
The counter is:6

'''

上述是只需要分割的情況,有時候即需要分割,又需要轉換,這時候需要map()函數,該函數具體可參考:Python map() 函數  例如下題:

#輸入平面上的兩個點,計算兩點的距離

import math

while True:
    try:
        p1=input("please the start point x1,y1:")  #輸入第一個點,中間以逗號作爲分割
        p2=input("please the start point x2,y2:")  #第二個點

        #map()函數,將p1.split(",")以逗號作爲分割後得到的列表中的子字符串,全部轉換爲float型。
        #如果在map()裏面轉換失敗,拋出ValueError錯誤

        x1,y1=map(float,p1.split(",")) #split本質返回一個列表
        x2,y2=map(float,p2.split(",")) #split本質返回一個列表

        distance = math.sqrt((x1 - x2) ** 2 + (y1 - y2) ** 2)
        print("distance=", distance)
        break

    except ValueError:
        print("數據類型錯誤,請重輸!")
        continue

'''
執行結果如下:

please the start point x1,y1:1,2
please the start point x2,y2:a,b
數據類型錯誤,請重輸!
please the start point x1,y1:1,2
please the start point x2,y2:5,4
distance= 4.47213595499958

'''

四、利用eval()函數

後來,我又遇到了一道題目是這樣的:輸入“ [[1,2,3],[4,5,6],[7,8,9]] ”,輸出矩陣形式,剛開始,我確實想了很多辦法,分割和刪除各種組合,希望能去掉方括號,但是都失敗了。後來突然想到了eval()這個神奇的函數,一步到位。

我們可以先看一下eval()這個函數的用法:

l = '[1,2,3,4,[5,6,7,8,9]]'
d = "{'a':123,'b':456,'c':789}"
t = '([1,3,5],[5,6,7,8,9],[123,456,789])'

print(type(l), type(eval(l)))  
print(type(d), type(eval(d)))
print(type(t), type(eval(t)))

'''
執行結果如下:

<class 'str'> <class 'list'>
<class 'str'> <class 'dict'>
<class 'str'> <class 'tuple'>

看出作用了嗎?
'''

然後來解決上面這個問題:

#將3行3列的矩陣按其形狀輸出,例如,輸入爲[[1,2,3],[4,5,6],[7,8,9]],輸出爲:

str=input("pleased input a 3*3 array:")
print(str,type(str))
str=eval(str)
print(str,type(str))

'''
[[1,2,3],[4,5,6],[7,8,9]] <class 'str'>
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] <class 'list'>

雖然兩次輸出,樣式看起來一致,但是類型已經由“字符串”轉換成了“列表”
'''
#接下里只需要將列表裏面的數迭代輸出即可。
for x in str:
    s=""
    for y in x:
        s1="%6d"%y  #總共佔6位,可忽略,不是這篇的重點
        s=s+s1
    print(s)

"""
運行結果如下:

pleased input a 3*3 array:[[1,2,3],[4,5,6],[7,8,9]]
[[1,2,3],[4,5,6],[7,8,9]] <class 'str'>
[[1, 2, 3], [4, 5, 6], [7, 8, 9]] <class 'list'>
     1     2     3
     4     5     6
     7     8     9
"""

當然eval()的用法很靈活,但也不是都能用,具體自己把握。

本篇完。

另,如果有錯誤,或者你有更好的想法,歡迎留言交流。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章