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,无疑效率会变得更低?
#更容易理解的是1
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=''