百度雲:連結:https://pan.baidu.com/s/1iLe8CQ_Io9HOzM06x59IDw提取碼:bt08
點選跳轉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\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()