1. 程式人生 > >Python程式設計從入門到實踐課後答案:第十章

Python程式設計從入門到實踐課後答案:第十章

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。將修改後的各行都列印到螢幕上。

learning_python.txt

# @Time    : 2018/11/27 下午4:24
# @Author  : 鄭超
# @Desc    :
In Python you can "spider"
In Python you can "web"
In Python you can "AI"
In Python you can "R"
# 10-1
with open("learning_python.txt", encoding="utf8") as f:
    content = f.read()
    print(content)

# 10-2
with open("learning_python.txt", encoding="utf8") as f:
    content = f.read()
    c = content.replace("Python", "C")
    print(c)

10-3 訪客 :編寫一個程式,提示使用者輸入其名字;使用者作出響應後,將其名字寫入到檔案guest.txt中。
10-4 訪客名單 :編寫一個while 迴圈,提示使用者輸入其名字。使用者輸入其名字後,在螢幕上列印一句問候語,並將一條訪問記錄新增到檔案guest_book.txt中。確保這
個檔案中的每條記錄都獨佔一行。
10-5 關於程式設計的調查 :編寫一個while 迴圈,詢問使用者為何喜歡程式設計。每當使用者輸入一個原因後,都將其新增到一個儲存所有原因的檔案中。

# 10-3
name = input("請輸入你的名字:")
f = open("guest.txt", "a", encoding="utf8")
f.write(name)
f.close()

# 10-4
while True:
    name = input("請輸入你的名字:")
    if name == "q" or name == "quit":
        break
    print("歡迎你 %s" % name)
    f = open("guest_book.txt", "a", encoding="utf8")
    f.write(name + "\n")
    f.close()
# 10-5
while True:
    name = input("你為何喜歡程式設計:\n")
    if name == "q" or name == "quit":
        break
    f = open("reason.txt", "a", encoding="utf8")
    f.write(name + "\n")
    f.close()

10-6 加法運算 :提示使用者提供數值輸入時,常出現的一個問題是,使用者提供的是文字而不是數字。在這種情況下,當你嘗試將輸入轉換為整數時,將引
發TypeError 異常。編寫一個程式,提示使用者輸入兩個數字,再將它們相加並列印結果。在使用者輸入的任何一個值不是數字時都捕獲TypeError 異常,並列印一
條友好的錯誤訊息。對你編寫的程式進行測試:先輸入兩個數字,再輸入一些文字而不是數字。
10-7 加法計算器 :將你為完成練習10-6而編寫的程式碼放在一個while 迴圈中,讓使用者犯錯(輸入的是文字而不是數字)後能夠繼續輸入數字。

# 10-6
num = input("請輸入第一個數字: \n")
num1 = input("請輸入第二個數字: \n")
try:
    print(int(num) + int(num1))
except:
    print("輸入的不是數字,程式結束")
# 10-7
while True:
    num = input("請輸入第一個數字: \n")
    num1 = input("請輸入第二個數字: \n")
    if num == "q" or num1 == "q":
        break
    try:
        print(int(num) + int(num1))
        break
    except:
        print("輸入的不是數字,請重新輸入" + "*" * 30 + ":")

10-8 貓和狗 :建立兩個檔案cats.txt和dogs.txt,在第一個檔案中至少儲存三隻貓的名字,在第二個檔案中至少儲存三條狗的名字。編寫一個程式,嘗試讀取這些檔案,
並將其內容列印到螢幕上。將這些程式碼放在一個try-except 程式碼塊中,以便在檔案不存在時捕獲FileNotFound 錯誤,並列印一條友好的訊息。將其中一個檔案
移到另一個地方,並確認except 程式碼塊中的程式碼將正確地執行。
10-9 沉默的貓和狗 :修改你在練習10-8中編寫的except 程式碼塊,讓程式在檔案不存在時一言不發。

# 10-8
txts = ["cats.txt", 'dogs.txt']
for i in txts:
    try:
        with open(i, encoding="utf8") as f:
            contents = f.read()
            print(contents)
    except FileNotFoundError:
        print("The file %s does not exist." % i)
      
 # 10-9
txts = ["cats.txt", 'dogs.txt']
for i in txts:
    try:
        with open(i, encoding="utf8") as f:
            contents = f.read()
            print(contents)
    except FileNotFoundError:
		pass

10-10 常見單詞 :訪問專案Gutenberg(http://gutenberg.org/ ),並找一些你想分析的圖書。下載這些作品的文字檔案或將瀏覽器中的原始文字複製到文字檔案中。
你可以使用方法count() 來確定特定的單詞或短語在字串中出現了多少次。例如,下面的程式碼計算’row’ 在一個字串中出現了多少次:
line = “Row, row, row your boat”
line.count(‘row’)
2
line.lower().count(‘row’)
3
請注意,通過使用lower() 將字串轉換為小寫,可捕捉要查詢的單詞出現的所有次數,而不管其大小寫格式如何。
編寫一個程式,它讀取你在專案Gutenberg中獲取的檔案,並計算單詞’the’ 在每個檔案中分別出現了多少次。
出師表.txt

先帝創業未半而中道崩殂,今天下三分,益州疲弊,此誠危急存亡之秋也。然侍衛之臣不懈於內,忠志之士忘身於外者,蓋追先帝之殊遇,欲報之於陛下也。誠宜開張聖聽,以光先帝遺德,恢弘志士之氣,不宜妄自菲薄,引喻失義,以塞忠諫之路也。

宮中府中,俱為一體,陟罰臧否,不宜異同。若有作奸犯科及為忠善者,宜付有司論其刑賞,以昭陛下平明之理,不宜偏私,使內外異法也。

侍中、侍郎郭攸之、費禕、董允等,此皆良實,志慮忠純,是以先帝簡拔以遺陛下。愚以為宮中之事,事無大小,悉以諮之,然後施行,必能裨補闕漏,有所廣益。

將軍向寵,性行淑均,曉暢軍事,試用於昔日,先帝稱之曰能,是以眾議舉寵為督。愚以為營中之事,悉以諮之,必能使行陣和睦,優劣得所。

親賢臣,遠小人,此先漢所以興隆也;親小人,遠賢臣,此後漢所以傾頹也。先帝在時,每與臣論此事,未嘗不嘆息痛恨於桓、靈也。侍中、尚書、長史、參軍,此悉貞良死節之臣,願陛下親之信之,則漢室之隆,可計日而待也。

臣本布衣,躬耕於南陽,苟全性命於亂世,不求聞達於諸侯。先帝不以臣卑鄙,猥自枉屈,三顧臣於草廬之中,諮臣以當世之事,由是感激,遂許先帝以驅馳。後值傾覆,受任於敗軍之際,奉命於危難之間,爾來二十有一年矣。

先帝知臣謹慎,故臨崩寄臣以大事也。受命以來,夙夜憂嘆,恐託付不效,以傷先帝之明,故五月渡瀘,深入不毛。今南方已定,兵甲已足,當獎率三軍,北定中原,庶竭駑鈍,攘除奸凶,興復漢室,還於舊都。此臣所以報先帝而忠陛下之職分也。至於斟酌損益,進盡忠言,則攸之、禕、允之任也。

願陛下託臣以討賊興復之效,不效,則治臣之罪,以告先帝之靈。若無興德之言,則責攸之、禕、允等之慢,以彰其咎;陛下亦宜自謀,以諮諏善道,察納雅言,深追先帝遺詔,臣不勝受恩感激。

今當遠離,臨表涕零,不知所言。

“先帝” 出現的次數

with open("出師表.txt", encoding="utf8") as f:
    content = f.read()
    print(content.count("先帝"))

#10-11 喜歡的數字 :編寫一個程式,提示使用者輸入他喜歡的數字,並使用json.dump() 將這個數字儲存到檔案中。再編寫一個程式,從檔案中讀取這個值,並列印
訊息“I knowyour favorite number! It’s _____.”。

import json
num = input("請輸入你喜歡的數字:")
with open("num.json", 'w') as f:
    json.dump(num, f)
with open("num.json") as f:
    number = json.load(f)
    print("I know your favorite number! " + number)

10-12 記住喜歡的數字 :將練習10-11中的兩個程式合而為一。如果儲存了使用者喜歡的數字,就向用戶顯示它,否則提示使用者輸入他喜歡的數字並將其儲存到檔案中。
執行這個程式兩次,看看它是否像預期的那樣工作。

import json

filename = 'num.json'
try:
    with open(filename) as f:
        number = json.load(f)
except:
    number = input("請輸入你喜歡的數字:")
    with open(filename, 'w') as f:
        json.dump(number, f)
        print("I know you favorite number is " + number)
else:
    print("I know you favorite number is " + number)

10-13 驗證使用者 :最後一個remember_me.py版本假設使用者要麼已輸入其使用者名稱,要麼是首次執行該程式。我們應修改這個程式,以應對這樣的情形:當前和最後一次
執行該程式的使用者並非同一個人。
為此,在greet_user() 中列印歡迎使用者回來的訊息前,先詢問他使用者名稱是否是對的。如果不對,就呼叫get_new_username() 讓使用者輸入正確的使用者名稱。
username.json

"\u4f60\u7239"
import json


def get_stored_username():
    filename = 'username.json'
    try:
        with open(filename) as f:
            username = json.load(f)
    except:
        return None
    else:
        return username


def get_new_username():
    filename = 'username.json'
    username = input("請輸入你的名字: ")
    with open(filename, "w") as f:
        json.dump(username, f)
        return username


def greet_user():
    username = get_stored_username()
    new_name = "%s 是你嗎" % username
    confirm = input(new_name + " 如果是你,就輸入'1';不是輸入'0'")
    if confirm == '1':
        print("歡迎回來 %s ! " % username)
    else:
        username = get_new_username()
        print("你的正確名字是%s" % username)


greet_user()