当前位置:文档之家› PYTHON核心编程第二版课后题答案第八章

PYTHON核心编程第二版课后题答案第八章

PYTHON核心编程第二版课后题答案第八章
PYTHON核心编程第二版课后题答案第八章

def loop(f,t,i):

'''8-2输入3个数字,从f计数到t,i为步长'''

for n in xrange(f,t+1,i):

print n,

def isprime(num):

'''8-4输入数字,返回是否是素数'''

#素数表示只能被1和本身整除的数,所以在count>1的情况下如果都无法除尽,那么就是素数

#count为什么要num/2呢?

#因为2是最小的偶数,获得的值就是num的最大可能被除的数,

#num不可能被一个比2更小的整数除,

#因为如果是1,那么就反应不出(素数也可以被1整除),而如果大于2则是无不能确定,如果是3,而输入是4,无疑效率会变得更低?

#更容易理解的是1num/2的时候是不可能被除尽的,这些循环是多余的

count=num/2

while count>1:

if num%count==0:

return False

count-=1

return True

def getfactors(num,addself=True):

'''8-5返回数所有的约数,包括1和它本身'''

#addself表示,约数中是否包含它本身

count=num/2

factors=[]

if addself:factors=[num]

while count:

if not num%count:

factors.append(count),

count-=1

return factors

def primesplit(num):

'''8-6素因子分解'''

#所谓素因子分解就是将num分解成几个素数相乘

#我们要求的就是哪几个素数乘积为num,显示这几个素数

#比如num=20返回[2,2,5]

#分析首先,如果输入的num是素数,那么返回的就是1和它本身

#如果不是素数,那么获得他的约数,约数中2肯定是有的,关键是几个2的问题咯?

#这里会用到上面的isprime和getfactors函数

re=[]

if isprime(num):re=[1,num]

else:

#素数一定是从2开始的

prime=2

count=num/2

#素数一定是小于num/2的

while prime

if num%prime==0:

num/=prime

re.append(prime)

continue

prime+=1

return re

def isperfect(num):

'''8-7全数就是他的约数之和为它本身,比如6的约数是1,2,31+2+3=6'''

if isprime(num):return0

else:

if sum(getfactors(num,False))==num:return1

return0

def factorial(num,step=1):

'''8-8阶乘'''

#阶乘就是返回num!就是1到num所有数的乘积,例如6!1*2*3*4*5*6

#add表示的是阶层的步进,默认是1

#0的阶乘是1

#负数没有阶乘

#小数没有阶乘

if not float(num).is_integer():return False

if num<0:return False

if num==0or num==1:return1

else:

re=1

for i in xrange(1,num+1,step):

re*=i

return re

def fibonacci(num):

'''8-9fibonacci数列,给定num返回第num个的值'''

#fibonacci数列形如1,1,2,3,5,8,13,21

#也就是说下一个值是数列前2个和

if num<1or int(num)!=num:return False

if num==1:return1#第一个其实是没规律的,只返回一个1,从第二个开始就是0+1,1+1...

#分析:

#第0个是0

#第1个是1

#第二个是1+01

#第三个是1+12

#第四个是2+13

#第五个是2+355=3+2

#从这样看,其实第2个,应该是第三个,因为第0个也是一个

#我在这里是这样分析的,既然要求第N个,我们知道N是N-1和N-2的和,那么我们需要在运行中保存

#N-1和N-2这两个临时变量N-2我设为N1,N-1我设为N2

re=0#第0位是0

for i in xrange(num-1):

if re==0:N1,N2=0,1

re=N1+N2

N1,N2=N2,re

return re

def counteng(string):

'''8-10统计一下一句话中元音,辅音,和单词的个数,忽略元音和辅音等特殊情况''' #所谓特殊情况就是某些单词用元音开头,但是不发元音,有些单词辅音开头但是发元音

#如果要处理这些特殊单词,那么需要有特殊单词表或者规律,这个我就不做了,不难实现

#思路:匹配单词,如果符合特殊规则或者单词表,那么元音[辅音]数量相应减1或

者加1

#我这里只要处理a,e,i,o,u的个数即可

#所谓单词数,特别是英文中,比较容易,只要用空格分隔就可

words=len(string.split())

string=string.upper()#换成大写,方便一点

yuans=fus=0

#统计元音数

for i in string:

#只处理那啥字母,不处理特殊符号

#大写元音的ord是65,69,73,79,85

#大写字母即ord65-90

n=ord(i)

if n in xrange(65,91):

if n in[65,69,73,79,85]:

yuans+=1

else:

fus+=1

return[yuans,fus,words]

def inname():

'''8-11文本处理,输入英文名格式:Last Name,First name

如果输入的格式是First name LastName(也就是没有逗号)

那么互换位置,提示错误,记录错误数

输入完毕后,显示名字列表

'''

#分析,书中首先要求用户输入要输入名字的数量,这个不自然,我改成输入q则退出

print'输入英文名字,格式如名,姓\n输入q则退出'

names=[]

error=0

while True:

name=raw_input('请输入姓名:').strip().split(',')

if name[0]=='':continue

if len(name)==1:

if name[0].lower()=='q':break

error+=1

print'格式错误...正确应该是名,姓\n你已经错了%d次。修复输入...\n'%error

name=name[0].split()

name=name[1]+','+name[0]

else:

name=name[0].strip()+','+name[1].strip()

names.append(name)

for i in names:

print i

def out():

'''8-12输入整数1,整数2,显示一张表格,包括十进制,二进制,八进制,十六进制和ASCII'''

#ASCII中0-32127这34个是控制符,不用输出

#超过127的数字也不用输出,因为没有对应的ASCII

num1=int(raw_input('Enter begin value:').strip())

num2=int(raw_input('Enter end value:').strip())

#这里的dl,bl,ol,hl,al表示每一列的宽度

dl,bl,ol,hl,al=\

len(str(num2))+5,len(bin(num2))+3,len(oct(num2))+4,len(hex(num2))+3,5

#输出标题,居中

print

'DEC'.center(dl),'BIN'.center(bl),'OCT'.center(ol),'HEX'.center(hl),'ASCII'.center(al) #输出横线

print'-'*(sum([dl,bl,ol,hl,al])+5)

ascii=''

for i in xrange(num1,num2+1):

#Ascii只有在这个区间内才显示

if32

print

str(i).center(dl),bin(i)[2:].center(bl),oct(i)[1:].center(ol),hex(i)[2:].center(hl),ascii.center( al)

ascii=''

相关主题
文本预览
相关文档 最新文档