昨天我們學習了轉義字元、如何從用戶那裡獲得輸入、以及如何給用戶提示信息。今天我們繼續學習練習 13-15 關於參數、解包、變數、如何提示用戶輸入,以及如何閱讀文件等一些內容。
練習 13 參數,解包,變數
在這個練習中我們會再學習一種 方法,通過這種方法可以把變數傳給一個腳本(也就是你的 文件)。
想想我們之前都是如何運行腳本文件的,比如要運行 ,就是輸入 (Windows 下輸入 )。這句命令中的 就叫做參數(argument)。我們現在要做的就是寫一個也接受參數的腳本。
先做完這個練習,然後我們再詳細分解:
(註:第二行注釋中的 WYSS 是「What You Should See」,即練習中的「你會看到」部分,在示例代碼這部分的後面)
ex13.py
第一行我們進行了 「import」(導入),這樣可以把 Python 功能庫中的特徵或者功能(features)添加到我們的腳本中。Python 不會一次把所有的功能都給我們用,為了不讓程序過於龐大,需要我們自己去導入需要的功能,這樣也可以為其它閱讀你代碼的程序員提供參考。
後面的 是 「argument variable」 (參數變數),這是一個在編程語言中非常標準和常見的名字。當你運行 Python 腳本的時候,這個變數(variable)保存了你傳給 Python 腳本的參數(argument),也就是說, 不是一個參數,而是一個保存參數的變數。
在第三行中,我們「解包」(unpacks)了 ,把它分成了四個變數:, , , 以及 。「解包」這個詞可能現在很難理解,但是它很恰當地定義了這個操作。你可以理解為, 這個參數變數在文件運行的時候接收了四個參數,而後又把這四個參數從左到右分配給了四個變數,最後像平常一樣把它們列印出來。
前面老肖一直把我們導入進來讓 python 做更多事情的東西叫做 features,但其實很少有人這麼叫它,它真正的名字應該是 modules (模塊)。所以之後的學習中,我們會說成「導入 模塊」。還有一些程序員把它們叫做「libraries」(庫),但是我們就用模塊這個名字吧。
你會看到
注意!我們之前一直都是直接運行 python 腳本,不用輸入命令行參數,但接下來的練習還需要加上參數,以後有 的地方都需要加上參數!
如果不明白怎麼操作,看下面輸出結果的第一行, 都是我們需要在命令行輸入的內容!其中 、 、、 代表了 4 個我們讓 保存的參數。
練習 13 結果
我們還可以把 、 、、 這 4 個參數換成任何想替換的內容,比如:
如果你沒有正確運行,就會收到這樣的報錯:
這種情況一般是你運行腳本的時候沒有在命令行放足夠的變數,在這個例子中只放了 、,所以就會出現錯誤說「需要三個以上的值來解包」,這就是告訴你,你沒有給到足夠多的參數。類似的報錯信息還包括
附加練習
試著給你的腳本三個以內的參數,看看你會收到什麼樣的報錯,你是否能解釋它。
寫一個參數少的腳本和一個參數多的腳本,給未解包的變數起個合適的名字。
把 和 結合起來創建一個腳本,從用戶那裡獲取更多 。別想得太難,就用 來獲取一些東西,再用 從用戶那裡獲取一些東西。
常見問題
和 之間的區別是什麼?區別取決於用戶在哪被要求輸入,如果是在命令行,就用 。如果你想讓它們在程序已經運行的情況下用鍵盤輸入,那就用 。
命令行參數是字元串嗎?是的,它們是以字元串的形式進來的,即使你在命令行輸入的是數字。你可以用 把它們轉化成數值,就像 。
我不知道怎麼把 和 結合在一起。別把它想得太難。就在腳本最後加兩行,用 獲取一些東西,再列印出來。然後試著用更多方式在同一個腳本中使用這兩樣東西。
為什麼我不能這樣用: ?因為它寫反了,按我的要求寫,就能運行。
注意:如果你現在還不知道怎麼使用命令行,先去學習附錄 A 的命令行速成教程,然後再學正文的練習。
練習 14 提示和傳遞
如果你在前面的附加練習中不知道怎麼把 和 結合在一起寫腳本,這個練習中我們就會學到。我們會用一種不同的方式使用 ,就是讓它列印出一個簡單的 提示符。廢話不多說,先做練習:
ex14.py
我們把用戶提示符設置成了變數 ,然後把它賦給 而不是一遍遍地輸入它們。現在如果我們想把提示符變成別的東西,只要修改一個地方,然後重新運行腳本即可,非常方便。
你會看到
注意:當你運行腳本的時候,記住一定要把你的名字賦給這個腳本,讓 接收到你的名字。
練習 14 結果
附加練習
查查看 Zork 和 Adventure 遊戲是什麼,找來玩玩。(這兩個遊戲我沒找到,找到的小夥伴可以在評論區留言,跟大家分享一下,實在找不到其實也沒關係,對學習理解沒有太大影響,所以不要糾結這個啦~)
把 變數改成別的東西。
在你的腳本里再加一個參數,就像之前練習中 一樣。
確定你理解了我是如何在最後一行把 多行格式字元(style multiline string)和 格式激活器(format activator)結合起來的。
常見問題
我運行腳本的時候收到了 。我再說一次,你得在命令行里運行它,而不是在 python 里。如果你輸入 ,然後再輸入 ,就會無法運行,因為你是在 python 裡面運行 python。關掉窗口,然後只輸入 。
你說的「改變提示符」是什麼意思?我不太理解。看到這個變數 了嗎?改變它的值, 只是一個字元串,前面的 13 個練習我們都在創建字元串,你得真正理解這個概念。(也就是把 換成別的內容)
我收到了報錯信息:我前面說過,你需要看看「你會看到」那部分然後複製我的做法。這兒也一樣,注意我是如何輸入命令行的,以及我為什麼有一個命令行參數。
我能在 變數外面用雙引號嗎?你完全可以,試試吧。
我運行的時候收到了報錯信息: 。你要麼把 變數拼寫錯了,要麼把那行漏掉了。回過頭去,從下到上比較每一行代碼。記住,你一旦遇到這種報錯,就說明你拼寫錯誤或者忘了創建變數。
練習 15 閱讀文件
現在我們已經知道如何用 或者 來獲取用戶的輸入了。接下來我們將學習如何閱讀文件。對文件的操作要千萬小心,因為很容易把文件刪掉。
在這個練習中我們要寫兩個文件。一個是通常要運行的 ,一個是叫做 的文本文件。以下是文本文件中要輸入的內容:
我們要做的就是在我們的腳本中打開這個文件並把它列印出來。然而,我們不想只是簡單粗暴(hard coding)地把 這個文件名輸入進去(hard coding 的意思是把一些應該從用戶那裡獲取的信息直接放到源代碼里)。這樣不好,因為我們隨後會需要它載入別的文件。解決方法就是用 或者 來問用戶應該打開哪個文件,而不是 hard coding 文件名。
ex15.py
看第一遍可能不是特別明白,讓我們快速分解來看一下:
第 1-3 行用了 來獲取一個文件名,然後第 5 行用了一個新的命令 。我們可以通過運行 來看 的用法。
看完後你應該會明白,第 5 行所做的事情很簡單,就是打開了一個文件。具體來說,你在最開始運行腳本的時候輸入的第二個參數(即文本文件名)在第 3 行被解包給了 這個變數,現在對 這個變數使用 命令,也就是打開了 這個變數中包含的文本文件,然後這個打開的文本文件又被賦給了 變數。(不明白的話先往後看)
第 7 行列印了一些格式字元串信息,第 8 行我們對 用了一個叫做 的函數,我們從 那裡得到的是一個文件,而且我們還可以通過 、命令名、以及參數,來給它一個命令,就像用 和 那樣。區別是, 是說: ,執行不帶參數的 命令!
剩下的部分基本上類似,我們會把分析留到附加練習里。
你會看到
注意:再次強調,我們之前一直不帶參數運行腳本,現在我們學習 之後,在運行的時候就需要輸入要求的參數,否則一定會出錯。
在運行之前確保自己已經創建了前面要求的文本文件,可以命名為 。
練習 15 結果
附加練習
這部分可能比較難,在往下進行之前,最好花些心思來做這個附加練習。
在每行上面添加註釋解釋其含義。
如果你不確定,上網搜,或者問別人,比如你不知道 的用法,直接搜 即可。
我在這兒用的是「命令」(command)這個詞,不過,它也叫「函數」(function)或者「方法」(method)。你會在本書後面學到 functions 和 methods。
把第 10-15 行刪掉(或者用別的方法使其失效)然後再運行腳本。
只用 input 來試試運行這個腳本。為什麼關於獲取文件名,一種方法比另一種方法更好?
開啟 python3.6 shell,然後就像這個程序中一樣從提示界面用 。注意你是如何從 python3.6 裡面打開文件並運行 的?
在你的腳本中對 以及 變數 調用 。當你對它們完成操作後關掉文件是非常重要的。(注意要用 而不是)
第 6 題乍一看有點不明白是什麼意思,老肖就是想讓我們直接在命令行中使用來打開這個文本文件。具體如何操作,大家可以大膽嘗試,看看練習中是用什麼格式使用這個命令的,然後在命令行界面多試幾次。
這裡其實ai醬也遇到了一個小問題,雖然最後成功打開了 txt 文件(彈出文本文檔窗口),但是 Shell 上還是有報錯信息。我輸入的是:
錯誤信息是:
如果有遇到類似問題並解決了的小夥伴歡迎在評論區留言分享 solution~
常見問題
會返迴文件的內容嗎?不會。它其實是創建了一個叫做「文件對象」(file object)的東西。你可以把它想像成曾經的 DVD 播放器,你可以在裡面移動然後「讀取」它們。但是 DVD 播放器不是 DVD 本身,就像文件對象也不是文件本身一樣。
為什麼打開文件兩次不會收到報錯?
Python 不會限制你只能打開一次文件,事實上有時候確實需要打開多次。
是什麼意思?現在你只需要明白 是一個包(package),這個短語是說從那個包里獲取 功能(feature)。你會在後面深入學習這塊內容。
我把腳本文件名這樣放進去:, 但是無法運行。你不能這樣做。嚴格按照我的代碼來,然後用同樣的方法在命令行運行它。你不用把文件名放進去,你得讓 python 自己放。
好了,今天就學這麼多,大家應該感覺到了一些難度,不過只要邊練習邊思考了,很多問題自然就想明白了,不明白的地方也歡迎大家在評論區、公眾號後台留言,或者在群里跟大家交流~(由於公布群二維碼以後吸引了一些殭屍號和不可描述的號,所以群二維碼就不放了,大家還是先加ai醬微信再入群吧~)

好好學習|天天進步
喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!
本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!
請您繼續閱讀更多來自 Python 的精彩文章: