第五章 输入
到現在為止,希望程序“處理一些數”時,都必須把這些數直接放在代碼中。例如,如果編寫了前面講的溫度轉換程序,你可能會把要轉換的溫度直接放在代碼中。如果想要轉換一個不同的溫度,就必須修改代碼。
如果你希望用戶在程序運行時輸入他想轉換的溫度呢?之前我們說過,一個程序有3大部分:輸入、處理和輸出。我們的第一個程序只有輸出。溫度轉換程序有處理(轉換溫度)和輸出,但是沒有輸入。現在該向程 序增加第三個部分了:輸入。輸入就是指在程序運行時向其提供某樣東西,也就是某種信息。
這樣一來,我們就能寫出與用戶交互的程序,這就有趣多了。
Python有一個內置函數,名為raw_input(),可以用這個函數從用戶那里得到輸入。在這一章中,我們將學習如何在程序中使用raw_input()。
5.1 raw_input()
raw_input()函數從用戶那里得到一個字符串。正常情況下會從鍵盤得到這個輸入,也就是說,用戶要鍵入輸入。
raw_input()也是一個Python內置函數,就像str()、int()、float()和type()一樣(在第4章中已經見過這些函數)。后面還會學習更多有關函數的內容。不過對現在來說,只需要記住使用raw_input()時要加上小括號(圓括號)。
Raw input
在Python 3中,raw_input()改名為input()了。它與Python 2中的raw_input()完全一樣。
可以這樣來使用:
someName=raw_input()
這會讓用戶鍵入一個字符串,并把它賦給名字someName。
現在把它放在程序里。在IDLE中創建一個新文件,鍵入代碼清單5-1中的代碼。
代碼清單5-1 使用raw_input()得到一個字符串
print "Enter your name: "
somebody=raw_input()
print “Hi”, somebody, “how are you today?”
保存這個程序,并在IDLE中運行,看看它如何工作。應該可以看到類似下面的結果:
Enter your name:
Warren
Hi Warren how are you today?
我鍵入了我的名字,程序把它賦給了somebody。
5.2 print命令和逗號
通常情況下,希望從用戶得到輸入時,必須告訴他你想要什么,應當提供類似這樣的一個消息:
print "Enter your name: "
然后用raw_input()函數得到用戶的響應:
someName=raw_input()
如果運行這些代碼行,并鍵入你的名字,會得到:
Enter your name:
Warren
如果希望用戶在消息的同一行上鍵入他的答案,只需要在print語句的末尾放上一個逗號,就像這樣:
print "Enter your name: ",
someName=raw_input()
復制代碼
注意逗號放在結束引號的外面。
如果運行這個代碼,會得到:
Enter your name: Warren
逗號可以用來把多個print語句合并到同一行上。逗號只是表示“打印完這個內容后不要跳轉到下一行”。代碼清單5-1的最后一行就是這么做的。
在IDLE編輯器窗口中鍵入代碼清單5-2中的代碼,并運行這個程 序。
代碼清單5-2 逗號用來做什么?
print “My”,
print “name”,
print “is”,
print “Dave.”
復制代碼
運行這個程序時應該會得到這樣的結果:
My name is Dave.
注意到了嗎?引號中的每個詞末尾都沒有空格,但是運行這個程序時每個單詞之間卻出現了空格。使用逗號將多個print語句合并到同一行時,Python會增加一個空格。
行尾逗號
在Python 3中,通過在行尾添加逗號使得打印的內容都在同一行的方法不再有效。而且,在Python 3中使用print()時,要打印的內容必須被包含在一對括號中。所以如果你在使用Python 3,代碼清單5-2應該是這樣:
print( “My” , end=" “)
print( “name” , end=” “)
print( “is” , end=” “)
print( “Dave.” , end=” ")
復制代碼
打印raw_input()提示語的簡便方法
打印提示消息還有一種簡便方 法。raw_input()函數可以直接打印消息,所以你根本不必使用print語句:
someName=raw_input ("Enter your name: ")
這就像raw_input()函數內置了print一樣。從現在起我們都將使用這個簡便方法。
說得對!有了raw_input(),
根本不用再另外買其他東西!
沒有必要再使用print!
既然raw_input()已經內置了print,又何必另外掏錢呢?
只需要付區區99.95美元,它 就是你的了!
5.3 輸入數字
我們已經見過如何使用raw_input()來得到字符串。但是如果希望得到一個數該怎么做呢?畢竟,我們之所以討論輸入,原本就是為了讓用戶為我們的溫度轉換程序輸入溫度。
如果你讀過第4章,應該已經知道答案了。可以從raw_input()給我們的字符串使用int()或float()函數創建一個數。可以像這樣:
temp_string=raw_input()
fahrenheit=float(temp_string)
復制代碼
先使用raw_input()得到用戶的輸入(一個字符串)。然后使用float()由這個字符串創建一個數。得到溫度(作為浮點數)后,為它指定名字fahrenheit。
不過還有一種簡便方法。只需一步就可以完成所有這些工作,如下:
fahrenheit=float(raw_input())
所做的工作是一樣的。它由用戶得到字符串,然后從這個字符串創建一個數。這里只是稍稍少寫一點代碼。
下面在我們的溫度轉換程序中使用這種方法。試著運行代碼清單5-3中的程序,看看會得到什么。
代碼清單5-3 使用raw_input()轉換溫度
還可以把代碼清單5-3最后3行合并為一行,像這樣:
print “That is”, celsius, “degrees Celsius”
這實際上是之前3個print語句的簡寫形式。
結合int()使用raw_input()
如果你希望用戶輸入的數總是整數(而不是小數),可以用int()來轉換,例如:
response=raw_input("How many students are in your class: ")
numberOfStudents=int(response)
復制代碼
像(Python)程序員一樣思考
得到數字輸入還有一種方法。Python 2有一個名叫input()的函數,可以直接提供一個數,所以不必使用int()或float()來轉換。我們在第1章的猜數程序中用過這個函數,因為這是從用戶得到一個數的最簡單的方法。
但為了保持一致,我們在本書的剩余部分會始終使用raw_input()。而且,Python 3中 去除了input()函數(可以直接獲取數字而不需要進行轉換),只有raw_input()。更令人感到混亂的是,Python 2中的raw_input()在Python 3中改名為input(),但它的功能仍然和你在這一章中見到的這個函數一樣,只會得到字符串。因為我們很清楚怎樣從一個字符串創建一個數,所以建議使用raw_input(),而不要用Python 2中的input()。
5.4 來自互聯網的輸入
通常,程序的輸入都來自用戶。不過還有其他一些方法得到輸入。可以從計算機硬盤上的文件中得到輸入,或者也可以從互聯網獲取輸入。
如果你能連接互聯網,可以試試代碼清單的程序。它會從這本書的網站打開一個文件,為你顯示這個文件中的消息。
代碼清單 從互聯網上的一個文件得到輸入
import urllib2
file=urllib2.urlopen(‘http://helloworldbook2.com/data/message.txt’)
message=file.read()
print message
復制代碼
就這么簡單。只需要區區4行代碼,你的計算機就可以通過互聯網得到這本書網站上的一個文件,并顯示這個文件。如果試著運行這個程序(假設你的互聯網連接工作正常),你會看到這個消息。
向程序員一樣思考
根據你使用的操作系統(Windows、Linux或Mac OS X),運行代碼清單5-4中的程序時,你可能會在每行末尾看到小方塊或類似\r的字符。這是因為,不同的操作系統使用不同的方法來指示文本行的結束。Windows(和之前的MS-DOS)使用兩個字符:CR(回車)和LF(換行)來表示。Linux只使用LF,Mac OS X只使用CR。
有些程序可以處理所有這些情況,不過有些程序(比如IDLE)看到行結束符與它期望的不一致時,就會不知所措。發生這種情況時,它們會顯示一個小方塊,表示“我不理解這個字符”。你可能會看到這樣的小方塊,也可能看不到,這取決于你在使用什么操作系統,還取決于你如何運行程序(使用IDLE還是采用另外某種方法)。
你學到了什么
在這一章,你學到了以下內容。
用raw_input()輸入文本。
向raw_input()增加一個提示消息。
結合int()和float()使用raw_input()輸入數字。
使用逗號將多行打印到一行上。
總結
- 上一篇: Java微服务篇4——Elastic s
- 下一篇: 音高和基频(Pitch and F0)