2020年9月16日星期三

[課後作業] 第034講:豐富的else語句及簡潔的with語句|課後測試題及答案

[課後作業] 第034講:豐富的else語句及簡潔的with語句|課後測試題及答案




《零基礎入門學習Python》視頻下載地址:傳送門
u;756VMzR'e :y#9U~d&3o4w%-p8,s
測試題:
"0ltscJin)XQu( xpky&1K
0.在Python中,else語句能跟哪些語句進行搭配?


1.請問以下例子中,循環中的break語句會跳過else語句嗎?

  1. def showMaxFactor(num):
  2.     count = num // 2
  3.     while count > 1:
  4.         if num % count == 0:
  5.             print('%d最大的約數是%d' % (num, count))
  6.             break
  7.         count -= 1
  8.     else:
  9.         print('%d是素數!' % num)

  10. num = int(input('請輸入一個數:'))
  11. showMaxFactor(num)
複製代碼

)2D$~6KRqYuU'F8?9v|{hed*Vr
2.請目測以下代碼會打印什麼內容?
  1. try:
  2.         print('ABC')
  3. except:
  4.         print('DEF')
  5. else:
  6.         print('GHI')
  7. finally:
  8.         print('JKL')
複製代碼

ot1)xX{N}U<7Hl+Ds=]A O.:|c
3.使用什麼語句可以使你不比再擔心文件打開後卻忘了關閉的尷尬?


4.使用with語句固然方便,但如果出現異常的話,文件還會自動正常關閉嗎?



5.你可以換一種形式寫出下邊的偽代碼嗎?pl!WXd*$

  1. with A() as a:
  2.     with B() as b:
  3.         suite
複製代碼

*hR$z}#=b%GN[BxT{PQUwtY"r0
動動手:

0.使用with語句改寫以下代碼,讓Python去關心文件的打開與關閉吧。

  1. def file_compare(file1, file2):
  2.     f1 = open(file1)
  3.     f2 = open(file2)
  4.     count = 0 # 統計行數
  5.     differ = [] # 統計不一樣的數量

  6.     for line1 in f1:
  7.         line2 = f2.readline()
  8.         count += 1
  9.         if line1 != line2:
  10.             differ.append(count)

  11.     f1.close()
  12.     f2.close()
  13.     return differ

  14. file1 = input('請輸入需要比較的頭一個文件名:')
  15. file2 = input('請輸入需要比較的另一個文件名:')

  16. differ = file_compare(file1, file2)

  17. if len(differ) == 0:
  18.     print('兩個文件完全一樣!')
  19. else:
  20.     print('兩個文件共有【%d】處不同:' % len(differ))
  21.     for each in differ:
  22.         print('第%d 行不一樣' % each)
複製代碼

9j8@$v0BZIQ-m>AGJLrtle#N~
1.你可以利用異常的原理,修改下面的代碼使得更高效率的實現嗎?
7[wHhL?aEvq:mxT-*(tc@F<n5=$Bo
  1. print('|--- 歡迎進入通訊錄程序---|')
  2. print('|--- 1:查詢聯繫人資料 ---|')
  3. print('|--- 2:插入新的聯繫人 ---|')
  4. print('|--- 3:刪除已有聯繫人 ---|')
  5. print('|--- 4:退出通訊錄程序 ---|')

  6. contacts = dict()

  7. while 1:
  8.     instr = int(input('\n請輸入相關的指令代碼:'))
  9.    
  10.     if instr == 1:
  11.         name = input('請輸入聯繫人姓名:')
  12.         if name in contacts:
  13.             print(name + ' : ' + contacts[name])
  14.         else:
  15.             print('您輸入的姓名不再通訊錄中!')

  16.     if instr == 2:
  17.         name = input('請輸入聯繫人姓名:')
  18.         if name in contacts:
  19.             print('您輸入的姓名在通訊錄中已存在-->> ', end='')
  20.             print(name + ' : ' + contacts[name])
  21.             if input('是否修改用戶資料(YES/NO):') == 'YES':
  22.                 contacts[name] = input('請輸入用戶聯繫電話:')
  23.         else:
  24.             contacts[name] = input('請輸入用戶聯繫電話:')

  25.     if instr == 3:
  26.         name = input('請輸入聯繫人姓名:')
  27.         if name in contacts:
  28.             del(contacts[name]) # 也可以使用dict.pop()
  29.         else:
  30.             print('您輸入的聯繫人不存在。')
  31.             
  32.     if instr == 4:
  33.         break

  34. print('|--- 感謝使用通訊錄程序---|')
複製代碼

3.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

回复您的答案即可查看參考答案! ,w*E8DkZ
8X(Hk{me7!QTa-Zt_h};AirD,J4
#Fv: )rw0gIhqiX.;RA,T-Gn{
測試題答案:

本帖隱藏的內容

Powered by bbs.fishc.com
0.在Python中,else語句能跟哪些語句進行搭配?L|*~}_
W; J.tDxZh)HrlKy<zVGeO@{F~|(0
答:在Python中,else語句不僅能跟if語句搭,構成“要么怎樣,要么不怎樣”的語境; Ta還能跟循環語句(for語句或者while語句),構成“幹完了能怎樣,幹不完就別想怎樣”的語境;其實else語句還能夠跟我們剛剛講的異常處理進行搭配,構成“沒有問題,那就乾吧”的語境。IHv7JZ(u=N
&<wv(jkr^+AJLIxlb2.yt;F5
dJK2?MosX#pf5-QFC~jyV
1.請問以下例子中,循環中的break語句會跳過else語句嗎?:)uYMS}8s
  1. def showMaxFactor(num):
  2.     count = num // 2
  3.     while count > 1:
  4.         if num % count == 0:
  5.             print('%d最大的約數是%d' % (num, count))
  6.             break
  7.         count -= 1
  8.     else:
  9.         print('%d是素數!' % num)

  10. num = int(input('請輸入一個數:'))
  11. showMaxFactor(num)
複製代碼

答:會,因為如果將else語句與循環語句(while和for語句)進行搭配,那麼只有在循環正常執行完成後才會執行else語句塊的內容。8aw9b[]4
~!}BH#Zs`2NO6nVCEtq7p|m3]i
FC)_wLr!eR3gN$9VG=`mK#n*["jtl
2.請目測以下代碼會打印什麼內容?C[}:9
  1. try:
  2.         print('ABC')
  3. except:
  4.         print('DEF')
  5. else:
  6.         print('GHI')
  7. finally:
  8.         print('JKL')
複製代碼

答:只有except語句中的內容不被打印,因為try語句塊中並沒有異常,則else語句塊也會被執行。cr{m}
ABC 版權屬於:bbs.fishc.com
GHI 版權屬於:bbs.fishc.com
JKL 來自:bbs.fishc.com
h(bK`F{r2Dk85YR#wvN*^
m=|X95!bwu+Q, "0D_#@v1zq
3.使用什麼語句可以使你不比再擔心文件打開後卻忘了關閉的尷尬?x'Wt1p
n+ycMOL%r>!oz@K6WtZqk|?a7^
答:使用with語句。版權屬於:bbs.fishc.com
  1. try:
  2.     with open('data.txt', 'w') as f:
  3.         for each_line in f:
  4.             print(each_line)
  5. except OSError as reason:
  6.     print('出錯啦:' + str(reason))
複製代碼

rh<Rw:1?Q`Lt"P3+@gv{by!}8.O
4.使用with語句固然方便,但如果出現異常的話,文件還會自動正常關閉嗎?XiSn)_#*b
:6&HR3 [XZc0M9|Yv];GLDVW%{Tdt@
答:with語句會自動處理文件的打開和關閉,如果中途出現異常,會執行清理代碼,然後確保文件自動關閉。g^KR;
Qvz+N('t ^#r!DbJl`X=RVL|xws*%j
q,ASkdMYP5n2=~-OJ[pu(hZ|7
5.你可以換一種形式寫出下邊的偽代碼嗎?lz$dr]GON
  1. with A() as a:
  2.     with B() as b:
  3.         suite
複製代碼

答:with語句處理多個項目的時候,可以用逗號隔開寫成一條語句)eX(GY
  1. with A() as a, B() as b:
  2.     suite
複製代碼
來自:bbs.fishc.com
i^]pso ;OUqMXx(?QH"'L[g!
動動手答案:

本帖隱藏的內容

Powered by bbs.fishc.com
0.使用with語句改寫以下代碼,讓Python去關心文件的打開與關閉吧。m,%YGA
poC;t7S8^=qi10$PVJfaQH5{mU|gy}
答:使用with語句處理文件可以減少需要編寫的代碼量和粗心的錯誤。v=NP&REfxp
  1. def file_compare(file1, file2):
  2.     with open(file1) as f1, open(file2) as f2:
  3.         count = 0 # 統計行數
  4.         differ = [] # 統計不一樣的數量

  5.         for line1 in f1:
  6.             line2 = f2.readline()
  7.             count += 1
  8.             if line1 != line2:
  9.                 differ.append(count)

  10.     return differ

  11. file1 = input('請輸入需要比較的頭一個文件名:')
  12. file2 = input('請輸入需要比較的另一個文件名:')

  13. differ = file_compare(file1, file2)

  14. if len(differ) == 0:
  15.     print('兩個文件完全一樣!')
  16. else:
  17.     print('兩個文件共有【%d】處不同:' % len(differ))
  18.     for each in differ:
  19.         print('第%d 行不一樣' % each)
複製代碼

xW'#aN<@uD2lqn0I%b?Jy6-c}
1.你可以利用異常的原理,修改下面的代碼使得更高效率的實現嗎?opuNEs=jhWT!F?;VZ]_#U+tCl8@:
答:使用條件語句的代碼非常直觀明了,但是效率不高。因為程序會兩次訪問字典的鍵,一次判斷是否存在(例如if name in contacts),一次獲得值(例如print(name + ' : ' + contacts[name]))。v}fcI
8b+aWD`An=m|5"h0x}pXNGc@[T~
如果利用異常解決方案,我們可以簡單避開每次需要使用in判斷是否鍵存在字典中的操作。因為只要當鍵不存在字典中時,會觸發KeyError異常,利用此特性我們可以修改代碼如下:-+e=).m
  1. print('|--- 歡迎進入通訊錄程序---|')
  2. print('|--- 1:查詢聯繫人資料 ---|')
  3. print('|--- 2:插入新的聯繫人 ---|')
  4. print('|--- 3:刪除已有聯繫人 ---|')
  5. print('|--- 4:退出通訊錄程序 ---|')

  6. contacts = dict()

  7. while 1:
  8.     instr = int(input('\n請輸入相關的指令代碼:'))
  9.    
  10.     if instr == 1:
  11.         name = input('請輸入聯繫人姓名:')
  12.         try:
  13.             print(name + ' : ' + contacts[name])
  14.         except KeyError:
  15.             print('您輸入的姓名不再通訊錄中!')

  16.     if instr == 2:
  17.         name = input('請輸入聯繫人姓名:')
  18.         try:
  19.             contacts[name] # 有點“為賦新詞強說愁”的感覺
  20.             print('您輸入的姓名在通訊錄中已存在-->> ', end='')
  21.             print(name + ' : ' + contacts[name])
  22.             if input('是否修改用戶資料(YES/NO):') == 'YES':
  23.                 contacts[name] = input('請輸入用戶聯繫電話:')
  24.         except KeyError:
  25.             contacts[name] = input('請輸入用戶聯繫電話:')

  26.     if instr == 3:
  27.         name = input('請輸入聯繫人姓名:')
  28.         try:
  29.             del(contacts[name]) # 也可以使用dict.pop()
  30.         except KeyError:
  31.             print('您輸入的聯繫人不存在。')
  32.             
  33.     if instr == 4:
  34.         break

  35. print('|--- 感謝使用通訊錄程序---|')
複製代碼


2.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

小甲魚希望你認真對待作業就像你希望小甲魚推出高質量視頻一樣渴望^_^



這節課我們來談談豐富的else語句及簡潔的with語句,大多數編程語言來說,else 語句只能跟if 語句進行搭配,但是在Python裡面,else 語句具有更加豐富的功能,在Python中,
  1. else語句不僅能夠跟if 語句進行搭配,構成“要么怎麼,要么不怎樣”的句式
  2. 還能跟循環語句(for語句或者while語句)進行搭配,構成“幹完了能怎樣,幹不完就別想怎樣”的句式
  3. 還能跟異常處理進行搭配,構成“沒有問題,那就乾吧”的句式。
2中,只有循環完成後執行,也就是說只有循環順利結束才會執行else 裡面的語句,也就是說,如果循環中使用了break 跳出了循環,那麼else 裡面的語句就不會被執行。
例如:
  1. def showMaxFactor(num):
  2. count = num // 2
  3. while count > 1:
  4. if num % count == 0:
  5. print("%d最大的约数是%d"%(num, count))
  6. break
  7. count -= 1
  8. else:
  9. print("%d是素数"%num)
  10. num = int(input("请输入一个数:"))
  11. showMaxFactor(num)
當輸入的數有約數的時候,循環就會break,就輸出最大約數,當輸入的是素數時,循環就會正常執行完,然後退出循環,輸出是素數。
3中,與異常處理進行搭配,實現與循環語句的實現類似,只要try 語句中沒有出現任何異常,就會執行else 語句塊裡的內容。
try:
        print(int("abc"))
except ValueError as reason:
        print("出錯啦:" + str(reason))
else:
        print("沒有任何異常!")
============ RESTART: C:/Users/XiangyangDai/Desktop/上課代碼/34-2.py ============
出錯啦:invalid literal for int () with base 10: 'abc'
try:
        print(int("123"))
except ValueError as reason:
        print("出錯啦:" + str(reason))
else:
        print("沒有任何異常!")
========== == RESTART: C:/Users/XiangyangDai/Desktop/上課代碼/34-2.py ============
123
沒有任何異常!
接下來是介紹with 語句:
我們可能會覺得打開文件又要關閉文件,然後我們還怕打開的文件會出問題,所以我們又加入了異常處理,所以這樣是不是有點煩呢,所以我們的Python提供了with 語句,利用這個語句抽像出文件操作中頻繁使用try—exception—finally這樣相關的細節,對文件中使用with 語句可以大大的減少代碼量,再也不用擔心文件打開的時候忘記關閉了。
with 會自動幫你考慮文件關閉的問題,當你的文件不再需要用到的時候,with 語句會自動幫你關閉,那麼什麼是使用with 語句呢?
try:
        f = open('data.txt', 'w')
        for each_line in f:
                print(each_line)
except OSError as reason:
        print("出錯啦:" + str(reason))
finally:
        f.close()
上面的代碼顯然是存在問題的,這裡使用的是read的形式,如果這麼文件不存在的時候,那麼你這裡就試圖去關閉一個不存在的文件對象。這裡可以使用with 語句

try:
        with open('data.txt', 'w') as f:
                for each_line in f:
                        print(each_line)
except OSError as reason:
        print("出錯啦:" + str(reason))

0 留言:

發佈留言