Python经典编程30例所有代码均在python3.7环境下调试通过,为了防止排版原因导致不能正常运行,提供了正常运行情况下的代码截图。1、编写程序,求1~n之间的素数列表defsushu(x):i=0foriinrange(2,x):ifx%i==0:returnFalsebreakifi+1==x:returnTruereturnFalsen=int(input(请输入n:))forjinrange(2,n):ifsushu(j)==True:print(j,是素数)2、编写程序,生成一个包括100个随机整数的列表,然后从后向前删除所有素数importrandomdefsushu(x):i=0foriinrange(2,x):ifx%i==0:returnFalsebreakifi+1==x:returnTruereturnFalses=[]i=0foriinrange(0,30):s.append(random.randint(1,10000))foriinrange(0,30):print(s[i],,end='')ifi%10==0:print(\n)print(\n)print(T列表)t=[]forjinrange(29,0,-1):ifsushu(s[j])==False:t.append(s[j])foriinrange(0,len(t)-1):print(t[i],,end='')ifi%10==0:print(\n)3、编写程序,当用户从键盘输入整数后,对其进行因式分解(即素数的积)。如100=2*2*5*5n=int(input(请输入待分解的整数n=?))x=1flag=Trueifn1000:#判断大于1000的数print(请输入不超过1000的整数)ifn1andn=1000:print({}=.format(n),end='')whilen!=1:x+=1whilen%x==0:n/=xifflag:flag=Falseprint(x,end='')else:print(*{}.format(x),end='')elifn==1:print(1=1)elifn==0:print(0=0)4、编写程序,验证100以内整数的哥德巴赫的猜想:任何一个充分大的偶数(大于等于6)总可以表示成两个素数之和。如10=5+5,12=5+7defisprime(x):ifx==2:returnTrueifx%2==0:returnFalsen=3whilen*n=x:ifx%n==0:returnFalsen+=2returnTruedefgedb(x):ifx4orx%2!=0:print(输入的数据不正确,应该是大于或等于4的偶数)returnifx==4:print('4=2+2')returnforninrange(3,x,2):ifisprime(n)andisprime(x-n):print(x,'=',n,'+',x-n)returndefmain():x=int(input(输入大于或等于4的偶数))gedb(x)main()5、编写程序,输出所有由1、2、3、4这4个数字组成的素数,并且在每个素数中每个数字只使用一次。defisprime(x):ifx==2:returnTrueifx%2==0:returnFalsen=3whilen*n=x:ifx%n==0:returnFalsen+=2returnTruedefexercise3_5():s=0foriinrange(1,5):forjinrange(1,5):forkinrange(1,5):forlinrange(1,5):if(i!=j)and(i!=k)and(i!=l)and(j!=k)and(j!=l)and(k!=l):s=i*1000+j*100+k*10+lifisprime(s)==True:print(s)exercise3_5()6、编写程序,求所有水仙花数。水仙花数是指一个三位数,其个位、十位、百位3个数字的立方和等于这个数本身。并断定有没有四位数的水仙花数?t=0s=0#统计水仙花数的个数foriinrange(100,1000):j=int(i/100)k=int((i-100*j)/10)l=i-j*100-k*10ifi==j*j*j+k*k*k+l*l*l:print(i)s+=1print(s)foriinrange(1000,10000):j=int(i/1000)k=int((i-1000*j)/100)l=int((i-j*1000-k*100)/10)m=i-1000*j-100*k-10*lifi==j*j*j+k*k*k+l*l*l+m*m*m:t+=1print(i)ift==0:print(Nosuchnumber)7、编写程序,生成一个包含100个随机数的列表,然后运用切片方法对其中偶数下标的元素进行降序排列,奇数下标的元素不变。解法一:importrandomlist_1=[]#生成随机整数列表foriinrange(20):list_1.append(random.randint(0,100))print('生成的列表为:',list_1)#从首位开始索引下标为偶数位元素foriinrange(0,len(list_1),2):#从上一个偶数位的下一个偶数位元素开始索引foruinrange((i+2),len(list_1),2):#防止索引超出范围ifilen(list_1)-2:#比较索引元素大小iflist_1[i]=list_1[u]:#互换元素位置list_t=list_1[i]list_1[i]=list_1[u]list_1[u]=list_tprint('排序后列表为:',list_1)解法2:importrandomrandom.seed()lst=[random.randint(0,101)foriinrange(20)]print(lst)defbubble_sort(lst):n=len(lst)foriinrange(n//2):forjinrange(0,n-i-2,2):iflst[j]lst[j+2]:lst[j],lst[j+2]=lst[j+2],lst[j]bubble_sort(lst)print(lst)8、编写程序,输入行数,输出一个如下图所示的由“*”构成的等腰三角形(提示:用setw()函数)。foriinrange(6):forkinrange(5-i):print(,end=)forjinrange(2*i+1):print(*,end=)print()9、编写程序,A、B、C、D、E共5人夜里去捕鱼,很晚才各自找地方休息。日上三竿,A第1个醒来,他将鱼均分成5份,把多余的一条扔掉,拿走自己的一份。B第2个醒来,他也将鱼均分成5份,将多余的1条扔掉,拿走自己的一份。C、D、E如此类推。问他们合伙至少捕了多少条鱼?解法一设总共捕了x条鱼,每个人看到的鱼共有Xn条,则:X1=xX2=(X1-1)/5*4X3=(X2-1)/5*4X4=(X3-1)/5*4X5=(X4-1)/5*4其中,(Xn-1)%5=0必定成立,即题中所提到的,扔掉一条,取五分之一。那么就有x,使得递推所得到的项满足(Xn-1)%5=0即可。deffish(n,x):if(x-1)%5==0:ifn==1:return1else:returnfish(n-1,(x-1)/5*4)return0x=6whileTrue:x+=5iffish(5,x)==1:print(x)breakforiinrange(1,6):print(第{0}人看到的鱼有{1}条.format(i,x))x=int((x-1)/5*4)解法二反向递推法:解决E和D的问题(规模为2),就可以解决D和C的问题,也就是E、D、C的问题(规模为3),最后解决所有问题。由X(n+1)=(Xn-1)/5*4得,Xn=X(n+1)*5/4+1fish=[0,0,0,0,1]i=0whileTrue:fish[4]+=5foriinrange(3,-2,-1):iffish[i+1]%4!=0:breakfish[i]=int(fish[i+1]*5/4+1)iffish[i]%5!=1:breakifi==-1:breakprint(总共捕了,fish[0],条鱼)foriinrange(0,5):print(第{0}人看到{1}条鱼.format(i+1,fish[i]))10、编写程序,计算斐波拉契数列的后项与前项的比:1/1,2/1,3/2,5/3,8/5,13/8,......第n项的值,并观察随着n的增加,比值趋向什么值?deffblq(x):ifx==1orx==2:return1else:returnfblq(x-1)+fblq(x-2)forkinrange(1,30):print(fblq(k+1)/fblq(k))11、编写程序,计算卢卡斯数列的后项与前项的比:1/2,3/1,4/3,7/4,11/7,18/11,......第n项的值,并观察随着n的增加,比值趋向什么值?卢卡斯数列的定义为:L(1)=2,L(2)=1,L(n)=L(n-1)+L(n-2)(n=2),前9个数为:2、1、3、4、7、11、18、29、47defLKS(x):ifx==1:return2elifx==2:return1else:returnLKS(x-1)+LKS(x-2)forkinrange(1,30):print(LKS(k+1),/,LKS(k),=,LKS(k+1)/LKS(k))12、编写函数,用于判断输入的字符串是否由字母和数字构成,并统计字符个数。解法一importstringdefchartype(ch):字符类型判断ifchinstring.ascii_letters:return'ascii_letters'elifchinstring.digits:return'digits'elifchinstring.whitespace:return'whitespace'else:return'other'defchtypecount(s):字符串类型计数器counter={}forctinmap(chartype,s):counter.setdefault(ct,0)counter[ct]+=1returncounterforchtype,cntsinchtypecount(input(Enterastring:)).items():print(chtype,cnts)解法二sum_d=0sum_alpha=0sum_other=0sum_chinese=0#s=123abcdef中klGD国abcde伟大s=input(请输入字符串:)foriinrange(0,len(s)):if'0'=s[i]='9':sum_d+=1elif'a'=s[i]='z':sum_alpha+=1elif'\u4e00'=s[i]='\u9fff':sum_chinese+=1else:sum_other+=1print(数字:,sum_d,个)print(字母:,sum_alpha,个)print(其他符号:,sum_other,个)print(汉字:,sum_chinese,个)13、编写程序,计算字符串中单词的个数。str=input(请您输入一串字符串:)str1=str.strip()#去掉字符串前后空格index=0count=0whileindexlen(str1):whilestr1[index]!=:#当不是空格是,下标加1index+=1ifindex==len(str1):#当下标大小跟字符串长度一样时结束当前循环breakcount+=1#遇到空格加1ifindex==len(str1):#当下标大小跟字符串长度一样时