CSDN下載:https://download.csdn.net/download/weixin_42859280/11254583
點擊跳轉Python 程序設計(第二版)董付國_清華大學出版社_習題答案與分析【針對8.4及其之前的】
Python 程序設計基礎
習題答案與分析
第 1 章 基礎知識
1.1 簡單說明如何選擇正確的 Python 版本。
答:
在選擇 Python 的時候,一定要先考慮清楚自己學習 Python 的目的是什麼,打算做哪方面的開發,有哪些擴展庫可用,這些擴展庫最高支持哪個版本的 Python ,是 Python 2.x 還是 Python 3.x ,最高支持到 Python 2.7.6 還是 Python 2.7.9 。這些問題都確定以後,再做出自己的選擇,這樣才能事半功倍,而不至於把大量時間浪費在 Python 的反覆安裝和卸載上。同時還應該注意,當更新的 Python 版本推出之後,不要急於更新,而是應該等確定自己所必須使用的擴展庫也推出了較新版本之後再進行更新。
儘管如此, Python 3 畢竟是大勢所趨,如果您暫時還沒想到要做什麼行業領域的應用開發,或者僅僅是爲了嘗試一種新的、好玩的語言,那麼請毫不猶豫地選擇 Python 3.x 系列的最高版本(目前是 Python 3.4.3 )。
1.2 爲什麼說 Python 採用的是基於值的內存管理模式?
Python 採用的是基於值的內存管理方式,如果爲不同變量賦值相同值,則在內存中只有一份該值,多個變量指向同一塊內存地址,例如下面的代碼。
>>> x = 3
>>> id(x)
10417624
>>> y = 3
>>> id(y)
10417624
>>> y = 5
>>> id(y)
10417600
>>> id(x)
10417624
>>> x = [1, 2, 3, 1, 1, 2]
>>> id(x[0])==id(x[3])==id(x[4])
True
1.3 解釋 Python 中的運算符 “ / ” 和 “ // ” 的區別。
答:
在 Python 2.x 中,“ / ”爲普通除法,當兩個數值對象進行除法運算時,最終結果的精度與操作數中精度最高的一致;在 Python 3.x 中,“ / ”爲真除法,與除法的數學含義一致。
在 Python 2.x 和 Python 3.x 中,“ // ”表示整除,對整數或浮點數進行該運算時,結果爲數學除法的整數部分。
1.4 在 Python 中導入模塊中的對象有哪幾種方式?
答:常用的有三種方式,分別爲
● import 模塊名 [as 別名 ]
● from 模塊名 import 對象名 [ as 別名 ]
● from math import *
1.5 pip 是目前比較常用的 Python 擴展庫管理工具。
1.6 解釋 Python 腳本程序的“ __name__ ”變量及其作用。
答:
每個 Python 腳本在運行時都有一個“ __name__ ”屬性。如果腳本作爲模塊被導入,則其“ __name__ ”屬性的值被自動設置爲模塊名;如果腳本獨立運行,則其“ __name__ ”屬性值被自動設置爲“ __main__ ”。利用“ __name__ ”屬性即可控制 Python 程序的運行方式。
1.7 運算符“ % ” 可以 (可以、不可以)對浮點數進行求餘數操作。
1.8 一個數字“ 5 ” 是 (是、不是)合法的 Python 表達式。
1.9 在 Python 2.x 中, input() 函數接收到的數據類型由 界定符 確定,而在 Python 3.x 中該函數則認爲接收到的用戶輸入數據一律爲 字符串 。
1.10 編寫程序,用戶輸入一個三位以上的整數,輸出其百位以上的數字。例如用戶輸入 1234 ,則程序輸出 12 。(提示:使用整除運算。)
答:
1 ) Python 3.4.2 代碼:
x = input('Please input an integer of more than 3 digits:')
try:
x = int(x)
x = x//100
if x == 0:
print('You must input an integer of more than 3 digits.')
else:
print(x)
except BaseException:
print('You must input an integer.')
2 ) Python 2.7.8 代碼:
import types
x = input('Please input an integer of more than 3 digits:')
if type(x) != types.IntType:
print 'You must input an integer.'
elif len(str(x)) != 4:
print 'You must input an integer of more than 3 digits.'
else:
print x//100
第 2 章 Python 序列
2.1 爲什麼應儘量從列表的尾部進行元素的增加與刪除操作?
答:
當列表增加或刪除元素時,列表對象自動進行內存擴展或收縮,從而保證元素之間沒有縫隙,但這涉及到列表元素的移動,效率較低,應儘量從列表尾部進行元素的增加與刪除操作以提高處理速度。
2.2 range() 函數在 Python 2.x 中返回一個 包含整數的列表 ,而 Python 3.x 的 range() 函數返回一個 可迭代的 range 對象 。
2.3 編寫程序,生成包含 1000 個 0 到 100 之間的隨機整數,並統計每個元素的出現次數。
答:可以使用集合來實現該功能。
1 ) Python 3.4.2 代碼
import random
x = [random.randint(0,100) for i in range(1000)]
d = set(x)
for v in d:
print(v, ':', x.count(v))
2 ) Python 2.7.8 代碼
import random
x = [random.randint(0,100) for i in range(1000)]
d = set(x)
for v in d:
print v, ':', x.count(v)
也可以直接使用字典來實現該功能,並且獲得更高的執行效率,例如下面的 Python 3.4.2 代碼:
listRandom = [random.randint(1,100) for i in range(1000000)]
d = dict()
start = time.time()
for i in listRandom: # 對隨機數列表掃描一次,即可得到結果
d[i] = d.get(i,0)+1
print(time.time()-start)
2.4 表達式“ [3] in [1, 2, 3, 4] ”的值爲 False 。
2.5 編寫程序,用戶輸入一個列表和 2 個整數作爲下標,然後輸出列表中介於 2 個下標之間的元素組成的子列表。例如用戶輸入 [1, 2, 3, 4, 5, 6] 和 2,5 ,程序輸出 [3, 4, 5, 6] 。
答:
1 ) Python 3.4.2 代碼
x = input('Please input a list:')
x = eval(x)
start, end = eval(input('Please input the start position and the end position:'))
print(x[start:end])
2 ) Python 2.7.8 代碼
x = input('Please input a list:')
start, end = input('Please input the start position and the end position:')
print x[start:end]
2.6 列表對象的 sort() 方法用來對列表元素進行原地排序,該函數返回值爲 None 。
2.7 列表對象的 remove() 方法刪除首次出現的指定元素,如果列表中不存在要刪除的元素,則拋出異常。
2.8 假設列表對象 aList 的值爲 [3, 4, 5, 6, 7, 9, 11, 13, 15, 17] ,那麼切片 aList[3:7] 得到的值是 [6, 7, 9, 11] 。
2.9 設計一個字典,並編寫程序,用戶輸入內容作爲“鍵”,然後輸出字典中對應的“值”,如果用戶輸入的“鍵”不存在,則輸出“您輸入的鍵不存在!”
答:
1 ) Python 3.4.2 代碼
d = {1:'a', 2:'b', 3:'c', 4:'d'}
v = input('Please input a key:')
v = eval(v)
print(d.get(v,' 您輸入的的鍵不存在 '))
2 ) Python 2.7.8 代碼
d = {1:'a', 2:'b', 3:'c', 4:'d'}
v = input('Please input a key:')
print(d.get(v,' 您輸入的的鍵不存在 '))
2.10 編寫程序,生成包含 20 個隨機數的列表,然後將前 10 個元素升序排列,後 10 個元素降序排列,並輸出結果。
答:
1 ) Python 3.4.2 代碼
import random
x = [random.randint(0,100) for i in range(20)]
print(x)
y = x[0:10]
y.sort()
x[0:10] = y
y = x[10:20]
y.sort(reverse=True)
x[10:20] = y
print(x)
2 ) Python 2.7.8 代碼
import random
x = [random.randint(0,100) for i in range(20)]
print x
y = x[0:10]
y.sort()
x[0:10] = y
y = x[10:20]
y.sort(reverse=True)
x[10:20] = y
print x
2.11 在 Python 中,字典和集合都是用一對 大括號 作爲界定符,字典的每個元素有兩部分組成,即 “鍵” 和 “值” ,其中 “鍵” 不允許重複。
2.12 使用字典對象的 items() 方法可以返回字典的“鍵 - 值對”列表,使用字典對象的 keys() 方法可以返回字典的“鍵”列表,使用字典對象的 values() 方法可以返回字典的“值”列表。
2.13 假設有列表 a = ['name', 'age', 'sex'] 和 b = ['Dong', 38, 'Male'] ,請使用一個語句將這兩個列表的內容轉換爲字典,並且以列表 a 中的元素爲“鍵”,以列表 b 中的元素爲“值”,這個語句可以寫爲 c = dict(zip(a,b)) 。
2.14 假設有一個列表 a ,現要求從列表 a 中每 3 個元素取 1 個,並且將取到的元素組成新的列表 b ,可以使用語句 b = a[::3] 。
2.15 使用列表推導式生成包含 10 個數字 5 的列表,語句可以寫爲 [5 for i in range(10)] 。
2.16 不可以 (可以、不可以)使用 del 命令來刪除元組中的部分元素。
第 3 章 選擇與循環
3.1 分析邏輯運算符“ or ”的短路求值特性。
答:
假設有表達式“表達式 1 or 表達式 2 ”,如果表達式 1 的值等價於 True ,那麼無論表達式 2 的值是什麼,整個表達式的值總是等價於 True 。因此,不需要再計算表達式 2 的值。
3.2 編寫程序,運行後用戶輸入 4 位整數作爲年份,判斷其是否爲閏年。如果年份能被 400 整除,則爲閏年;如果年份能被 4 整除但不能被 100 整除也爲閏年。
答:
1 ) Python 3.4.2 代碼
x = input('Please input an integer of 4 digits meaning the year:')
x = eval(x)
if x%400==0 or (x%4==0 and not x%100==0):
print('Yes')
else:
print('No')
2 ) Python 2.7.8 代碼
x = input('Please input an integer of 4 digits meaning the year:')
if x%400==0 or (x%4==0 and not x%100==0):
print 'Yes'
else:
print 'No'
3.3 Python 提供了兩種基本的循環結構: for 循環 和 while 循環 。
3.4 編寫程序,生成一個包含 50 個隨機整數的列表,然後刪除其中所有奇數。(提示:從後向前刪。)
答: Python 3.4.2 代碼如下,
import random
x = [random.randint(0,100) for i in range(50)]
print(x)
i = len(x)-1
while i>=0:
if x[i]%2==1:
del x[i]
i-=1
print(x)
3.5 編寫程序,生成一個包含 20 個隨機整數的列表,然後對其中偶數下標的元素進行降序排列,奇數下標的元素不變。(提示:使用切片。)
答: Python 3.4.2 代碼如下,
import random
x = [random.randint(0,100) for i in range(20)]
print(x)
y = x[::2]
y.sort(reverse=True)
x[::2] = y
print(x)
3.6 編寫程序,用戶從鍵盤輸入小於 1000 的整數,對其進行因式分解。例如, 10=2 × 5 , 60=2 × 2 × 3 × 5 。
答:
1 ) Python 3.4.2 代碼
x = input('Please input an integer less than 1000:')
x = eval(x)
t = x
i = 2
result = []
while True:
if t==1:
break
if t%i==0:
result.append(i)
t = t/i
else:
i+=1
print(x,'=','*'.join(map(str,result)))
2 ) Python 2.7.8 代碼
x = input('Please input an integer less than 1000:')
t = x
i = 2
result = []
while True:
if t==1:
break
if t%i==0:
result.append(i)
t = t/i
else:
i+=1
print x,'=','*'.join(map(str,result))
3.7 編寫程序 , 至少使用 2 種不同的方法計算 100 以內所有奇數的和。
答 : Python 3.4.2 代碼如下 , 如果使用 Python 2.7.8 只需要把其中的 print() 函數改爲 print 語句即可。
x = [i for i in range(1,100) if i%2==1]
print(sum(x))
print(sum(range(1,100)[::2]))
3.8 編寫程序,輸出所有由 1 、 2 、 3 、 4 這四個數字組成的素數,並且在每個素數中每個數字只使用一次。
答: Python 3.4.2 代碼如下,
答: Python 3.4.2 代碼如下,如果使用 Python 2.7.8 只需要把其中的 print() 函數改爲 print 語句即可。
x = input('Please input x:')
x = eval(x)
if x<0 or x>=20:
print(0)
elif 0<=x<5:
print(x)
elif 5<=x<10:
print(3*x-5)
elif 10<=x<20:
print(0.5*x-2)
3.9 編寫程序,實現分段函數計算,如下表所示。
x |
y |
x<0 |
0 |
0<=x<5 |
x |
5<=x<10 |
3x-5 |
10<=x<20 |
0.5x-2 |
20<=x |
0 |
|
|
答: Python 3.4.2 代碼如下,如果使用 Python 2.7.8 只需要把其中的 print() 函數改爲 print 語句即可。
x = input('Please input x:')
x = eval(x)
if x<0 or x>=20:
print(0)
elif 0<=x<5:
print(x)
elif 5<=x<10:
print(3*x-5)
elif 10<=x<20:
print(0.5*x-2)
第 4 章 字符串與正則表達式
4.1 假設有一段英文,其中有單獨的字母“ I ”誤寫爲“ i ”,請編寫程序進行糾正。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
1 )不使用正則表達式
x = "i am a teacher,i am man, and i am 38 years old.I am not a businessman."
x = x.replace('i ','I ')
x = x.replace(' i ',' I ')
print(x)
2 )使用正則表達式
x = "i am a teacher,i am man, and i am 38 years old.I am not a businessman."
import re
pattern = re.compile(r'(?:[^\w]|\b)i(?:[^\w])')
while True:
result = pattern.search(x)
if result:
if result.start(0) != 0:
x = x[:result.start(0)+1]+'I'+x[result.end(0)-1:]
else:
x = x[:result.start(0)]+'I'+x[result.end(0)-1:]
else:
break
print(x)
4.2 假設有一段英文,其中有單詞中間的字母“ i ”誤寫爲“ I ”,請編寫程序進行糾正。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
import re
x = "I am a teacher,I am man, and I am 38 years old.I am not a busInessman."
print(x)
pattern = re.compile(r'(?:[\w])I(?:[\w])')
while True:
result = pattern.search(x)
if result:
if result.start(0) != 0:
x = x[:result.start(0)+1]+'i'+x[result.end(0)-1:]
else:
x = x[:result.start(0)]+'i'+x[result.end(0)-1:]
else:
break
print(x)
4.3 有一段英文文本,其中有單詞連續重複了 2 次,編寫程序檢查重複的單詞並只保留一個。例如文本內容爲“ This is is a desk. ”,程序輸出爲“ This is a desk. ”
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
1 )方法一
import re
x = 'This is a a desk.'
pattern = re.compile(r'\b(\w+)(\s+\1){1,}\b')
matchResult = pattern.search(x)
x = pattern.sub(matchResult.group(1),x)
print(x)
2 )方法二
x = 'This is a a desk.'
pattern = re.compile(r'(?P<f>\b\w+\b)\s(?P=f)')
matchResult = pattern.search(x)
x = x.replace(matchResult.group(0),matchResult.group(1))
4.4 簡單解釋 Python 的字符串駐留機制。
答:
Python 支持字符串駐留機制,即:對於短字符串,將其賦值給多個不同的對象時,內存中只有一個副本,多個對象共享該副本。這一點不適用於長字符串,即長字符串不遵守駐留機制,下面的代碼演示了短字符串和長字符串在這方面的區別。
>>> a = '1234'
>>> b = '1234'
>>> id(a) == id(b)
True
>>> a = '1234'*50
>>> b = '1234'*50
>>> id(a) == id(b)
False
4.5 編寫程序,用戶輸入一段英文,然後輸出這段英文中所有長度爲 3 個字母的單詞。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
import re
x = input('Please input a string:')
pattern = re.compile(r'\b[a-zA-Z]{3}\b')
print(pattern.findall(x))
第 5 章 函數設計與使用
5.1 運行 5.3.1 小節最後的示例代碼,查看結果並分析原因。
答:原因是對於函數的默認值參數只會被處理一次,下次再調用函數並且不爲默認值參數賦值時會繼續使用上一次的結果,對於列表這樣的結構,如果調用函數時爲默認值參數的列表插入或刪除了元素,將會得到保留,從而影響下一次調用。
5.2 編寫函數,判斷一個整數是否爲素數,並編寫主程序調用該函數。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
import math
def IsPrime(v):
n = int(math.sqrt(v)+1)
for i in range(2,n):
if v%i==0:
return 'No'
else:
return 'Yes'
print(IsPrime(37))
print(IsPrime(60))
print(IsPrime(113))
5.3 編寫函數,接收一個字符串,分別統計大寫字母、小寫字母、數字、其他字符的個數,並以元組的形式返回結果。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
def demo(v):
capital = little = digit = other =0
for i in v:
if 'A'<=i<='Z':
capital+=1
elif 'a'<=i<='z':
little+=1
elif '0'<=i<='9':
digit+=1
else:
other+=1
return (capital,little,digit,other)
x = 'capital = little = digit = other =0'
print(demo(x))
5.4 在函數內部可以通過關鍵字 global 來定義全局變量。
5.5 如果函數中沒有 return 語句或者 return 語句不帶任何返回值,那麼該函數的返回值爲 None 。
5.6 調用帶有默認值參數的函數時,不能爲默認值參數傳遞任何值,必須使用函數定義時設置的默認值。(對、 錯 )
5.7 在 Python 程序中,局部變量會隱藏同名的全局變量嗎?請編寫代碼進行驗證。
答案:會。
>>> def demo():
a=3
print a
>>> a=5
>>> demo()
3
>>> a
5
5.8 lambda 表達式只能用來創建匿名函數,不能爲這樣的函數起名字。(對、 錯 )
5.9 編寫函數,可以接收任意多個整數並輸出其中的最大值和所有整數之和。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
def demo(*v):
print(v)
print(max(v))
print(sum(v))
demo(1,2,3)
demo(1,2,3,4)
demo(1,2,3,4,5)
5.10 編寫函數 , 模擬內置函數 sum() 。
答 : 這裏給出 Python 3.4.2 代碼 , 如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
def Sum(v):
s = 0
for i in v:
s += i
return s
x = [1,2,3,4,5]
print(Sum(x))
x = (1,2,3,4,5)
print(Sum(x))
5.11 包含 yield 語句的函數可以用來創建生成器。
5.12 編寫函數,模擬內置函數 sorted() 。
答:這裏給出 Python 3.4.2 代碼,如果使用 Python 2.7.8 的話只需要修改其中的 print() 函數爲 print 語句即可。
def Sorted(v):
t = v[::]
r = []
while t:
tt = min(t)
r.append(tt)
t.remove(tt)
return r
x = [1,3,5,2,1,0,9,7]
print(x)
print(Sorted(x))
第 6 章 面向對象程序設計
6.1 繼承 6.5 節例 2 中的 Person 類生成 Student 類,填寫新的函數用來設置學生專業,然後生成該類對象並顯示信息。
答: Python 3.4.2 代碼爲
import types
class Person(object): # 基類必須繼承於 object ,否則在派生類中將無法使用 super() 函數
def __init__(self, name = '', age = 20, sex = 'man'):
self.setName(name)
self.setAge(age)
self.setSex(sex)
def setName(self, name):
if not isinstance(name,str):
print('name must be string.')
return
self.__name = name
def setAge(self, age):
if not isinstance(age,int):
print('age must be integer.')
return
self.__age = age
def setSex(self, sex):
if sex != 'man' and sex != 'woman':
print('sex must be "man" or "woman"')
return
self.__sex = sex
def show(self):
print(self.__name)
print(self.__age)
print(self.__sex)
class Student(Person):
def __init__(self, name='', age = 30, sex = 'man', major = 'Computer'):
# 調用基類構造方法初始化基類的私有數據成員
super(Student, self).__init__(name, age, sex)
self.setMajor(major) # 初始化派生類的數據成員
def setMajor(self, major):
if not isinstance(major, str):
print('major must be a string.')
return
self.__major = major
def show(self):
super(Student, self).show()
print(self.__major)
if __name__ =='__main__':
zhangsan = Person('Zhang San', 19, 'man')
zhangsan.show()
lisi = Student('Li Si',32, 'man', 'Math')
lisi.show()
6.2 設計一個三維向量類,並實現向量的加法、減法以及向量與標量的乘法和除法運算。
答: Python 3.4.2 代碼如下
class Vecter3:
def __init__(self, x=0, y=0, z=0):
self.X = x
self.Y = y
self.Z = z
def __add__(self, n):
r = Vecter3()
r.X = self.X + n.X
r.Y = self.Y + n.Y
r.Z = self.Z + n.Z
return r
def __sub__(self, n):
r = Vecter3()
r.X = self.X - n.X
r.Y = self.Y - n.Y
r.Z = self.Z - n.Z
return r
def __mul__(self, n):
r = Vecter3()
r.X = self.X * n
r.Y = self.Y * n
r.Z = self.Z * n
return r
def __truediv__(self, n):
r = Vecter3()
r.X = self.X / n
r.Y = self.Y / n
r.Z = self.Z / n
return r
def __floordiv__(self, n):
r = Vecter3()
r.X = self.X // n
r.Y = self.Y // n
r.Z = self.Z // n
return r
def show(self):
print((self.X,self.Y,self.Z))
v1 = Vecter3(1,2,3)
v2 = Vecter3(4,5,6)
v3 = v1+v2
v3.show()
v4 = v1-v2
v4.show()
v5 = v1*3
v5.show()
v6 = v1/2
v6.show()
6.3 面向對象程序設計的三要素分別爲 封裝 、 繼承 和 多態 。
6.4 簡單解釋 Python 中以下劃線開頭的變量名特點。
答:
在 Python 中,以下劃線開頭的變量名有特殊的含義,尤其是在類的定義中。用下劃線作爲變量前綴和後綴來表示類的特殊成員:
● _xxx :這樣的對象叫做保護變量,不能用 'from module import *' 導入,只有類對象和子類對象能訪問這些變量;
● __xxx__ :系統定義的特殊成員名字;
● __xxx :類中的私有成員,只有類對象自己能訪問,子類對象也不能訪問到這個成員,但在對象外部可以通過“對象名 ._ 類名 __xxx ”這樣的特殊方式來訪問。 Python 中沒有純粹的 C++ 意義上的私有成員。
6.5 與運算符“ ** ”對應的特殊方法名爲 __pow__() ,與運算符“ // ”對應的特殊方法名爲 __floordiv__() 。
6.6 假設 a 爲類 A 的對象且包含一個私有數據成員“ __value ”,那麼在類的外部通過對象 a 直接將其私有數據成員“ __value ”的值設置爲 3 的語句可以寫作 a._A__value 。
第 7 章 文件操作
7.1 假設有一個英文文本文件,編寫程序讀取其內容,並將其中的大寫字母變爲小寫字母,小寫字母變爲大寫字母。
答:
f = open(r'd:\1.txt','r')
s = f.readlines()
f.close()
r = [i.swapcase() for i in s]
f = open(r'd:\2.txt','w')
f.writelines(r)
f.close()
7.2 編寫程序,將包含學生成績的字典保存爲二進制文件,然後再讀取內容並顯示。
答: Python 3.4.2 代碼
import pickle
d = {' 張三 ':98,' 李四 ':90,' 王五 ':100}
print(d)
f = open('score.dat','wb')
pickle.dump(1,f)
pickle.dump(d,f)
f.close
f = open('score.dat','rb')
pickle.load(f)
d = pickle.load(f)
f.close()
print(d)
7.3 使用 shutil 模塊中的 move() 方法進行文件移動。
答:
>>> import shutil
>>> shutil.move(r'd:\1.txt', r'e:\1.txt')
'e:\\1.txt'
7.4 簡單解釋文本文件與二進制文件的區別。
答:
( 1 )文本文件
文本文件存儲的是常規字符串,由若干文本行組成,通常每行以換行符 '\n' 結尾。常規字符串是指記事本或其他文本編輯器能正常顯示、編輯並且人類能夠直接閱讀和理解的字符串,如英文字母、漢字、數字字符串。文本文件可以使用字處理軟件如 gedit 、記事本進行編輯。
( 2 )二進制文件
二進制文件把對象內容以字節串 (bytes) 進行存儲,無法用記事本或其他普通字處理軟件直接進行編輯,通常也無法被人類直接閱讀和理解,需要使用專門的軟件進行解碼後讀取、顯示、修改或執行。常見的如圖形圖像文件、音視頻文件、可執行文件、資源文件、各種數據庫文件、各類 office 文檔等都屬於二進制文件。
7.5 編寫代碼,將當前工作目錄修改爲“ C:\ ”,並驗證,最後將當前工作目錄恢復爲原來的目錄。
答 :
>>> import os
>>> os.getcwd()
'C:\\Python34'
>>> os.chdir(r'c:\\')
>>> os.getcwd()
'c:\\'
>>> os.chdir(r'c:\Python34')
>>> os.getcwd()
'c:\\Python34'
7.6 編寫程序,用戶輸入一個目錄和一個文件名,搜索該目錄及其子目錄中是否存在該文件。
答:
1 ) Python 3.4.2 代碼
import sys
import os
directory = sys.argv[1]
filename = sys.argv[2]
paths = os.walk(directory)
for root,dirs,files in paths:
if filename in files:
print('Yes')
break
else:
print('No')
2 ) Python 2.7.8 代碼
import sys
import os
directory = sys.argv[1]
filename = sys.argv[2]
paths = os.walk(directory)
for root,dirs,files in paths:
if filename in files:
print 'Yes'
break
else:
print 'No'
7.7 文件對象的 flush() 方法用來把緩衝區的內容寫入文件,但不關閉文件。
7.8 os.path 模塊中的 isfile() 方法用來測試指定的路徑是否爲文件。
7.9 os 模塊的 listdir() 方法用來返回包含指定文件夾中所有文件和子文件夾的列表。
第 8 章 異常處理結構與程序調試
8.1 Python 異常處理結構有哪幾種形式?
答:
比較常用的形式有:
1 )標準異常處理結構
try:
try 塊 # 被監控的語句,可能會引發異常
except Exception[, reason]:
except 塊 # 處理異常的代碼
如果需要捕獲所有異常時,可以使用 BaseException ,代碼格式如下:
try:
……
except BaseException, e:
except 塊 # 處理所有錯誤
上面的結構可以捕獲所有異常,儘管這樣做很安全,但是一般並不建議這樣做。對於異常處理結構,一般的建議是儘量顯式捕捉可能會出現的異常並且有針對性地編寫代碼進行處理,因爲在實際應用開發中,很難使用同一段代碼去處理所有類型的異常。當然,爲了避免遺漏沒有得到處理的異常干擾程序的正常執行,在捕捉了所有可能想到的異常之後,您也可以使用異常處理結構的最後一個 except 來捕捉 BaseException 。
2 )另外一種常用的異常處理結構是 try...except...else... 語句。
3 )在實際開發中,同一段代碼可能會拋出多個異常,需要針對不同的異常類型進行相應的處理。爲了支持多個異常的捕捉和處理, Python 提供了帶有多個 except 的異常處理結構,這類似於多分支選擇結構,一旦某個 except 捕獲了異常,則後面剩餘的 except 子句將不會再執行。語法爲:
try:
try 塊 # 被監控的語句
except Exception1:
except 塊 1 # 處理異常 1 的語句
except Exception2:
except 塊 2 # 處理異常 2 的語句
4 )將要捕獲的異常寫在一個元組中,可以使用一個 except 語句捕獲多個異常,並且共用同一段異常處理代碼,當然,除非確定要捕獲的多個異常可以使用同一段代碼來處理,並不建議這樣做。
5 )最後一種常用的異常處理結構是 try...except...finally... 結構。在該結構中, finally 子句中的內存無論是否發生異常都會執行,常用來做一些清理工作以釋放 try 子句中申請的資源。語法如下:
try:
……
finally:
...... # 無論如何都會執行的代碼
8.2 異常和錯誤有什麼區別?
答:
異常是指因爲程序執行過程中出錯而在正常控制流以外採取的行爲。嚴格來說,語法錯誤和邏輯錯誤不屬於異常,但有些語法錯誤往往會導致異常,例如由於大小寫拼寫錯誤而訪問不存在的對象,或者試圖訪問不存在的文件,等等。
8.3 使用 pdb 模塊進行 Python 程序調試主要有哪幾種用法?
答:主要有三種方式,
1 )在交互模式下使用 pdb 模塊提供的功能可以直接調試語句塊、表達式、函數等多種腳本。
2 )在程序中嵌入斷點來實現調試功能
在程序中首先導入 pdb 模塊,然後使用 pdb.set_trace() 在需要的位置設置斷點。如果程序中存在通過該方法調用顯式插入的斷點,那麼在命令提示符環境下執行該程序或雙擊執行程序時將自動打開 pdb 調試環境,即使該程序當前不處於調試狀態。
3 )使用命令行調試程序
在命令行提示符下執行“ python –m pdb 腳本文件名”,則直接進入調試環境;當調試結束或程序正常結束以後, pdb 將重啓該程序。
8.4 Python 內建異常類的基類是 BaseException 。
8.5 斷言語句的語法爲 assert 。
8.6 Python 上下文管理語句是 with 。
第 9 章 GUI 編程
9.1 設計一個窗體,並放置一個按鈕,單擊按鈕後彈出顏色對話框,關閉顏色對話框後提示選中的顏色。
答: Python 2.7.8 代碼如下,
import wx
class wxGUI(wx.App):
def OnInit(self):
frame = wx.Frame(parent=None, title='wxGUI', size=(160,140))
panel = wx.Panel(frame, -1)
buttonOK = wx.Button(panel, -1, 'OK', pos=(0,0))
self.Bind(wx.EVT_BUTTON, self.OnButtonOK, buttonOK)
frame.Show()
return True
def OnButtonOK(self, event):
colorDlg = wx.ColourDialog(None)
colorDlg.ShowModal()
color = colorDlg.GetColourData().Colour
wx.MessageBox(str(color))
app = wxGUI()
app.MainLoop()
9.2 設計一個窗體,並放置一個按鈕,按鈕默認文本爲“開始”,單擊按鈕後文本變爲“結束”,再次單擊後變爲“開始”,循環切換。
答: Python 2.7.8 代碼如下,
import wx
class wxGUI(wx.App):
def OnInit(self):
frame = wx.Frame(parent=None, title='wxGUI', size=(160,140))
panel = wx.Panel(frame, -1)
self.buttonOK = wx.Button(panel, -1, 'Start', pos=(0,0))
self.Bind(wx.EVT_BUTTON, self.OnButtonOK, self.buttonOK)
frame.Show()
return True
def OnButtonOK(self, event):
text = self.buttonOK.GetLabelText()
if text == 'Start':
self.buttonOK.SetLabelText('End')
elif text == 'End':
self.buttonOK.SetLabelText('Start')
app = wxGUI()
app.MainLoop()
9.3 設計一個窗體,模擬 QQ 登錄界面,當用戶輸入號碼 123456 和密碼 654321 時提示正確,否則提示錯誤。
答: Python 2.7.8 代碼如下,
import wx
class wxGUI(wx.App):
def OnInit(self):
frame = wx.Frame(parent=None, title='Login', size=(250,150), pos=(350,350))
panel = wx.Panel(frame, -1)
label1 = wx.StaticText(panel, -1, 'UserName:', pos=(0,10), style=wx.ALIGN_RIGHT)
label2 = wx.StaticText(panel, -1, 'Password:', pos=(0,30), style=wx.ALIGN_RIGHT)
self.textName = wx.TextCtrl(panel, -1, pos=(70,10), size=(160,20))
self.textPwd = wx.TextCtrl(panel, -1, pos=(70,30), size=(160,20),style=wx.TE_PASSWORD)
buttonOK = wx.Button(panel, -1, 'OK', pos=(30,60))
self.Bind(wx.EVT_BUTTON, self.OnButtonOK, buttonOK)
buttonCancel = wx.Button(panel, -1, 'Cancel', pos=(120,60))
self.Bind(wx.EVT_BUTTON, self.OnButtonCancel, buttonCancel)
buttonOK.SetDefault()
frame.Show()
return True
def OnButtonOK(self, event):
usrName = self.textName.GetValue()
usrPwd = self.textPwd.GetValue()
if usrName=='123456' and usrPwd=='654321':
wx.MessageBox('Right')
else:
wx.MessageBox('Wrong')
def OnButtonCancel(self, event):
pass
app = wxGUI()
app.MainLoop()