资源描述
《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
1.3 在Python中导入模块中对象有哪几种方式?
答:惯用有三种方式,分别为
l import 模块名 [as 别名]
l from 模块名 import 对象名[ as 别名]
l from math import *
1.4 使用pip命令安装numpy、scipy模块。
答:在命令提示符环境下执行下面命令:
pip install numpy
pip install scipy
1.5 编写程序,顾客输入一种三位以上整数,输出其百位以上数字。例如顾客输入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 编写程序,生成包括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)
2.3 编写程序,顾客输入一种列表和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.4 设计一种字典,并编写程序,顾客输入内容作为键,然后输出字典中相应值,如果顾客输入键不存在,则输出“您输入键不存在!”
答:
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.5 编写程序,生成包括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.6 在Python中,字典和集合都是用一对 大括号 作为定界符,字典每个元素有两某些构成,即 键 和 值 ,其中 键 不容许重复。
2.7 假设有列表a = ['name','age','sex']和b = ['Dong',38,'Male'],请使用一种语句将这两个列表内容转换为字典,并且以列表a中元素为键,以列表b中元素为值,这个语句可以写为 c = dict(zip(a,b))。
2.8 假设有一种列表a,现规定从列表a中每3个元素取1个,并且将取到元素构成新列表b,可以使用语句 b = a[::3]。
2.9 使用列表推导式生成包括10个数字5列表,语句可以写为 [5 for i in range(10)]。
2.10 不可以 (可以、不可以)使用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 编写程序,生成一种包括50个随机整数列表,然后删除其中所有奇数。(提示:从后向前删。)
答:
1)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)
2)Python 2.7.8代码
把上面代码中第三行和最后一行改为print x即可。
34 编写程序,生成一种包括20个随机整数列表,然后对其中偶数下标元素进行降序排列,奇数下标元素不变。(提示:使用切片。)
答:
1)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)
2)Python 2.7.8代码
把上面代码中第三行和最后一行改为print x即可。
35 编写程序,顾客从键盘输入不大于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.6 编写程序,至少使用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.7 编写程序,实现分段函数计算,如下表所示。
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 = pile(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 = pile(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 = pile(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 = pile(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 = pile(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 在Python程序中,局部变量会隐藏同名全局变量吗?请编写代码进行验证。
答案:会。
>>> def demo():
a=3
print a
>>> a=5
>>> demo()
3
>>> a
5
5.5 编写函数,可以接受任意各种整数并输出其中最大值和所有整数之和。
答:这里给出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.6 编写函数,模仿内置函数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.7 编写函数,模仿内置函数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中,如下划线开头变量名有特殊含义,特别是在类定义中。用下划线作为变量前缀和后缀来表达类特殊成员:
l _xxx:这样对象叫做保护变量,不能用'from module import *'导入,只有类对象和子类对象能访问这些变量;
l __xxx__:系统定义特殊成员名字;
l __xxx:类中私有成员,只有类对象自己能访问,子类对象也不能访问到这个成员,但在对象外部可以通过“对象名._类名__xxx”这样特殊方式来访问。Python中没有纯粹C++意义上私有成员。
6.5 与运算符“**”相应特殊办法名为__pow__(),与运算符“//”相应特殊办法名为 __floordiv__() 。
第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'
第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 Excep
展开阅读全文