Python核心编程第二版 第八章课后答案
注:我使用的python3.5。 其中range和xrange,input和raw_input已经合并
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 = int(input('from=')) t = int(input('to=')) i = int(input('increment=')) while f <= t-i: f = f + i print(f)
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.
略
8-5.约数。完成一个名为getfactors()的函数。它接受一个整型作为参数,返回它所有约数的列表,包括1和它本身
def getfactors(num): l = [] for i in range(1,num+1): if num%i == 0: l.append(i) return l
8-6.素因子分解。以刚才练习中的isprime()和getfactors()函数为基础编写一个函数,它接受一个整型作为参数,返回该整型所有素数因子的列表。这个过程叫做求素因子分解,它输出的所有因子之积应该是原来的数字。注意列表里可能有重复的元素。例如输入20,返回的结果应该是[2,2,5]。
略
8-7.完全数。完全数被定义为这样的数字:它的约数(不包括它自己)之和为它本身。例如:6的约数是1,2,3,因为1+2+3=6,所以6被认为是一个完全数。编写一个名为isperfect()的函数,它接受一个整形作为参数,如果这个数字是完全数,返回1:否者返回0。
def getfactors(num): l = [] for i in range(1,num+1): if num%i == 0: l.append(i) return l def isperfect(num): l = getfactors(num) ele =0 for i in l[:-1]: ele = ele + i print(ele) if ele == num: return 1 else: return 0
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): ele = 1 for i in range(1,num+1): ele = ele * i return ele
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 range(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%])你认为它的原因是什么?