第2章 變量和簡單數據類型
2-1 簡單消息: 將一條消息存儲到變量中,再將其打印出來。
2-2 多條簡單消息: 將一條消息存儲到變量中,將其打印出來;再將變量的值修改為一條新消息,並將其打印出來。
2-3 個性化消息: 將用戶的姓名存到一個變量中,並向該用戶顯示一條消息。顯示的消息應非常簡單,如“Hello Eric, would you like to learn some Python today?”。
2-4 調整名字的大小寫: 將一個人名存儲到一個變量中,再以小寫、大寫和首字母大寫的方式顯示這個人名。
2-5 名言: 找一句你欽佩的名人說的名言,將這個名人的姓名和他的名言打印出來。輸出應類似於下面這樣(包括引號):Albert Einstein once said, “A person who never made a mistake never tried anything new."
2-6 名言 2: 重復練習 2-5,但將名人的姓名存儲在變量 famous_person 中,再創建要顯示的消息,並將其存儲在變量 message 中,然后打印這條消息。
2-7 剔除人名中的空白: 存儲一個人名,並在其開頭和末尾都包含一些空白字符。務必至少使用字符組合"\t"和"\n"各一次。打印這個人名,以顯示其開頭和末尾的空白。然后,分別使用剔除函數 lstrip()、rstrip()和 strip()對人名進行處理,並將結果打印出來。
2-8 數字 8: 編寫 4 個表達式,它們分別使用加法、減法、乘法和除法運算,但結果都是數字 8。為使用 print 語句來顯示結果,務必將這些表達式用括號括起來,也就是說,你應該編寫 4 行類似於下面的代碼:print(5 + 3)輸出應為 4 行,其中每行都只包含數字 8。
2-9 最喜歡的數字: 將你最喜歡的數字存儲在一個變量中,再使用這個變量創建一條消息,指出你最喜歡的數字,然后將這條消息打印出來。
2-10 添加注釋: 選擇你編寫的兩個程序,在每個程序中都至少添加一條注釋。如果程序太簡單,實在沒有什么需要說明的,就在程序文件開頭加上你的姓名和當前日期,再用一句話闡述程序的功能。
2-11 Python 之禪: 在 Python 終端會話中執行命令 import this,並粗略地瀏覽一下其他的指導原則。
第3章 列表簡介
3-1 姓名: 將一些朋友的姓名存儲在一個列表中,並將其命名為 names。依次訪問該列表中的每個元素,從而將每個朋友的姓名都打印出來。
3-2 問候語: 繼續使用練習 3-1 中的列表,但不打印每個朋友的姓名,而為每人打印一條消息。每條消息都包含相同的問候語,但抬頭為相應朋友的姓名。
3-3 自己的列表: 想想你喜歡的通勤方式,如騎摩托車或開汽車,並創建一個包含多種通勤方式的列表。根據該列表打印一系列有關這些通勤方式的宣言,如“I would like to own a Honda motorcycle”。
3-4 嘉賓名單:如果你可以邀請任何人一起共進晚餐(無論是在世的還是故去的),你會邀請哪些人?請創建一個列表,其中包含至少 3 個你想邀請的人;然后,使用這個列表打印消息,邀請這些人來與你共進晚餐。
3-5 修改嘉賓名單:你剛得知有位嘉賓無法赴約,因此需要另外邀請一位嘉賓。
- 以完成練習 3-4 時編寫的程序為基礎,在程序末尾添加一條 print 語句,指出哪位嘉賓無法赴約。
- 修改嘉賓名單,將無法赴約的嘉賓的姓名替換為新邀請的嘉賓的姓名。
- 再次打印一系列消息,向名單中的每位嘉賓發出邀請。
3-6 添加嘉賓:你剛找到了一個更大的餐桌,可容納更多的嘉賓。請想想你還想邀請哪三位嘉賓。
- 以完成練習 3-4 或練習 3-5 時編寫的程序為基礎,在程序末尾添加一條 print 語句,指出你找到了一個更大的餐桌。
- 使用 insert()將一位新嘉賓添加到名單開頭。
- 使用insert()將一位新嘉賓添加到名單中間。
- 使用insert()將一位新嘉賓添加到名單末尾。
- 打印一系列消息,向名單中的每位嘉賓發出邀請。
3-7 縮減名單:你剛得知新購買的餐桌無法及時送達,因此只能邀請兩位嘉賓。
- 以完成練習 3-6 時編寫的程序為基礎,在程序末尾添加一行代碼,打印一條你只能邀請兩位嘉賓共進晚餐的消息。
- 使用 pop()不斷地刪除名單中的嘉賓,直到只有兩位嘉賓為止。每次從名單中彈出一位嘉賓時,都打印一條消息,讓該嘉賓知悉你很抱歉,無法邀請他來共進晚餐。 while len(persons)>2:
- 對於余下的兩位嘉賓中的每一位,都打印一條消息,指出他依然在受邀人之列。
- 使用 del 將最后兩位嘉賓從名單中刪除,讓名單變成空的。打印該名單,核實程序結束時名單確實是空的。
3-8 放眼世界:想出至少 5 個你渴望去旅游的地方。
- 將這些地方存儲在一個列表中,並確保其中元素不是按字母順序排序的
- 按原始排列順序打印該列表
- 使用sorted()按字母順序打印這個列表,同時不要修改它
- 再次打印該列表,核實排列順序未改變
- 使用sorted()按字母順序相反的順序打印這個列表,同時不要修改它
- 再次打印該列表,核實排列順序未改變
- 使用reserve()修改列表元素的排列順序。打印該列表,核實列表排序確實變了
- 使用reserve()再次修改列表元素的排列順序。打印該列表,核實已經恢復到原來的排列順序
- 使用sort()按字母順序打印這個列表,使其元素按字母順序排序。打印該列表,核實列表排序確實變了
- 使用sort()按字母順序相反的順序打印這個列表,使其元素按字母順序相反的排序。打印該列表,核實列表排序順序確實變了
3-9 晚餐嘉賓:在完成練習 3-4~練習 3-7 時編寫的程序之一中,使用 len()打印一條消息,指出你邀請了多少位嘉賓來與你共進晚餐。
3-10 嘗試使用各個函數:想想可存儲到列表中的東西,如山岳、河流、國家、城市、語言或你喜歡的任何東西。編寫一個程序,在其中創建一個包含這些元素的列表,然后,對於本章介紹的每個函數,都至少使用一次來處理這個列表
3-11 有意引發錯誤:如果你還沒有在程序中遇到過索引錯誤,就嘗試引發一個這種錯誤。在你的一個程序中,修改其中的索引,以引發索引錯誤。關閉程序前,務必消除這個錯誤。
第4章 操作列表
4-1 比薩:想出至少三種你喜歡的比薩,將其名稱存儲在一個列表中,再使用 for循環將每種比薩的名稱都打印出來。
- 修改這個 for 循環,使其打印包含比薩名稱的句子,而不僅僅是比薩的名稱。對於每種比薩,都顯示一行輸出,如“I like pepperoni pizza”。
- 在程序末尾添加一行代碼,它不在 for 循環中,指出你有多喜歡比薩。輸出應包含針對每種比薩的消息,還有一個總結性句子,如“I really love pizza!”。
4-2 動物:想出至少三種有共同特征的動物,將這些動物的名稱存儲在一個列表中,再使用 for 循環將每種動物的名稱都打印出來。
- 修改這個程序,使其針對每種動物都打印一個句子,如“A dog would make a greatpet”。
- 在程序末尾添加一行代碼,指出這些動物的共同之處,如打印諸如“Any of these animals would make a great pet!”這樣的句子。
4-3 數到 20:使用一個 for 循環打印數字 1~20(含)。
4-4 一百萬:創建一個列表,其中包含數字 1~1 000 000,再使用一個 for 循環將這些數字打印出來(如果輸出的時間太長,按 Ctrl + C 停止輸出,或關閉輸出窗口)。
4-5 計算 1~1 000 000 的總和:創建一個列表,其中包含數字 1~1 000 000,再使用min()和 max()核實該列表確實是從 1 開始,到 1 000 000 結束的。另外,對這個列表調用函數 sum(),看看 Python 將一百萬個數字相加需要多長時間。
4-6 奇數:通過給函數 range()指定第三個參數來創建一個列表,其中包含 1~20 的奇數;再使用一個 for 循環將這些數字都打印出來。
4-7 3 的倍數:創建一個列表,其中包含 3~30 內能被 3 整除的數字;再使用一個 for循環將這個列表中的數字都打印出來。
4-8 立方:將同一個數字乘三次稱為立方。例如,在 Python 中, 2 的立方用 2 * * 3表示。請創建一個列表,其中包含前 10 個整數(即 1~10)的立方,再使用一個 for 循環將這些立方數都打印出來。
4-9 立方解析:使用列表解析生成一個列表,其中包含前 10 個整數的立方。
4-10 切片:選擇你在本章編寫的一個程序,在末尾添加幾行代碼,以完成如下任務。
- 打印消息“The first three items in the list are:”,再使用切片來打印列表的前三個元素。
- 打印消息“Three items from the middle of the list are:”,再使用切片來打印列表中間的三個元素。
- 打印消息“The last three items in the list are:”,再使用切片來打印列表末尾的三個元素。
4-11 你的比薩和我的比薩:在你為完成練習 4-1 而編寫的程序中,創建比薩列表的副本,並將其存儲到變量 friend_pizzas 中,再完成如下任務。
- 在原來的pizza列表中添加一種披薩。
- 在friend_pizzas列表中添加零一種披薩。
- 核實你有兩個不同的列表。為此,打印消息“My favorite pizzas are:”,再使用一個 for 循環來打印第一個列表;打印消息“My friend’s favorite pizzas are:”,再使用一個 for 循環來打印第二個列表。核實新增的比薩被添加到了正確的列表中。
4-12 使用多個循環:在本節中,為節省篇幅,程序 foods.py 的每個版本都沒有使用for 循環來打印列表。請選擇一個版本的 foods.py,在其中編寫兩個 for 循環,將各個食品列表都打印出來。
4-13 自助餐:有一家自助式餐館,只提供五種簡單的食品。請想出五種簡單的食品,並將其存儲在一個元組中。
- 使用for循環將五種食物打印出來。
- 嘗試修改其中的一個元素,核實 Python 確實會拒絕你這樣做。
- 餐館調整了菜單,替換了它提供的其中兩種食品。請編寫一個這樣的代碼塊:給元組變量賦值,並使用一個 for 循環將新元組的每個元素都打印出來。
4-14 PEP8:訪問https://python.org/dev/peps/pep-0008,閱覽PEP8格式設置指南。
第5章 if語句
5-1 條件測試:編寫一系列條件測試;將每個測試以及你對其結果的預測和實際結果都打印出來。你編寫的代碼應類似於下面這樣:
car
=
‘subaru’
print
(“Is car
=
=
‘subaru’? I predict
True
.”)
print
(car
=
=
‘subaru’)
print
(
"\nIs car == ‘audi’? I predict False."
)
print
(car
=
=
‘audi’)
|
5-2 更多的條件測試:你並非只能創建 10 個測試。如果你想嘗試做更多的比較,可再編寫一些測試,並將它們加入到 conditional_tests.py 中。對於下面列出的各種測試,至少編寫一個結果為 True 和 False 的測試。
- 檢查兩個字符串相等和不等。
- 使用函數 lower()的測試。
- 檢查兩個數字相等、不等、大於、小於、大於等於和小於等於。
- 使用關鍵字 and 和 or 的測試。
- 測試特定的值是否包含在列表中。
- 測試特定的值是否未包含在列表中。
5-3 外星人顏色 #1:假設在游戲中剛射殺了一個外星人,請創建一個名為alien_color 的變量,並將其設置為’green’、 ‘yellow’或’red’。
- 編寫一條 if 語句,檢查外星人是否是綠色的;如果是,就打印一條消息,指出玩家獲得了 5 個點。
- 編寫這個程序的兩個版本,在一個版本中上述測試通過了,而在另一個版本中未通過(未通過測試時沒有輸出)。
5-4 外星人顏色#2:像練習 5-3 那樣設置外星人的顏色,並編寫一個 if-else 結構。
- 編寫一條if語句,檢查外星人是否是綠色的;如果是,就打印一條消息,指出玩家因射殺該外星人獲得了5個點。如果不是,指出玩家獲得了10個點。
- 編寫這個程序的兩個版本,在一個版本中執行 if 代碼塊,而在另一個版本中執行 else 代碼塊。
5-5 外星人顏色#3:將練習 5-4 中的 if-else 結構改為 if-elif-else 結構。
- 如果外星人是綠色的,就打印一條消息,指出玩家獲得了 5 個點。
- 如果外星人是黃色的,就打印一條消息,指出玩家獲得了 10 個點。
- 如果外星人是紅色的,就打印一條消息,指出玩家獲得了 15 個點。
- 編寫這個程序的三個版本,它們分別在外星人為綠色、黃色和紅色時打印一條消息。
5-6 人生的不同階段: 設置變量 age 的值, 再編寫一個 if-elif-else 結構, 根據 age的值判斷處於人生的哪個階段。
- 如果一個人的年齡小於 2 歲,就打印一條消息,指出他是嬰兒。
- 如果一個人的年齡為 2(含)~4 歲,就打印一條消息,指出他正蹣跚學步。
- 如果一個人的年齡為 4(含)~13 歲,就打印一條消息,指出他是兒童。
- 如果一個人的年齡為 13(含)~20 歲,就打印一條消息,指出他是青少年。
- 如果一個人的年齡為 20(含)~65 歲,就打印一條消息,指出他是成年人。
- 如果一個人的年齡超過 65(含) 歲,就打印一條消息,指出他是老年人
5-7 喜歡的水果:創建一個列表,其中包含你喜歡的水果,再編寫一系列獨立的 if語句,檢查列表中是否包含特定的水果。
- 將該列表命名為favorite_fruits,並在其中包含三種水果
- 編寫 5 條 if 語句,每條都檢查某種水果是否包含在列表中,如果包含在列表中,就打印一條消息,如“You really like bananas!”。
5-8 以特殊方式跟管理員打招呼:創建一個至少包含 5 個用戶名的列表,且其中一個用戶名為’admin’。想象你要編寫代碼,在每位用戶登錄網站后都打印一條問候消息。遍歷用戶名列表,並向每位用戶打印一條問候消息。
- 如果用戶名為'admin',就打印一條特殊的問候消息,如“Hello admin, would you like to see a status report?”。
- 否則,打印一條普通的問候消息,如“Hello Eric, thank you for logging in again”。
5-9 處理沒有用戶的情形:在為完成練習 5-8 編寫的程序中,添加一條 if 語句,檢查用戶名列表是否為空。
- 如果為空,就打印消息“We need to find some users!”。
- 刪除列表中的所有用戶名,確定將打印正確的消息。
5-10 檢查用戶名:按下面的說明編寫一個程序,模擬網站確保每位用戶的用戶名都獨一無二的方式
- 創建一個至少包含 5 個用戶名的列表,並將其命名為 current_users。
- 再創建一個包含 5 個用戶名的列表,將其命名為 new_users,並確保其中有一兩個用戶名也包含在列表 current_users 中。
- 遍歷列表 new_users,對於其中的每個用戶名,都檢查它是否已被使用。如果是這樣,就打印一條消息,指出需要輸入別的用戶名;否則,打印一條消息,指出這個用戶名未被使用。
- 確保比較時不區分大消息;換句話說,如果用戶名'John'已被使用,應拒絕用戶名'JOHN'。
5-11 序數:序數表示位置,如 1st 和 2nd。大多數序數都以 th 結尾,只有 1、 2 和 3例外。
- 在一個列表中存儲數字 1~9。
- 遍歷這個列表。
- 在循環中使用一個 if-elif-else 結構,以打印每個數字對應的序數。輸出內容應為1st、 2nd、 3rd、 4th、 5th、 6th、 7th、 8th 和 9th, 但每個序數都獨占一行。
第6章 字典
6-1 人:使用一個字典來存儲一個熟人的信息,包括名、姓、年齡和居住的城市。該字典應包含鍵 first_name、 last_name、 age 和 city。將存儲在該字典中的每項信息都打印出來。
6-2 喜歡的數字:使用一個字典來存儲一些人喜歡的數字。請想出 5 個人的名字,並將這些名字用作字典中的鍵;想出每個人喜歡的一個數字,並將這些數字作為值存儲在字典中。打印每個人的名字和喜歡的數字。為讓這個程序更有趣,通過詢問朋友確保數據是真實的。
6-3 詞匯表: Python 字典可用於模擬現實生活中的字典,但為避免混淆,我們將后者稱為詞匯表。
- 想出你在前面學過的 5 個編程詞匯,將它們用作詞匯表中的鍵,並將它們的含義作為值存儲在詞匯表中。
- 以整潔的方式打印每個詞匯及其含義。為此,你可以先打印詞匯,在它后面加上一個冒號,再打印詞匯的含義;也可在一行打印詞匯,再使用換行符(\n)插入一個空行,然后在下一行以縮進的方式打印詞匯的含義
6-4 詞匯表 2:既然你知道了如何遍歷字典,現在請整理你為完成練習 6-3 而編寫的代碼,將其中的一系列 print 語句替換為一個遍歷字典中的鍵和值的循環。確定該循環正確無誤后,再在詞匯表中添加 5 個 Python 術語。當你再次運行這個程時,這些新術語及其含義將自動包含在輸出中。
6-5 河流:創建一個字典,在其中存儲三條大河流及其流經的國家。其中一個鍵—值對可能是’nile’: ‘egypt’。
- 使用循環為每條河流打印一條消息,如“The Nile runs through Egypt.”。
- 使用循環將該字典中每條河流的名字都打印出來。
- 使用循環將該字典包含的每個國家的名字都打印出來。
6-6 調查:在 6.3.1 節編寫的程序 favorite_languages.py 中執行以下操作。
- 創建一個應該會接受調查的人員名單,其中有些人已包含在字典中,而其他人未包含在字典中。
- 遍歷這個人員名單,對於已參與調查的人,打印一條消息表示感謝。對於還未參與調查的人,打印一條消息邀請他參與調查。
6-7 人:在為完成練習 6-1 而編寫的程序中,再創建兩個表示人的字典,然后將這三個字典都存儲在一個名為 people 的列表中。遍歷這個列表,將其中每個人的所有信息都打印出來。
6-8 寵物:創建多個字典,對於每個字典,都使用一個寵物的名稱來給它命名;在每個字典中,包含寵物的類型及其主人的名字。將這些字典存儲在一個名為 pets 的列表中,再遍歷該列表,並將寵物的所有信息都打印出來。
6-9 喜歡的地方:創建一個名為 favorite_places 的字典。在這個字典中,將三個人的名字用作鍵;對於其中的每個人,都存儲他喜歡的 1~3 個地方。為讓這個練習更有趣些,可讓一些朋友指出他們喜歡的幾個地方。遍歷這個字典,並將其中每個人的名字及其喜歡的地方打印出來。
6-10 喜歡的數字:修改為完成練習6-2而編寫的程序,讓每個人都可以有多個喜歡的數字,然后將每個人的名字以及喜歡的數字打印出來。
6-11 城市:創建一個名為 cities 的字典,其中將三個城市名用作鍵;對於每座城市,都創建一個字典,並在其中包含該城市所屬的國家、人口約數以及一個有關該城市的事實。在表示每座城市的字典中,應包含 country、 population 和 fact 等鍵。將每座城市的名字以及有關它們的信息都打印出來。
第7章 用戶輸入和while循環
7-1 汽車租賃:編寫一個程序,詢問用戶要租賃什么樣的汽車,並打印一條消息,如“Let me see if I can find you a Subaru”。
7-2 餐館訂位:編寫一個程序,詢問用戶有多少人用餐。如果超過 8 人,就打印一條消息,指出沒有空桌;否則指出有空桌。
7-3 10的整數倍:讓用戶輸入一個數字,並指出這個數字是否是 10 的整數倍
7-4 比薩配料:編寫一個循環,提示用戶輸入一系列的比薩配料,並在用戶輸入’quit’時結束循環。每當用戶輸入一種配料后,都打印一條消息,說我們會在比薩中添加這種配料。
7-5 電影票:有家電影院根據觀眾的年齡收取不同的票價:不到 3 歲的觀眾免費;3~12 歲的觀眾為 10 美元;超過 12 歲的觀眾為 15 美元。請編寫一個循環,在其中詢問用戶的年齡,並指出其票價。
7-6 三個出口:以另一種方式完成練習 7-4 或練習 7-5,在程序中采取如下所有做法。
- 在 while 循環中使用條件測試來結束循環。
- 使用變量 active 來控制循環結束的時機。
- 使用 break 語句在用戶輸入'quit'時退出循環。
7-7 無限循環:編寫一個沒完沒了的循環,並運行它(要結束該循環,可按 Ctrl +C,也可關閉顯示輸出的窗口)。
7-8 熟食店:創建一個名為 sandwich_orders 的列表,在其中包含各種三明治的名字;再創建一個名為 finished_sandwiches 的空列表。遍歷列表sandwich_orders,對於其中的每種三明治,都打印一條消息,如 I made your tuna sandwich,並將其移到列表finished_sandwiches。所有三明治都制作好后,打印一條消息,將這些三明治列出來。
7-9 五香煙熏牛肉(pastrami)賣完了:使用為完成練習 7-8 而創建的列表sandwich_orders,並確保’pastrami’在其中至少出現了三次。在程序開頭附近添加這樣的代碼:打印一條消息,指出熟食店的五香煙熏牛肉賣完了;再使用一個 while 循環將列表 sandwich_orders 的’pastrami’都刪除。確認最終的列表 finished_sandwiches 中不包含’pastrami’。
7-10 夢想的度假勝地:編寫一個程序,調查用戶夢想的度假勝地。使用類似於“If you could visit one place in the world, where would you go?”的提示,並編寫一個打印調查結果的代碼塊。
第8章 函數
8-1 消息:編寫一個名為 display_message()的函數,它打印一個句子,指出你在本章學的是什么。調用這個函數,確認顯示的消息正確無誤。
8-2 喜歡的圖書:編寫一個名為 favorite_book()的函數,其中包含一個名為 title的形參。這個函數打印一條消息,如 One of my favorite books is Alice in Wonderland。調用這個函數,並將一本圖書的名稱作為實參傳遞給它。
8-3 T 恤:編寫一個名為 make_shirt()的函數,它接受一個尺碼以及要印到 T 恤上的字樣。這個函數應打印一個句子,概要地說明 T 恤的尺碼和字樣。使用位置實參調用這個函數來制作一件 T 恤;再使用關鍵字實參來調用這個函數。
8-4 大號 T 恤:修改函數 make_shirt(),使其在默認情況下制作一件印有字樣“I love Python”的大號 T 恤。調用這個函數來制作如下 T 恤:一件印有默認字樣的大號 T 恤、一件印有默認字樣的中號 T 恤和一件印有其他字樣的 T 恤(尺碼無關緊要)。
8-5 城市:編寫一個名為 describe_city()的函數,它接受一座城市的名字以及該城市所屬的國家。這個函數應打印一個簡單的句子,如 Reykjavik is in Iceland。給用於存儲國家的形參指定默認值。為三座不同的城市調用這個函數,且其中至少有一座城市不屬於默認國家。
8-6 城市名:編寫一個名為 city_country()的函數,它接受城市的名稱及其所屬的國家。這個函數應返回一個格式類似於下面這樣的字符串:"Santiago, Chile"至少使用三個城市國家對調用這個函數,並打印它返回的值。
8-7 專輯:編寫一個名為 make_album()的函數,它創建一個描述音樂專輯的字典。這個函數應接受歌手的名字和專輯名,並返回一個包含這兩項信息的字典。使用這個函數創建三個表示不同專輯的字典,並打印每個返回的值,以核實字典正確地存儲了專輯的信息。
給函數 make_album()添加一個可選形參,以便能夠存儲專輯包含的歌曲數。如果調用這個函數時指定了歌曲數,就將這個值添加到表示專輯的字典中。調用這個函數,並至少在一次調用中指定專輯包含的歌曲數。
8-8 用戶的專輯:在為完成練習 8-7 編寫的程序中,編寫一個 while 循環,讓用戶輸入一個專輯的歌手和名稱。獲取這些信息后,使用它們來調用函數 make_album(),並將創建的字典打印出來。在這個 while 循環中,務必要提供退出途徑。
8-9 魔術師:創建一個包含魔術師名字的列表,並將其傳遞給一名為show_magicians()的函數,這個函數打印列表中每個魔術師的名字。
8-10 了不起的魔術師:在你為完成練習 8-9 而編寫的程序中,編寫一個名為make_great()的函數,對魔術師列表進行修改,在每個魔術師的名字中都加入字樣“the Great”。調用函數show_magicians(),確認魔術師列表確實變了。
8-11 不變的魔術師:修改你為完成練習 8-10 而編寫的程序,在調用函make_great()時,向它傳遞魔術師列表的副本。由於不想修改原始列表,請返回修改后的列表,並將其存儲到另一個列表中。分別使用這兩個列表來調用 show_magicians(),確認一個列表包含的是原來的魔術師名字,而另一個列表包含的是添加了字樣“the Great”的魔術師名字。
8-12 三明治:編寫一個函數,它接受顧客要在三明治中添加的一系列食材。這個函數只有一個形參(它收集函數調用中提供的所有食材),並打印一條消息,對顧客點的三明治進行概述。調用這個函數三次,每次都提供不同數量的實參。
8-13 用戶簡介:復制前面的程序 user_profile.py,在其中調用 build_profile()來創建有關你的簡介;調用這個函數時,指定你的名和姓,以及三個描述你的鍵值對。
8-14 汽車:編寫一個函數,將一輛汽車的信息存儲在一個字典中。這個函數總是接受制造商和型號,還接受任意數量的關鍵字實參。這樣調用這個函數:提供必不可少的信息,以及兩個名稱—值對,如顏色和選裝配件。這個函數必須能夠像下面這樣進行調用:car = make_car(‘subaru’, ‘outback’, color=‘blue’, tow_package=True)打印返回的字典,確認正確地處理了所有的信息。
8-15 打印模型:將示例print_models.py中的函數放在另一個名為printing_functions.py的文件中;在print_models.py的開頭編寫一條import語句,並修改這個文件以使用導入的函數。
第9章 類
9-1 餐館:創建一個名為 Restaurant 的類,其方法__init__()設置兩個屬性:restaurant_name 和 cuisine_type。創建一個名為 describe_restaurant()的方法和一個名為 open_restaurant()的方法,其中前者打印前述兩項信息,而后者打印一條消息,指出餐館正在營業。
根據這個類創建一個名為 restaurant 的實例,分別打印其兩個屬性,再調用前述兩個方法。
9-2 三家餐館:根據你為完成練習 9-1 而編寫的類創建三個實例,並對每個實例調用方法 describe_restaurant()。
9-3 用戶:創建一個名為 User 的類,其中包含屬性 first_name 和 last_name,還有用戶簡介通常會存儲的其他幾個屬性。在類 User 中定義一個名為 describe_user()的方法,它打印用戶信息摘要;再定義一個名為 greet_user()的方法,它向用戶發出個性化的問候。
創建多個表示不同用戶的實例,並對每個實例都調用上述兩個方法。
9-4 就餐人數:在為完成練習 9-1 而編寫的程序中,添加一個名為 number_served的屬性,並將其默認值設置為 0。根據這個類創建一個名為 restaurant 的實例;打印有多少人在這家餐館就餐過,然后修改這個值並再次打印它。
添加一個名為 set_number_served()的方法,它讓你能夠設置就餐人數。調用這個方法並向它傳遞一個值,然后再次打印這個值。
添加一個名為 increment_number_served()的方法,它讓你能夠將就餐人數遞增。調用這個方法並向它傳遞一個這樣的值:你認為這家餐館每天可能接待的就餐人數。
9-5 嘗試登錄次數:在為完成練習 9-3 而編寫的 User 類中,添加一個名為login_attempts 的屬性。編寫一個名為 increment_login_attempts()的方法,它將屬性login_attempts 的值加 1。再編寫一個名為 reset_login_attempts()的方法,它將屬性login_attempts 的值重置為 0。
根據 User 類創建一個實例,再調用方法 increment_login_attempts()多次。打印屬性login_attempts 的值,確認它被正確地遞增;然后,調用方法 reset_login_attempts(),並再次打印屬性 login_attempts 的值,確認它被重置為 0。
9-6 冰淇淋小店:冰淇淋小店是一種特殊的餐館。編寫一個名為 IceCreamStand 的類,讓它繼承你為完成練習 9-1 或練習 9-4 而編寫的 Restaurant 類。這兩個版本的Restaurant 類都可以,挑選你更喜歡的那個即可。添加一個名為 flavors 的屬性,用於存儲一個由各種口味的冰淇淋組成的列表。編寫一個顯示這些冰淇淋的方法。創建一個IceCreamStand 實例,並調用這個方法。
9-7 管理員:管理員是一種特殊的用戶。編寫一個名為 Admin 的類,讓它繼承你為完成練習 9-3 或練習 9-5 而編寫的 User 類。添加一個名為 privileges 的屬性,用於存儲一個由字符串(如"can add post"、 “can delete post”、 "can ban user"等)組成的列表。編寫一個名為 show_privileges()的方法,它顯示管理員的權限。創建一個 Admin實例,並調用這個方法。
9-8 權限:編寫一個名為 Privileges 的類,它只有一個屬性——privileges,其中存儲了練習 9-7 所說的字符串列表。將方法 show_privileges()移到這個類中。在 Admin類中,將一個 Privileges 實例用作其屬性。創建一個 Admin 實例,並使用方法show_privileges()來顯示其權限。
9-9 電瓶升級:在本節最后一個electric_car.py版本中,給Battery類添加一個名為upgrade_battery()的方法。這個方法檢查電瓶容量,如果它不是85,就將它設置為85。創建一輛電瓶容量為默認值的電動車,調用方法get_range(),然后對電瓶進行升級,並再次調用get_range()。你會看到這輛汽車的續航里程增加了。
9-10 導入 Restaurant 類:將最新的 Restaurant 類存儲在一個模塊中。在另一個文件中,導入 Restaurant 類,創建一個 Restaurant 實例,並調用 Restaurant 的一個方法,以確認 import 語句正確無誤。
9-11 導入 Admin 類:以為完成練習 9-8 而做的工作為基礎,將 User、 Privileges 和Admin 類存儲在一個模塊中,再創建一個文件,在其中創建一個 Admin 實例並對其調用方法 show_privileges(),以確認一切都能正確地運行。
9-12 多個模塊:將 User 類存儲在一個模塊中,並將 Privileges 和 Admin 類存儲在另一個模塊中。再創建一個文件,在其中創建一個 Admin 實例,並對其調用方法show_privileges(),以確認一切都依然能夠正確地運行。
9-13 使用 OrderedDict: 在練習 6-4 中,你使用了一個標准字典來表示詞匯表。請使用 OrderedDict 類來重寫這個程序,並確認輸出的順序與你在字典中添加鍵—值對的順序一致。
9-14 骰子:模塊 random 包含以各種方式生成隨機數的函數,其中的 randint()返回一個位於指定范圍內的整數,例如,下面的代碼返回一個 1~6 內的整數:
from
random
import
randint
x
=
randint(
1
,
6
)
|
請創建一個 Die 類,它包含一個名為 sides 的屬性,該屬性的默認值為 6。編寫一個名為 roll_die()的方法,它打印位於 1 和骰子面數之間的隨機數。創建一個 6 面的骰子,再擲 10 次。
創建一個 10 面的骰子和一個 20 面的骰子,並將它們都擲 10 次。
第10章 文件和異常
10-1 Python 學習筆記:在文本編輯器中新建一個文件,寫幾句話來總結一下你至此學到的 Python 知識,其中每一行都以“In Python you can”打頭。將這個文件命名為learning_python.txt,並將其存儲到為完成本章練習而編寫的程序所在的目錄中。編寫一個程序,它讀取這個文件,並將你所寫的內容打印三次:第一次打印時讀取整個文件;第二次打印時遍歷文件對象;第三次打印時將各行存儲在一個列表中,再在 with 代碼塊外打印它們。
10-2 C 語言學習筆記:可使用方法 replace()將字符串中的特定單詞都替換為另一個單詞。下面是一個簡單的示例,演示了如何將句子中的’dog’替換為’cat’:
>>> message = “I really like dogs.”
>>> message.replace(‘dog’, ‘cat’)
‘I really like cats.’
讀取你剛創建的文件 learning_python.txt 中的每一行,將其中的 Python 都替換為另一門語言的名稱,如 C。將修改后的各行都打印到屏幕上。
10-3 訪客:編寫一個程序,提示用戶輸入其名字;用戶作出響應后,將其名字寫入到文件 guest.txt 中。
10-4 訪客名單:編寫一個 while 循環,提示用戶輸入其名字。用戶輸入其名字后,在屏幕上打印一句問候語,並將一條訪問記錄添加到文件 guest_book.txt 中。確保這個文件中的每條記錄都獨占一行。
10-5 關於編程的調查:編寫一個 while 循環,詢問用戶為何喜歡編程。每當用戶輸入一個原因后,都將其添加到一個存儲所有原因的文件中。
10-6 加法運算:提示用戶提供數值輸入時,常出現的一個問題是,用戶提供的是文本而不是數字。在這種情況下,當你嘗試將輸入轉換為整數時,將引發 TypeError 異常。編寫一個程序,提示用戶輸入兩個數字,再將它們相加並打印結果。在用戶輸入的任何一個值不是數字時都捕獲 TypeError 異常,並打印一條友好的錯誤消息。對你編寫的程序進行測試:先輸入兩個數字,再輸入一些文本而不是數字。
10-7 加法計算器:將你為完成練習 10-6 而編寫的代碼放在一個 while 循環中,讓用戶犯錯(輸入的是文本而不是數字)后能夠繼續輸入數字。
10-8 貓和狗:創建兩個文件 cats.txt 和 dogs.txt,在第一個文件中至少存儲三只貓的名字,在第二個文件中至少存儲三條狗的名字。編寫一個程序,嘗試讀取這些文件,並將其內容打印到屏幕上。將這些代碼放在一個 try-except 代碼塊中,以便在文件不存在時捕獲 FileNotFound 錯誤,並打印一條友好的消息。將其中一個文件移到另一個地方,並確認 except 代碼塊中的代碼將正確地執行。
10-9 沉默的貓和狗:修改你在練習 10-8 中編寫的 except 代碼塊,讓程序在文件不存在時一言不發。
10-11 喜歡的數字:編寫一個程序,提示用戶輸入他喜歡的數字,並使用json.dump()將這個數字存儲到文件中。再編寫一個程序,從文件中讀取這個值,並打印消息“I know your favourite number! It’s _____.”。
10-12 記住喜歡的數字:將練習 10-11 中的兩個程序合而為一。如果存儲了用戶喜歡的數字,就向用戶顯示它,否則提示用戶輸入他喜歡的數字並將其存儲到文件中。運行這個程序兩次,看看它是否像預期的那樣工作。
10-13 驗證用戶:最后一個remember_me.py版本假設用戶要么已輸入其用戶名,要么是首次運行該程序。我們應修改這個程序,以應對這樣的情形;當前和最后一次運行該程序的用戶並非同一個人。
為此,在greet_user()中打印歡迎用戶回來的消息前,先詢問他用戶名是否是對的。如果不對,就調用get_new_username()讓用戶輸入正確的用戶名。
第11章 測試代碼
11-1 城市和國家:編寫一個函數,它接受兩個形參:一個城市名和一個國家名。這個函數返回一個格式為 City, Country 的字符串,如 Santiago, Chile。將這個函數存儲在一個名為 city _functions.py 的模塊中。
創建一個名為 test_cities.py 的程序,對剛編寫的函數進行測試(別忘了,你需要導入模塊 unittest 以及要測試的函數)。編寫一個名為 test_city_country()的方法,核實使用類似於’santiago’和’chile’這樣的值來調用前述函數時,得到的字符串是正確的。運行 test_cities.py,確認測試 test_city_country()通過了。
11-2 人口數量:修改前面的函數,使其包含第三個必不可少的形參 population,並返回一個格式為 City, Country – population xxx 的字符串,如 Santiago, Chile – population 5000000。運行 test_cities.py,確認測試 test_city_country()未通過。
修改上述函數,將形參 population 設置為可選的。再次運行 test_cities.py,確認測試 test_city_country()又通過了。
再編寫一個名為 test_city_country_population()的測試,核實可以使用類似於‘santiago’、 'chile’和’population=5000000’這樣的值來調用這個函數。再次運行test_cities.py,確認測試 test_city_country_population()通過了。
11-3 雇員:編寫一個名為 Employee 的類,其方法__init__()接受名、姓和年薪,並將它們都存儲在屬性中。編寫一個名為 give_raise()的方法,它默認將年薪增加 5000美元,但也能夠接受其他的年薪增加量。
為 Employee 編寫一個測試用例,其中包含兩個測試方法: test_give_default_raise()和 test_give_custom_raise()。使用方法 setUp(),以免在每個測試方法中都創建新的雇員實例。運行這個測試用例,確認兩個測試都通過了。
第18~19章 Django
18-2 簡短的條目 :當前, Django 在管理網站或 shell 中顯示 Entry 實例時,模型Entry 的方法 __str__() 都在它的末尾加上省略號。請在方法 __str__() 中添加一條 if 語句,以便僅在條目長度超過 50 字符時才添加省略號。使用管理網站來添加一個長度少於 50 字符的條目,並核實顯示它時沒有省略號。
18-4 比薩店 :新建一個名為 pizzeria 的項目,並在其中添加一個名為 pizzas 的應用程序。定義一個名為 Pizza 的模型,它包含字段 name ,用於存儲比薩名稱,如 Hawaiian 和 Meat Lovers 。定義一個名為 Topping 的模型,它包含字段 pizza和 name ,其中字段 pizza 是一個關聯到 Pizza 的外鍵,而字段 name 用於存儲配料,如 pineapple 、 Canadian bacon 和 sausage 。
向管理網站注冊這兩個模型,並使用管理網站輸入一些比薩名和配料。使用 shell 來查看你輸入的數據。
18-5 膳食規划程序 :假設你要創建一個應用程序,幫助用戶規划一周的膳食。為此,創建一個文件夾,並將其命名為meal_planner,再這個文件夾中新建一個Django項目。接下來,新建一個名為meal_plans的應用程序,並為這個項目創建一個簡單的主頁。
18-6 比薩店主頁 :在你為完成練習 18-4 而創建的項目 Pizzeria 中,添加一個主頁。
18-7 模版文檔 :瀏覽django模板文檔,https://docs.djangoproject.com/en/1.8/ref/templates。自己開發項目時,可回頭參考該文檔。
18-8 比薩店頁面 :在練習 18-6 中開發的項目 Pizzeria 中添加一個頁面,它顯示供應的比薩的名稱。然后,將每個比薩名稱都設置成一個鏈接,單擊這種鏈接將顯示一個頁面,其中列出了相應比薩的配料。請務必使用模板繼承來高效地創建頁面。
19-1 博客 :新建一個 Django 項目,將其命名為 Blog 。在這個項目中,創建一個名為 blogs 的應用程序,並在其中創建一個名為 BlogPost 的模型。這個模型應包含 title 、 text 和 date_added 等字段。為這個項目創建一個超級用戶,並使用管理網站創建幾個簡短的帖子。創建一個主頁,在其中按時間順序顯示所有的帖子。
創建兩個表單,其中一個用於發布新帖子,另一個用於編輯既有的帖子。
嘗試填寫這些表單,確認它們能夠正確地工作。
19-2 博客賬戶 :在你為完成練習 19-1 而開發的項目 Blog 中,添加一個用戶身份驗證和注冊系統。讓已登錄的用戶在屏幕上看到其用戶名,並讓未注冊的用戶看到一個到注冊頁面的鏈接。
19-3 重構 :在 views.py 中,我們在兩個地方核實主題關聯到的用戶為當前登錄的用戶。請將執行這種檢查的代碼放在一個名為 check_topic_owner() 的函數中,並在恰當的地方調用這個函數。
19-4 保護頁面 new_entry :一個用戶可在另一個用戶的學習筆記中添加條目,方法是輸入這樣的 URL ,即其中包含輸入另一個用戶的主題的 ID 。為防范這種攻擊,請在保存新條目前,核實它所屬的主題歸當前用戶所有。
19-5 受保護的博客 :在你創建的項目 Blog 中,確保每篇博文都與特定用戶相關聯。確保任何用戶都可訪問所有的博文,但只有已登錄的用戶能夠發表博文以及編輯既有博文。在讓用戶能夠編輯其博文的視圖中,在處理表單前確認用戶編輯的是他自己發表的博文。
20-1 其他表單 :我們對登錄頁面和 add_topic 頁面應用了 Bootstrap 樣式。請對其他基於表單的頁面做類似的修改: new_entry 頁面、 edit_entry 頁面和注冊頁面。
20-2 設置博客的樣式 :對於你在第 19 章創建的項目 Blog ,使用 Bootstrap 來設置其樣式。
20-3 在線博客 :將你一直在開發的項目 Blog 部署到 Heroku 。確保將 DEBUG 設置為 False ,並修改設置 ALLOWED_HOSTS ,讓部署相當安全。
20-4 在更多的情況下顯示 404 錯誤頁面 :在視圖函數 new_entry() 和 edit_entry() 中,也使用函數 get_object_or_404() 。完成這些修改后進行測試:輸入類似於 http://localhost:8000/new_entry/99999/ 的 URL ,確認你能夠看到 404 錯誤頁面。
20-5 擴展 “ 學習筆記 ” :在 “ 學習筆記 ” 中添加一項功能,將修改推送到在線部署。嘗試做一項簡單的修改,如在主頁中對項目作更詳細的描述;再嘗試添加一項更高級的功能,如讓用戶能夠將主題設置為公開的。為此,需要在模型 Topic 中添加一個名為 public 的屬性(其默認值為 False ),並在 new_topic 頁面中添加一個表單元素,讓用戶能夠將私有主題改為公開的。然后,你需要遷移項目,並修改 views.py ,讓未登錄的用戶也可以看到所有公開的主題。將修改推送到 Heroku 后,別忘了遷移在線數據庫。