您的位置:首页 > 编程语言 > Python开发

python核心编程(第二版)参考答案(自制)--第八章·条件和循环

2014-08-17 17:00 441 查看
###最近自学python,使用的教材是python核心编程(第二版)。自己做了练习题的答案,不管正确与否,算是给自己的一种约束和督促吧。

--------------------------------------------------------

8-1.*条件语句。请看下面的代码:

# statement A

if x > 0:

    # statement B

    pass

elif x < 0:

    # statement C

    pass

else:

    # statement D

    pass

# statement E

(a)如果x<0,上面哪个语句(A,B,C,D,E)将被执行?

(b)如果x=0,上面哪个语句将被执行?

(c)如果x>0,上面哪个语句将被执行?

【答】:(a)ACE,(b)ADE,(c)ABE

--------------------------------------------------------

8-2.*循环。编写一个程序,让用户输入3个数字:(f)rom,(t)o和(i)ncrement。以i为步长,从f计数到t,包括f和t。例如,如果输入的是f = 2,t = 26,i =4,程序将输出2,6,10,14,18,22,26。

f = raw_input("Please input start number ... ")
t = raw_input("Please input end number ... ")
i = raw_input("please input step number ... ")
for x in xrange(int(f),int(t)+1,int(i)):
print x,


--------------------------------------------------------

8-3.*range()。如果我们需要生成下面的这些列表,分别需要在range()内建函数中提供那些参数?

(a)[0,1,2,3,4,5,6,7,8,9]

(b)[3,6,9,12,15,18]

(c)[-20,200,420,640,860]

答:range(10)

range(3,19,3)

range(-20,861,220)

--------------------------------------------------------

8-4.*素数。我们在本章已经给出了一些代码来确定一个数字的最大约数或者它是否是一个素数。请把相关代码转换为一个返回布尔值的函数,函数名为isprime()。如果输入的是一个素数,那么返回True,否者返回False.

def isprime(num):
if num==1:return False
count=num/2
while count>1:
if num%count==0:
return False
count-=1
else:
return True

for eachNum in xrange(1,15):
print eachNum,str(isprime(eachNum))


--------------------------------------------------------

8-5.*约数。完成一个名为getfactors()的函数。它接受一个整型作为参数,返回它所有约数的列表,包括1和它本身。

def getfactors(num):
count=num/2
Factor_list=[]
# while count>1:
# if num%count==0:
#     Factor_list.append(count)
# count-=1
Factor_list=[x for x in range(2,count+1) if num%x==0]
if num==1:Factor_list.append(1)
else:Factor_list.extend([1,num])
Factor_list.sort()
return Factor_list

for eachNum in xrange(1,15):
print eachNum,getfactors(eachNum)


--------------------------------------------------------

8-6.*素因子分解。以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受一个整型作为参数,返回该整型所有素数因子的列表。这个过程叫做求素因子分解,它输出的所有因子之积应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回的结果应该是[2,2,5]。

def isprime(num):
if num==1:return False
count=num/2
while count>1:
if num%count==0:
return False
count-=1
else:
return True

def getfactors(num):
count=num/2
Factor_list=[]
while count>1:
if isprime(count) and num%count==0:
Factor_list.append(count)
num=num/count
count=num/2
else:
count-=1
if num==1:Factor_list.append(1)
else:Factor_list.append(num)
Factor_list.sort()
return Factor_list

for eachNum in xrange(1,26):
print eachNum,getfactors(eachNum)


【注】:不修改getfacors()函数,而是用递归方法也可以结局这个问题

--------------------------------------------------------

8-7.*完全数。完全数被定义为这样的数字:它的约数(不包括它自己)之和为它本身。例如:6的约数是1,2,3,因为1+2+3=6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,它接受一个整形作为参数,如果这个数字是完全数,返回1:否者返回0。

def getfactors(num):
count=num/2
Factor_list=[]
while count>1:
if num%count==0:
Factor_list.append(count)
# num=num/count
# count=num/2
count-=1
if num==1:Factor_list.append(1)
else:Factor_list.extend([1,num])
Factor_list.sort()
print num,Factor_list,
return Factor_list
def isperfect(num):
Factor_list=getfactors(num)
Factor_list.remove(num)
if nu
ad96
m==sum(Factor_list):
print "%s is perfect number!"%num
return 1
else:
print "%s NO!"%num
return 0

for eachNum in xrange(1,26):
eachNum,isperfect(eachNum)


--------------------------------------------------------

8-8.*阶乘。一个数的阶乘被定义为从1到该数字所有数字的乘积。N的阶层简写为N!。N! = factorial(N) = 1*2*3* ... *(N-2)*(N-1)*N。所以4! = 1*2*3*4。写一个函数,指定N,返回N!的值。

def factorial(num):
if num==0:
return 1
else:
return num*factorial(num-1)

for eachNum in xrange(1,10):
print eachNum,factorial(eachNum)


--------------------------------------------------------

8-9.*斐波那契数列。斐波那契数列形如1,1,2,3,5,8,13,21等等。也就是说,下一个值是序列中前两个值之和。写一个函数,给定N,返回第N个斐波那契数数字。例如,第1个斐波那契数字是1,第6个是8。

def Fibonacci(num):
if num in [1,2]:
return 1
else:
return Fibonacci(num-1)+Fibonacci(num-2)

for eachNum in xrange(1,10):
print eachNum,Fibonacci(eachNum)


--------------------------------------------------------

8-10.*文本处理。统计一句话中元音,辅音以及单词(以空格分割)的个数。忽略元音和辅音的特殊情况,如“h”,“y”,“qu”等。附加题:编写处理这些特殊情况的代码。

【注】:没明白题目具体要求,以后补

--------------------------------------------------------

8-11.*文本处理。要求输入一个姓名列表,输入格式是“Last Name, First Name”即姓逗号名。编写程序处理输入,如果用户输入错误,比如“Last Name First Name,”,请纠正这些错误,并通知用户。同时你还需要记录输入错误次数。当用户输入结束后,给列表排序,然后以“姓,名”的顺序显示。

name_list=[]
def show_list():
print "The sorted list (by last name) is:"
for x in sorted(name_list):
print "%s, %s"%(x[0],x[1])
def show_error(error_time):
print """Wrong format...should be Last, First.
You have done this %d time(s) already.Fixing input...""" %error_time
def input_name():
number=raw_input("Enter total number of names:")
count_E=0
for x in xrange(int(number)):
new_name=raw_input("Please enter name %s:"%x).strip().split(',')
if (len(new_name)==1):
new_name=new_name[0].split(' ')[::-1]
count_E+=1
show_error(count_E)
name_list.append(new_name)
show_list()

if __name__=='__main__':
input_name()


--------------------------------------------------------

8-12.*(整型)位操作。编写一个程序,用户给出起始和结束数字后给出一个下面这样的表格,分别显示出两个数字间所有整型的十进制,二进制,八进制和十六进制表示。如果字符是可打印的ASCII字符,也要把它打印出来,如果没有一个是可打印字符,就省略掉ASCII那一栏的表头。

def print_string(begin_num,end_num):
begin_num=min(begin_num,end_num)
end_num=max(begin_num,end_num)
if begin_num>127 or end_num<33:
print "DEC\t\tBIN\t\tOCT\t\tHEX"
print "-"*30
else:
print "DEC\t\tBIN\t\tOCT\t\tHEX\t\tASCII"
print "-"*40
for x in xrange(begin_num,end_num+1):
if 32<x<127:
print "%-8d%-8d%-8o%-8x%-8c"%(x,int(bin(x)[2:]),x,x,x)
else:
print "%-8d%-8d%-8o%-8x"%(x,int(bin(x)[2:]),x,x)
print_string(27,41)


--------------------------------------------------------

8-12.*程序执行性能。在8.6.2节里,我们介绍了两种基本的迭代序列方法:(1)通过序列项,以及(2)通过序列索引遍历。该小节的末尾我们指出后一种方法在序列很长的时候性能不佳(在我的系统下,性能相差了将近两倍[83%])你认为它的原因是什么?
【答】:
对于直接迭代,迭代完成只需要遍历一次序列即可,每个元素都指向下一个元素。完成遍历的过程为:e0->e1->e2->e3....
而对于索引迭代,每次获得一个元素都需要从头迭代,所以完成迭代的过程为:e0, e0->e1, e0->e1->e2, e0->e1->e2-e3....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐