《 Python 程序设计》习题与参照答案
第 1章 基础知识
简单说明怎样选择正确的
Python 版本。
答:
在选择 Python 的时候,必定要先考虑清楚自己学习
Python 的目的是什么,打当作哪
方面的开发,有哪些扩展库可用,这些扩展库最高频频安装和卸载上。同时还应当注意, 当更新的 Python 版本推出以后, 不要急于更新, 而是应当等确立自己所一定使用的扩展库 也推出了较新版本以后再进行更新。
只管这样, Python 3 毕竟是大势所趋,假如您临时还没想到要做什么行业领域的应用
开发,或许只是是为了试试一种新的、好玩的语言,那么请绝不踌躇地选择
列的最高版本(目前是
)。
为何说 Python 采纳的是鉴于值的内存管理模式?
答: Python 采纳的是鉴于值的内存管理方式,假如为不一样变量赋值同样值,则在内存中只
有一份该值,多个变量指向同一块内存地点,比以下边的代码。
>>> x = 3
>>> id(x)
>>> y = 3
>>> id(y)
>>> y = 5
>>> id(y)
>>> id(x)
1 / 57
系
《Python程序设计》练习习题及答案
在 Python 中导入模块中的对象有哪几种方式?
答:常用的有三种方式,分别为
import 模块名 [as
又名 ]
from 模块名 import
对象名 [ as 又名 ]
from math import *
使用 pip 命令安装 numpy、scipy 模块。
答:在命令提示符环境下履行下边的命令: pip install numpy pip install scipy
编写程序,用户输入一个三位以上的整数,输出其百位以上的数字。比如用户输
入 1234,则程序输出 12。(提示:使用整除运算。 )
答:
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:
2 / 57
《Python程序设计》练习习题及答案
print('You must input an integer.')
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 数据结构
为何应尽量从列表的尾部进行元素的增添与删除操作?
答:
当列表增添或删除元素时,列表对象自动进行内存扩展或缩短,进而保证元素之间没有空隙,但这波及到列表元素的挪动,效率较低,应尽量从列表尾部进行元素的增添与删除操作以提升办理速度。
编写程序, 生成包括 1000 个 0 到 100 之间的随机整数,并统计每个元素的出现次
数。(提示:使用会合。 )
答:
import random
x = [random.randint(0,100) for i in range(1000)]
d = set(x)
for v in d:
3 / 57
《Python程序设计》练习习题及答案
print(v, ':', x.count(v))
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 个整数作为下标,而后输出列表中介于
[1,2,3,4,5,6]
2 个下
标之间的元素构成的子列表。比如用户输入
和 2,5 ,程序输出 [3,4,5,6] 。
答:
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])
x = input('Please input a list:')
start, end = input('Please input the start position and the end position:')
print x[start:end]
设计一个词典,并编写程序,用户输入内容作为键,而后输出词典中对应的值,
假如用户输入的键不存在,则输出“您输入的键不存在!
”
答:
d = {1:'a', 2:'b', 3:'c', 4:'d'}
v = input('Please input a key:')
v = eval(v)
4 / 57
《Python程序设计》练习习题及答案
print(d.get(v,'
您输入的的键不存在 '))
d = {1:'a', 2:'b', 3:'c', 4:'d'}
v = input('Please input a key:')
print(d.get(v,'
您输入的的键不存在 '))
10 个元素升序摆列,后 10 个
编写程序,生成包括 20 个随机数的列表,而后将前
元素降序摆列,并输出结果。
答:
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)
import random
x = [random.randint(0,100) for i in range(20)]
print x
y = x[0:10]
y.sort()
x[0:10] = y
5 / 57
《Python程序设计》练习习题及答案
y = x[10:20]
y.sort(reverse=True)
x[10:20] = y
print x
在 Python 中,词典和会合都是用一对
大括号 键
作为定界符, 词典的每个元素
有两部分构成,即
键 和 值 ,此中 不一样意重复。
假定有列表 a = ['name','age','sex'] 和 b = ['Dong',38,'Male']
,请使用一个
语句将这两个列表的内容变换为词典,而且以列表
a 中的元素为键,以列表
b 中的元素为
值,这个语句能够写为
c = dict(zip(a,b))
。
假定有一个列表 a,现要求从列表 a 中每 3 个元素取 1 个,而且将取到的元素构成
b = a[::3]
。
[5 for i in
新的列表 b,能够使用语句
使用列表推导式生成包括 10 个数字 5 的列表,语句能够写为
range(10)] 。
不可以够 (能够、不可以够)使用 del 命令来删除元组中的部分元素。
第 3 章 选择结构与循环结构
剖析逻辑运算符“ or ”的短路求值特征。
答:
假定有表达式“表达式 1 or 表达式 2”,假如表达式 1 的值等价于 True ,那么不论表达式 2 的值是什么, 整个表达式的值老是等价于 True 。所以, 不需要再计算表达式 2 的值。
编写程序,运转后用户输入 4 位整数作为年份,判断其能否为闰年。假如年份能
被 400 整除,则为闰年;假如年份能被
4 整除但不可以被 100 整除也为闰年。
6 / 57
《Python程序设计》练习习题及答案
答:
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')
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'
编写程序,生成一个包括
50 个随机整数的列表,而后删除此中所有奇数。
从后向前删。)
答:
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
7 / 57
(提示:
《Python程序设计》练习习题及答案
print(x)
把上边的代码中第三行和最后一行改为
print x 即可。
34 编写程序,生成一个包括 20 个随机整数的列表,而后对此中偶数下标的元素进行降序摆列,奇数下标的元素不变。 (提示:使用切片。 )
答:
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)
把上边的代码中第三行和最后一行改为
print x 即可。
35 编写程序, 用户从键盘输入小于 1000 的整数,对其进行因式分解。
60=2× 2× 3× 5。
答:
x = input('Please input an integer less than 1000:')
x = eval('x')
t = x
i = 2
result = []
while True:
8 / 57
×5, 比如, 10=2
《Python程序设计》练习习题及答案
if t==1:
break if t%i==0:
result.append(i) t = t/i else:
i+=1
Print x,'=','*'.join(map(str,result))
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))
编写程序,起码使用 2 种不一样的方法计算 100 之内所有奇数的和。
x = [i for i in range(1,100) if i%2==1]
9 / 57
《Python程序设计》练习习题及答案
print(sum(x))
print(sum(range(1,100)[::2]))
编写程序,实现分段函数计算,以下表所示。
x y
x<0 0
0<=x<5 x
5<=x<10 3x-5
10<=x<20
20<=x 0
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)
10 / 57
《Python程序设计》练习习题及答案
第 4 章 字符串与正则表达式
假定有一段英文,此中有独自的字母“ I ”误写为“ i ”,请编写程序进行纠正。
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)
假定有一段英文, 此中有单词中间的字母 “ i ”误写为 “ I ”,请编写程序进行纠正。
11 / 57
《Python程序设计》练习习题及答案
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)
有一段英文文本,此中有单词连续重复了
留一个。比如文本内容为“
This is is a desk. ”,程序输出为“
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)
12 / 57
2 次,编写程序检查重复的单词并只保
This is a desk.
”
《Python程序设计》练习习题及答案
2)方法二
x = 'This is a a desk.'
pattern = re.compile(r'(?P matchResult = pattern.search(x) x = x.replace(matchResult.group(0),matchResult.group(1)) 简单解说 Python 的字符串驻留体制。 答: Python 支持字符串驻留体制,即:关于短字符串,将其赋值给多个不一样的对象时,内 存中只有一个副本,多个对象共享该副本。这一点不合用于长字符串,即长字符串不恪守 驻留体制,下边的代码演示了短字符串和长字符串在这方面的差别。 >>> a = '1234' >>> b = '1234' >>> id(a) == id(b) True >>> a = '1234'*50 >>> b = '1234'*50 >>> id(a) == id(b) False 编写程序, 用户输入一段英文, 而后输出这段英文中所有长度为 3 个字母的单词。 import re x = input('Please input a string:') pattern = re.compile(r'\\b[a-zA-Z]{3}\\b') 13 / 57 《Python程序设计》练习习题及答案 print(pattern.findall(x)) 14 / 57 《Python程序设计》练习习题及答案 第 5 章 函数设计与使用 答:原由是关于函数的默认值参数只会被办理一次,下次再调用函数而且不为默认值参数赋值时会持续使用前一次的结果,关于列表这样的结构,假如调用函数时为默认值参数的列表插入或删除了元素,将会获得保存,进而影响下一次调用。 编写函数,判断一个整数能否为素数,并编写主程序调用该函数。 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)) 编写函数,接收一个字符串,分别统计大写字母、小写字母、数字、其余字符的 个数,并以元组的形式返回结果。 def demo(v): capital = little = digit = other =0 for i in v: if 'A'<=i<='Z': capital+=1 15 / 57 《Python程序设计》练习习题及答案 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)) 在 Python 程序中,局部变量会隐蔽同名的全局变量吗?请编写代码进行考证。 答案:会。 >>> def demo(): a=3 >>> a=5 >>> demo() print a 3 >>> a 5 5.5 编写函数,能够接收随意多个整数并输出此中的最大值和所有整数之和。 def demo(*v): print(v) print(max(v)) 16 / 57 《Python程序设计》练习习题及答案 print(sum(v)) demo(1,2,3) demo(1,2,3,4) demo(1,2,3,4,5) 编写函数,模拟内置函数 sum() 。 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)) 编写函数,模拟内置函数 def Sorted(v): t = v[::] r = [] while t: tt = min(t) r.append(tt) t.remove(tt) return r sorted()。 17 / 57 《Python程序设计》练习习题及答案 x = [1,3,5,2,1,0,9,7] print(x) print(Sorted(x)) 18 / 57 《Python程序设计》练习习题及答案 第 6 章 面向对象程序设计 继承 节例 2 中的 Person 类生成 Student 类,填写新的函数用来设置学生专业, 而后生成该类对象并显示信息。 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\"') 19 / 57 《Python程序设计》练习习题及答案 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() 20 / 57 《Python程序设计》练习习题及答案 设计一个三维向量类,并实现向量的加法、减法以及向量与标量的乘法和除法运 算。 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() return r def __sub__(self, n): r = Vecter3() return r def __mul__(self, n): r = Vecter3() r.X = self.X * n r.Y = self.Y * n r.Z = self.Z * n 21 / 57 《Python程序设计》练习习题及答案 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 22 / 57 《Python程序设计》练习习题及答案 v6.show() 面向对象程序设计的三因素分别为 封装 、 继承 和 多态 。 简单解说 Python 中以下划线开头的变量名特色。 答: 在 Python 中,以下划线开头的变量名有特别的含义,特别是在类的定义中。用下划线作为变量前缀和后缀来表示类的特别成员: _xxx :这样的对象叫做保护变量,不可以用 'from module import *' 导入,只有类对 象和子类对象能接见这些变量; __xxx__ :系统定义的特别成员名字; __xxx :类中的私有成员, 只有类对象自己能接见, 子类对象也不可以接见到这个成员,但在对象外面能够经过“对象名 ._ 类名 __xxx ”这样的特别方式来接见。 Python 中没有纯 粹的 C++意义上的私有成员。 与运算符“ ** ”对应的特别方法名为 __pow__() ,与运算符“ // ”对应的特 殊方法名为 __floordiv__() 。 23 / 57 《Python程序设计》练习习题及答案 第 7章 文件操作 假定有一个英文文本文件,编写程序读取其内容,并将此中的大写字母变成小写 字母,小写字母变成大写字母。 答: 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() 编写程序,将包括学生成绩的词典保存为二进制文件,而后再读取内容并显示。 import pickle d = {' 张三 ':98,' 李四 ':90,' 王五 ':100} print(d) f = open('score.dat','wb') pickle.dump(1,f) pickle.dump(d,f) f = open('score.dat','rb') pickle.load(f) d = pickle.load(f) f.close() 24 / 57 《Python程序设计》练习习题及答案 print(d) 使用 shutil 模块中的 move() 方法进行文件挪动。 答: >>> import shutil >>> shutil.move(r'd:\\1.txt', r'e:\\1.txt') 'e:\\\\1.txt' 简单解说文本文件与二进制文件的差别。 答: ( 1)文本文件 文本文件储存的是惯例字符串,由若干文本行构成,往常每行以换行符 '\\n' 结尾。常 规字符串是指记事本或其余文本编写器能正常显示、编写而且人类能够直接阅读和理解的 字符串,如英文字母、汉字、数字字符串。文本文件能够使用字办理软件如 gedit 、记事本 进行编写。 ( 2)二进制文件 二进制文件把对象内容以字节串 (bytes) 进行储存,没法用记事本或其余一般字办理软件直接进行编写,往常也没法被人类直接阅读和理解,需要使用特意的软件进行解码后读 取、显示、改正或履行。常有的如图形图像文件、音视频文件、可履行文件、资源文件、 各样数据库文件、各种 office 文档等都属于二进制文件。 ”,并考证,最后将目前工作目录恢复为 编写代码,将目前工作目录改正为“ 本来的目录。 答: 25 / 57 《Python程序设计》练习习题及答案 >>> import os >>> os.getcwd() 'C:\\\\Python34' >>> os.chdir(r'c:\\\\') >>> os.getcwd() 'c:\\\\' >>> os.chdir(r'c:\\Python34') >>> os.getcwd() 'c:\\\\Python34' 编写程序,用户输入一个目录和一个文件名,搜寻该目录及其子目录中能否存在 该文件。 答: 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') 26 / 57 《Python程序设计》练习习题及答案 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' 27 / 57 《Python程序设计》练习习题及答案 第 8 章 异样办理结构与程序调试 8.1 Python 异样 理 构有哪几种形式? 答: 比 常用的形式有: 1) 准异样 理 构 try: try # 被 控的 句,可能会引 异样 except Exception[, reason]: except # 理异样的代 BaseException ,代 格式以下: 假如需要捕 所有异样 ,能够使用 try: ⋯⋯ except BaseException, e: except # 理所有 上边的 构能够捕 所有异样,只管 做很安全,可是一般其实不建 做。 于异样 理 构,一般的建 是尽量 式捕获可能会出 的异样而且有 性地 写代 行 理,因 在 用开 中,很 使用同一段代 去 理所有 型的异样。自然, 了防止 漏没有获得 理的异样干 程序的正常 行, 在捕获了所有可能想到的异样以后, 您也能够使用异样 理 构的最后一个 except 来捕获 BaseException 。 try...except...else... 句。 2)此外一种常用的异样 理 构是 3)在 开 中,同一段代 可能会抛出多个异样,需要 不一样的异样 型 行相 28 / 57 《Python程序设计》练习习题及答案 的 理。 了支持多个异样的捕获和 理, 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: ...... #无 怎样都会 行的代 异样和 有什么区 ? 答: 异样是指因 程序 行 程中出 而在正常控制流以外采纳的行 。 格来 , 法 29 / 57 子句 《Python程序设计》练习习题及答案 错误和逻辑错误不属于异样,但有些语法错误常常会致使异样,比如因为大小写拼写错误 而接见不存在的对象,或许试图接见不存在的文件,等等。 使用 pdb 模块进行 Python 程序调试主要有哪几种用法? 答:主要有三种方式, 1)在交互模式下使用 pdb 模块供给的功能能够直接调试语句块、表达式、函数等多种 脚本。 2)在程序中嵌入断点来实现调试功能 在程序中第一导入 pdb 模块,而后使用 pdb.set_trace() 在需要的地点设置断点。 假如程序中存在经过该方法调用显式插入的断点,那么在命令提示符环境下履行该程序或双击履行程序时将自动翻开 pdb 调试环境,即便该程序目前不处于调试状态。 3)使用命令行调试程序 在命令行提示符下履行“ python – m pdb 脚本文件名” ,则直接进入调试环境;当调 pdb 将重启该程序。 BaseException 。 with 。 。 试结束或程序正常结束此后, 8.4 Python 内建异样类的基类是 断语言句的语法为 assert 8.6 Python 上下文管理语句是 30 / 57 《Python程序设计》练习习题及答案 第9章 GUI编程 设计一个窗体,并搁置一个按钮,单击按钮后弹出颜色对话框,封闭颜色对话框 后提示选中的颜色。 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() 设计一个窗体,并搁置一个按钮,按钮默认文本为“开始” “结束”,再次单击后变成“开始” ,循环切换。 import wx class wxGUI(wx.App): 31 / 57 ,单击按钮后文本变成 《Python程序设计》练习习题及答案 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): if text == 'Start': elif text == 'End': app = wxGUI() app.MainLoop() 设计一个窗体,模拟 QQ登录界面, 当用户输入号码 123456 和密码 654321 时提示 正确,不然提示错误。 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), 32 / 57 《Python程序设计》练习习题及答案 style=wx.ALIGN_RIGHT) self.textName = wx.TextCtrl(panel, -1, pos=(70,10), size=(160,20)) = 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): if usrName=='123456' and usrPwd=='654321': wx.MessageBox('Right') else: wx.MessageBox('Wrong') def OnButtonCancel(self, event): pass app = wxGUI() app.MainLoop() 33 / 57 《Python程序设计》练习习题及答案 第 10 章 网络程序设计 简单解说 TCP和 UDP协议的差别。 答: TCP协议是面向连结的、拥有质量保证的靠谱传输协议,但开支较大; UDP协议是尽最 大能力传输的无连结协议,开支小,常用于视频在线点播( Video On Demand, VOD)之类 的应用。 TCP协讲和 UDP协议并无好坏之分,只是是合用处合有所不一样。 同学之间合作编写 UDP通讯程序,分别编写发送端和接收端代码,发送端发送一 5000 端口进行接收,并显示接收内容。 个字符串“ Hello world! ”。假定接收端在计算机的 答:第一使用 ipconfig/all 命令查察本机 IP 地点,而后分别编写下边的代码,并将此中的 IP 地点代替为相应的 IP 地点。 接收端代码: import socket s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) s.bind((\"\ 空字符串表示本机任何可用 IP 地点 data, addr=s.recvfrom(1024) # 缓冲区大小为 1024 字节 显示接收到的内容 print ' received message:%s' % data # s.close( ) 发送端代码: import socket s=socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 0 主机的 IP 地点 s.close( ) 34 / 57 《Python程序设计》练习习题及答案 简单介绍 socket 模块顶用于 TCP编程的常用方法。 TCP程序时常常需要用到的 socket 模块 TCP一般用于要求靠谱数据传输的场合。编写 方法主要有: connect(address) :连结远程计算机 send(bytes[,flags]) :发送数据 recv(bufsize[,flags]) :接收数据 bind(address) :绑定地点 listen(backlog) :开始监听,等候客户端连结 accept() :响应客户端的恳求 编写代码读取搜狐网页首页内容。 答: >>> >>> dir(urllib.request) ') >>> dir(fp) >>> print(fp.read(100)) >>> fp.close() 在自己的机器上配置 IIS 以支持 Python 脚本的运转,而后使用 运转后在网页上显示“ Hello world! ”。 答:核心代码为 print print 'Status: 200 OK' 35 / 57 编写脚本, Python 《Python程序设计》练习习题及答案 print 'Content-type: text/html' print print ' print ' print ' print ' Hello world!' print ' print '' 36 / 57 《Python程序设计》练习习题及答案 第 11 章 大数据办理 简单介绍常有的大数据办理框架。 答:主要有三种, MapReduce:散布式计算框架, 能够将单个大型计算作业分派给多台计算机履行, 可 以在短时间内达成大批工作, 特别合适数值型和标称型数据, 但需要对行业领域拥有一 定理解后重写算法来达成特定的业务办理要求。 MapReduce的名字由函数式编程中常用 的 map和 reduce 两个单词构成。 MapReduce在大批节点构成的集群上运转,工作流程是:单个作业被分红好多小份,输入数据也被切片并散发到每个节点,每个节点只在本 地数据上做运算,对应的运算代码称为mapper,这个过程即 map阶段;每个 mapper 的 输出经过某种方式组合, 依据需要可能再进行从头排序, 排序后的结果再被切分红小份 并散发到各个节点进行下一步办理,这个过程被称为 reduce 阶段,对应的代码称为 reducer 。不一样种类的作业可能需要不一样数目的 reducer ,而且,在任何时候,每个 mapper 或 reducer 之间都不进行通讯, 每个节点只负责办理自己的事务, 而且只在分派到当地的数据集长进行运算。 Hadoop:Hadoop 是 MapReduce框架的一个免费开源实现,采纳 Java 语言编写,支 持在大批机器上散布式办理数据。除了散布式计算以外, Hadoop 还自带散布式文件系 Hadoop 在可伸缩性、强健性、 统,能够在上边运转多种不一样语言编写的散布式程序。 计算性能和成本上拥有无可代替的优势, 事实上已成为目前互联网公司主流的大数据分 析平台。 Spark :Spark 是一个针对超大数据会合的低延缓集群散布式计算系统, 比 MapReduce 快 40 倍左右。 Spark 是 Hadoop的升级版本,兼容 Hadoop的 API,能够读写 Hadoop的 HDFS HBASE次序言件等,与之不一样的是将结果保存在内存中。 Hadoop 作为第一代产 品使用了 HDFS,第二代加入了 Cache 来保存中间计算结果,第三代则是 Spark 倡议的 37 / 57 《Python程序设计》练习习题及答案 流技术 Streaming 。 运转本章中代码并理解 MapReduce编程思路。 答:略 38 / 57 《Python程序设计》练习习题及答案 第 12 章 Windows 系统编程 查阅有关资料,解说注册表几大根键的用途。 答:略 选择一个编写好的 Python 程序,将其变换为 exe 可履行文件。 答:略,请参照书中有关介绍。 编写代码,使用起码 3 中不一样的方法启动 Windows 自带的计算器程序。 答: 第一种方法: >>> import os >>> os.system('calc.exe') 第二种方法: >>> import os >>> os.popen('calc.exe') 第三种方法: >>> import os >>> os.startfile('calc.exe') 第四种方法: >>> import win32api >>> win32api.ShellExecute(0, 'open', 'calc.exe', '', '', 1) 第五种方法: 39 / 57 《Python程序设计》练习习题及答案 >>> import win32process >>> handle=win32process.CreateProcess(r'c:\\windows\\system32\\calc.exe','', win32process.CREATE_NO_WINDOW, None, None,None,0, None,win32process.STARTUPINFO()) 编写代码,检测您所使用的操作系统版本。 答:略,请参照节。 40 / 57 12.5 《Python程序设计》练习习题及答案 第 13 章 多线程编程 简单表达创立线程的方法。 答: Thread 类支持使用两种方法来创立线程,一种是为结构函数传达一个可调用对象,另 一种是继承 Thread 类并在派生类中重写 __init__() 和 run() 方法。创立了线程对象此后, 能够调用其 start() 方法来启动, 该方法自动调用该类对象的 run() 方法,此时该线程处于 alive 状态,直至线程的 run() 方法运转结束。 简单表达 Thread 对象的方法。 答: ( 1)join([timeout] :堵塞目前线程,等候被调线程结束或超时后再持续履行目前线程的后续代码,参数 timeout 用来指定最长等候时间,单位为秒。 ( 2) isAlive() :测试线程能否处于运转状态 ( 3) start() :自动调用 run() 方法,启动线程,履行线程代码。 ( 4) run() :线程代码,用来实现线程的功能与业务逻辑,能够在子类中重写该方法来自定义线程的行为。 简单表达线程对象的 daemon属性的作用和影响。 答: 在脚本运转过程中有一个主线程,若在主线程中创立了子线程,当主线程结束时依据 子线程 daemon属性值的不一样可能会发生下边的两种状况之一: 1)当某子线程的 daemon属性为 False 时,主线程结束时会检测该子线程能否结束,假如该子线程还没有达成,则主线 程会等候它达成后再退出; 2)当某子线程的 daemon属性为 True 时,主线程运转结束时不 41 / 57 《Python程序设计》练习习题及答案 对该子线程进行检查而直接退出,同时所有 daemon值为 True 的子线程将随主线程一同结 束,而不论能否运转达成。 daemon属性的值默以为 False ,假如需要改正,则一定在调用 start() 方法启动线程以行进行改正。 解说起码 3 种线程同步方法。 答: ( 1)使用 Condition 对象能够在某些事件触发后才办理数据, 能够用于不一样线程之间的通讯或通知,以实现更高级其余同步。 Condition 对象除了拥有 acquire() 和 release() 方法以外,还有 wait() 、notify() 、notify_all() 等方法。 下边经过经典生产者 / 花费者问 题来演示 Condition 对象的用法。 ( 2) Queue模块(在 Python 3 中为 queue 模块)实现了多生产者 / 多花费者行列,尤 其合适需要在多个线程之间进行信息互换的场合,该模块的 Queue对象实现了多线程编程所需要的所有锁语义。 ( 3) Event 对象是一种简单的线程通讯技术,一个线程设置 Event 对象,另一个线程 等候 Event 对象。Event 对象的 set() 方法能够设置 Event 对象内部的信号标记为真; clear() 方法能够消除 Event 对象内部的信号标记, 将其设置为假; isSet() 方法用来判断其内部信 号标记的状态; wait() 方法只有在其内部信号状态为真时将很快地履行并返回,若 Event 对象的内部信号标记为假, wait() 方法将向来等候至超时或内部信号状态为真。 42 / 57 《Python程序设计》练习习题及答案 第 14 章 数据库编程 简单介绍 SQLite 数据库。 答: SQLite 是内嵌在 Python 中的轻量级、 鉴于磁盘文件的数据库管理系统, 不需要服务器 SQL91 进度,支持使用 SQL语句来接见数据库。该数据库使用 标 C 语言开发,支持大部分 准,支持原子的、一致的、独立的和长久的事务,不支持外键限制;经过数据库级的独占性和共享锁定来实现独立事务,当多个线程同时接见同一个数据库并试图写入数据时,每 一时辰只有一个线程能够写入数据。 SQLite 支持 2TB大小的单个数据库,每个数据库完整储存在单个磁盘文件中,以 B+树数据结构的形式储存,一个数据库就是一个文件,经过简单复制即可实现数据库的备份。 使用 Python 内置函数 dir() 查察 Cursor 对象中的方法, 并使用内置函数 help() 查察其用法。 答:略。 表达使用 Python 操作 Access 数据库的步骤。 答: ( 1)成立数据库连结 conn.Open(DSN) ( 2)翻开记录集 rs_name = 'MyRecordset' # 表名 rs.Open('[' + rs_name + ']', conn, 1, 3) 43 / 57 《Python程序设计》练习习题及答案 ( 3)操作记录集 rs.AddNew() rs.Update() ( 4)操作数据 sql_statement = \"Insert INTO [Table_Name] ([Field_1], [Field_2]) VALUES('data1', 'data2')\" conn.Open(DSN) conn.Execute(sql_statement) conn.Close() ( 5)遍历记录 rs.MoveFirst() count = 0 while 1: if rs.EOF: break else: count = count + 1 rs.MoveNext() 表达使用 Python 操作 MS SQL Server 数据库的步骤。 答: 能够使用 pywin32 和 pymssql 两种不一样的方式来接见 MS SQL Server 数据库。 先来认识一下 pywin32 模块接见 MS SQL Server 数据库的步骤。 44 / 57 《Python程序设计》练习习题及答案 ( 1)增添引用 : import adodbapi import adodbapi.ado_consts as adc ( 2)创立连结 : Cfg = constr = r\"Provider=SQLOLEDB.1; Initial Catalog=%s; Data Source=%s; user ID=%s; Password=%s; \"% (Cfg['db'], Cfg['server'], 'sa', Cfg['password']) conn = adodbapi.connect(constr) ( 3)履行 sql 语句 : cur = conn.cursor() sql = '''select * from softextBook where title='{0}' remark3!='{1}''''.format(bookName,flag) cur.execute(sql) data = cur.fetchall() cur.close() ( 4)履行储存过程 : #假定 proName有三个参数 , 最后一个参数传了 null ret = cur.callproc('procName',(parm1,parm2,None)) conn.commit() ( 5)封闭连结 conn.close() 45 / 57 and 《Python程序设计》练习习题及答案 接下来再经过一个示例来简单认识一下使用 pymssql 模块接见 MS SQL Server 数据库 的方法。 import pymssql conn = pymssql.connect(host='SQL01', user='user', password='password', database='mydatabase') cur = conn.cursor() cur.execute('CREATE TABLE persons(id INT, name VARCHAR(100))') cur.executemany(\"INSERT INTO persons VALUES(%d, xinos.king)\ (2, 'Jane Doe') ]) conn.commit() cur.execute('SELECT * FROM persons WHERE salesrep=xinos.king', 'John Doe') row = cur.fetchone() while row: print \"ID=%d, Name=xinos.king\" % (row[0], row[1]) row = cur.fetchone() cur.execute(\"SELECT * FROM persons WHERE salesrep LIKE 'J%'\") conn.close() 表达 MySQLDb模块供给的数据库接见方法。 答: Python 接见 MySQL数据库能够使用 MySQLDb模块,该模块主要方法有: commit() :提交事务。 rollback() :回滚事务。 :用来履行储存过程,接收的参数为储存过程名 callproc(self, procname, args) 46 / 57 《Python程序设计》练习习题及答案 和参数列表,返回值为受影响的行数。 execute(self, query, args) :履行单条 sql 语句,接收的参数为 sql 语句自己和 使用的参数列表,返回值为受影响的行数。 executemany(self, query, args) :履行单条 sql 语句,可是重复履行参数列表里 的参数,返回值为受影响的行数。 nextset(self) :挪动到下一个结果集。 fetchall(self) :接收所有的返回结果行。fetchmany(self, size=None) :接收 size 的结果行的数目,则会返回 fetchone(self) :返回一条结果行。 scroll(self, value, mode='relative') ,mode='relative' 则表示从目前所内行挪动 示从结果集的第一行挪动 value 条。 47 / 57 条返回结果行,假如 size 的值大于返回 条数据。 : 挪动指针到某一行 , 如 果, value 条;假如 mode='absolute' 则表 《Python程序设计》练习习题及答案 第 15 章 多媒体编程 编程程序,在窗口上绘制一个三角形,设置三个极点为不一样的颜色,并对内部进 行圆滑着色。 答: from OpenGL.GL import * from OpenGL.GLUT import * from OpenGL.GLU import * import sys class MyPyOpenGLTest: def __init__(self, width = 640, height = 480, title = 'MyPyOpenGLTest'): glutInit(sys.argv) glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE | GLUT_DEPTH) glutInitWindowSize(width, height) self.window = glutCreateWindow(title) glutDisplayFunc(self.Draw) glutIdleFunc(self.Draw) self.InitGL(width, height) #default drawing function def Draw(self): glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glLoadIdentity() glTranslatef(-2.0, 0.0, -8.0) #draw 2D graphic, leaving z to be 0 48 / 57 《Python程序设计》练习习题及答案 glBegin(GL_POLYGON) glColor3f(1.0, 0.0, 0.0) glVertex3f(0.0, 1.0, 0.0) glColor3f(0.0, 1.0, 0.0) glVertex3f(1.0, -1.0, 0.0) glColor3f(0.0, 0.0, 1.0) glVertex3f(-1.0, -1.0, 0.0) glEnd() glTranslatef(2.5, 0.0, 0.0) glutSwapBuffers() def InitGL(self, width, height): glClearColor(0.0, 0.0, 0.0, 0.0) glClearDepth(1.0) glDepthFunc(GL_LESS) glShadeModel(GL_SMOOTH) glEnable(GL_POINT_SMOOTH) glEnable(GL_LINE_SMOOTH) glEnable(GL_POLYGON_SMOOTH) glMatrixMode(GL_PROJECTION) glHint(GL_POINT_SMOOTH_HINT,GL_NICEST) glHint(GL_LINE_SMOOTH_HINT,GL_NICEST) glHint(GL_POLYGON_SMOOTH_HINT,GL_FASTEST) glLoadIdentity() gluPerspective(45.0, float(width)/float(height), 0.1, 100.0) 49 / 57 《Python程序设计》练习习题及答案 glMatrixMode(GL_MODELVIEW) def MainLoop(self): glutMainLoop() if __name__ == '__main__': w = MyPyOpenGLTest() w.MainLoop() 编写程序,读取两幅大小同样的图片,而后将两幅图像的内容叠加到一幅图像, 结果图像中每个像素值为原两幅图像对应地点像素值的均匀值。 答: from PIL import Image im1 = Image.open('d:\\\\pic1.bmp') im2 = Image.open('d:\\\\pic2.bmp') for i in range(size[0]): for j in range(size[1]): color1 = im1.getpixel((i,j)) color2 = im2.getpixel((i,j)) r = (color1[0]+color2[0])//2 g = (color1[1]+color2[1])//2 b = (color1[2]+color2[2])//2 im1.putpixel((i,j),(r,g,b)) im1.save('d:\\\\pic3.bmp') im1.close() 50 / 57 《Python程序设计》练习习题及答案 im2.close() 编写程序,读取一幅图像的内容,将其按象限分为 4 等份,而后 1、 3 象限内容 互换, 2、 4 象限内容互换,生成一幅新图像。 答: from PIL import Image im = Image.open('d:\\\\pic1.bmp') im2 = Image.open('d:\\\\pic1.bmp') box1 = (0, size[1]/2, size[0]/2, size[1]) region1 = im.crop(box1) box2 = (0, 0, size[0]/2, size[1]/2) region2 = im.crop(box2) box3 = (size[0]/2, 0, size[0], size[1]/2) region3 = im.crop(box3) box4 = (size[0]/2, size[1]/2, size[0], size[1]) region4 = im.crop(box4) im2.paste(region1, box3) im2.paste(region3, box1) im2.paste(region2, box4) im2.paste(region4, box2) im2.save('d:\\\\pic4.bmp') im.close() im2.close() 51 / 57 《Python程序设计》练习习题及答案 联合 GUI 编程知识,编写一个程序,创立一个窗口并在上边搁置两个按钮,分别 为“开始播放”和“暂停播放” ,将本章 节中的音乐播放程序进行封装。 答: import wx import os import pygame import random import time import threading class wxGUI(wx.App): def OnInit(self): frame = wx.Frame(parent=None, title='MP3Player', pos=(350,350)) panel = wx.Panel(frame, -1) self.buttonOK = wx.Button(panel, -1, 'Play', pos=(30,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonOK, self.buttonOK) self.buttonCancel = wx.Button(panel, -1, 'Stop', pos=(120,60)) self.Bind(wx.EVT_BUTTON, self.OnButtonCancel, self.buttonCancel) frame.Show() return True def OnExit(self): try: self.playing = False 52 / 57 size=(250,150), 《Python程序设计》练习习题及答案 finally: pass def play(self): folder = r'h:\\music' musics = [folder+'\\\\'+music for music in os.listdir(folder) if music.endswith('.mp3')] total = len(musics) while self.playing: nextMusic = random.choice(musics) print 'playing....',nextMusic else: time.sleep(1) def OnButtonOK(self, event): self.playing = True # create a new thread to play music t = threading.Thread(target=self.play) t.start() def OnButtonCancel(self, event): self.playing = False app = wxGUI() app.MainLoop() 运转本章 中的代码并查察运转结果。 答:略。 53 / 57 《Python程序设计》练习习题及答案 第 16 章 逆向工程与软件剖析 下载 PE文件规范 版本,并试试认识 PE文件基本结构。 答:略。 下载并安装 IDA Pro 与 Immunity Debugger,并简单认识 PE文件反汇编和调试步 骤。 答:略。 安装并配置 IDAPython 插件,而后运转本章 答:略。 在 Immunity Debugger 调试器中运转本章 答:略。 表达软件调试断点的观点、作用及其分类。 答: 断点是最常用的软件调试技术之一,其基本思想是在某一个地点设置一个“圈套” ,当 CPU履行到这个地点的时候停止被调试的程序并中止到调试器中,让调试者进行剖析和调 试,调试者剖析结束后,能够让被调试程序恢复履行。经过设置断点能够暂停程序履行,并能够察看和记录指令信息、变量值、货仓参数和内存数据,还能够深入认识和掌握程序履行的内部原理和详尽过程,断点关于软件调试拥有重要的意义和作用。 断点能够分为软件断点、硬件断点和内存断点三大类。 1)软件断点 软件断点是一个单字节指令( INT 3 ,字节码为 0xCC),能够在程序中设置多个软件断54 / 57 《Python程序设计》练习习题及答案 点,使得程序履行到该处时能够暂停履行,并将控制权转移给调试器的断点办理函数。 当调试器被见告在目标地点设置一个断点,它第一读取目标地点的第一个字节的操作 码,而后保存起来,同时把地点储存在内部的中止列表中。接着,调试器把一个字节操作 码 “ 0xCC” 写入方才的地点。当 CPU 履行到“ 0xCC”操作码的时候就会触发一个 “ INT 3”中止事件,此时调试器就能捕获到这个事件。调试器持续判断这个发生中止事件的地点 ( 经过指令指针存放器 EIP) 是不是自己先前设置断点的地点。 假如在调试器内部的断点列表 中找到了这个地点,就将设置断点前储存起来的操作码写回到目标地点,这样进度被调试 器恢复后就能正常的履行。 2)硬件断点 硬件断点经过调试存放器实现,设置在 CPU级别上,当需要调试某个指定地区而又无 法改正该地区时,硬件断点特别实用。 一个 CPU一般会有 8 个调试存放器 (DR0 存放器到 DR7存放器),用于管理硬件断点。 此中调试存放器 DR0到调试存放器 DR3储存硬件断点地点,同一时间内最多只好设置 4 个硬件断点; DR4和 DR5保存, DR6是状态存放器,说明被断点触发的调试事件的种类; DR7 实质上是一个硬件断点的开关存放器,同时也储存了断点的不一样种类。经过在 DR7存放器 里设置不一样标记,能够创立以下几种断点:当特定的地点上有指令履行的时候中止、当特定的地点上有数据写入的时候、当特定的地点上有数据读或许写但不履行的时候。 硬件断点使用“ INT 1”实现,该中止负责硬件中止和步进事件。步进是指依据预约的 流程一条一条地履行指令,每履行完一条指令后暂停下来,进而能够精准地察看重点代码 并监督存放器和内存数据的变化。在 CPU每次履行代码以前,都会先确认目前将要履行代 码的地点是不是硬件断点的地点,同时也要确认能否有代码要接见被设置了硬件断点的内 存地区。假如任何储藏在 DR0-DR3中的地点所指向的地区被接见了,就会触发 “ INT 1 ” 中止,同时暂停 CPU;假如不是中止地点则 CPU履行该行代码,到下一行代码时, CPU持续 55 / 57 《Python程序设计》练习习题及答案 重复上边的过程。 3)内存断点 内存断点是经过改正内存中指定块或页的接见权限来实现的。经过将指定内存块或页的接见权限属性设置为受保护的,则任何不切合接见权限拘束的操作都将失败,并抛出异样,致使 CPU暂停履行,使得调试器能够查察目前履行状态。 一般来说,每个内存块或页的接见权限都由三种不一样的接见权限构成:能否可履行、 能否可读、能否可写。每个操作系统都供给了用来查问和改正内存页接见权限的函数,在 Windows 操作系统中能够使用 VirtualProtect() 函数来改正主调进度虚构地点空间中已提 交页面的保护属性,使用 VirtualProtectEx() 函数能够改正其余进度虚构地点空间页面的 保护属性。 运转本章 节中的代码并查察运转结果。 答:略。 56 / 57 《Python程序设计》练习习题及答案 第 17 章 科学计算与可视化 运转本章所有代码并查察运转结果。 答:略。 使用 Python 内置函数 dir() 查察 scipy 模块中的对象与方法,并使用 Python 内 置函数 help() 答:略。 查察其使用说明。 57 / 57 因篇幅问题不能全部显示,请点此查看更多更全内容This is a header
'
'