经济学本科生一枚,之前学了py很多遍,但是缺乏练习,痛定思痛全网找题目练习,初步目标是广+泛的了解各种package的功能,以便后续研究中遇到python知道该学习哪个包的具体用法。发在这里一来给后续学习者参考,二来我一直学的不深,写的代码比较冗余,欢迎大家指教~
1、输出国际象棋棋盘
#要求输出国际象棋棋盘
import turtle as t
t.speed(0.5)
#画了奇数行的格子
for j in range(4):
for i in range(4):
t.penup()
t.goto(-240+120*i,240-120*j)
t.pendown()
t.begin_fill()
#画一个
for n in range(4):
t.forward(60)
t.right(90)
t.end_fill()
#画了偶数行的格子
for j in range(4):
for i in range(4):
t.penup()
t.goto(-180+120*i,180-120*j)
t.pendown()
t.begin_fill()
#画一个
for n in range(4):
t.forward(60)
t.right(90)
t.end_fill()
#画外框
t.penup()
t.goto(-240,240)
t.pendown()
for m in range(4):
t.forward(480)
t.right(90)
2、打印楼梯,同时在楼梯上方打印两个笑脸。
#打印楼梯,同时在楼梯上方打印两个笑脸。
import turtle as t
#从画布底部中间开始绘制楼梯
t.penup()
t.goto(0,-240)
t.pendown()
#绘制4阶楼梯到达页面右侧中间
for i in range(4):
t.left(90)
t.forward(60)
t.right(90)
t.forward(90)
#画一个笑脸
#t.circle(x,y)中x可以控制圆弧的大小,具体是正圆的半径,y可以控制圆弧画多少,eg.y=90,则画了1/4个圆
for i in range(2):
#笑脸的脸
t.penup()
t.goto(60+120*i,-110+120*i)
t.pendown()
t.circle(30)
#笑脸的嘴
t.penup()
t.goto(40+120*i,-80+120*i)
t.pendown()
t.right(90)
t.circle(20,180)
#left eye
t.penup()
t.goto(55+120*i,-65+120*i)
t.pendown()
t.circle(5,180)
#right eye
t.penup()
t.goto(75+120*i,-65+120*i)
t.pendown()
t.right(180)
t.circle(5,180)
t.left(90)
3、有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#古典问题:有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月
#后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
#写几个月可以发现,从第三个月开始,每个月的兔子对数是前两个月的加总
month=input('input a month and I will tell you how many rabbits there will be each month:')
month=int(month)
if month==1 or month==2:
print('there are 2 rabbits')
else:
a=1
b=1
result=0
for i in range(3,month+1):#按照对数计算
result=a+b
a=b
b=result
print('there are %d rabbits'%(result*2))#输出的结果按照只计算
4、判断101-200之间有多少个素数,并输出所有素数。
#判断101-200之间有多少个素数,并输出所有素数。
counts=0
sushu=[]
for i in range(101,201):
for j in range(2,i):
if i%j==0:
break
else:
counts+=1
sushu.append(i)
print(counts)
print(sushu)
5、将一个正整数分解质因数。例如:输入90,打印出90=233*5。
#将一个正整数分解质因数。例如:输入90,打印出90=2*3*3*5。
a=int(input("input an int(<100):"))
s=a
yinzi=[]
while a>1:
for i in range(2,a+1):
if a%i==0:#看可否被i整除
yinzi.append(i)
a = int(a / i)
break#break退出当前循环,其后面的语句不会被执行
#这里break所在的直接循环为for,所以如果没有break,
# 以144为例,i会依次取2,3,4...,a会依次取45,15,3
#for循环输出的是a=int(a/i),所以每次a都在变(每次break后a也一直在变)
#break退出for循环,但是由于a>1依然成立,所以会重复外循环(while),i重新从2开始取值
print(s,'=','*'.join(str(k) for k in yinzi))
6、一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
#一球从100米高度自由落下,每次落地后反跳回原高度的一半;再落下,求它在 第10次落地时,共经过多少米?第10次反弹多高?
results=0
a=100
for i in range(10):#i从0-9
#第i+1次上下中向下单程a/(2**i)
results=results+2*a/(2**i)
#第1次没有向上100,所以不应该*2,第10次落地总距离没有向上的过程,所以不应该*2
#第10次上下中向下单程a/(2**9)
results=results-100-a/(2**9)
print('经过的总路程为:','%.5f'%results)
a10=a/(2**9)
print('第10次反弹高度为:','%.5f'%a10)
7、猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#猴子吃桃问题:猴子第一天摘下若干个桃子,当即吃了一半,还不瘾,又多吃了一个,第二天早上又将剩下的桃子吃掉一半,又多吃了一个。以后每天早上都吃了前一天剩下 的一半零一个。到第10天早上想再吃时,见只剩下一个桃子了。求第一天共摘了多少。
#第10天余1个,第9天余4个,第8天余10个
#每一天余的是后一天+1的两倍
#倒推
n=1
for i in range(9):#总共10天,但是第10天的n已经设定为1,所以迭代9天即可
n=(n+1)*2
print(n)
8、两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
三队赛手的名单。
这道题最后输出的结果是“小明、小红、小亮的对手分别是x,z,y"这种形式,可以看做遍历其中一个球队,然后另一个球队为条件,不满足条件则往下遍历。
#两个乒乓球队进行比赛,各出三人。甲队为a,b,c三人,乙队为x,y,z三人。已抽签决定比赛名单。有人向队员打听比赛的名单。a说他不和x比,c说他不和x,z比,请编程序找出
三队赛手的名单。
yi=['x','y','z']
#a取x时候,b取yz中某一个(避免重复参赛b也对战x),c取xyz中和ab都不一样的,而且a不可对x,c不可对x和z,这样遍历yi直到最后两个a和c的条件都满足时输出abc则分别对应小a小b小c的对手
for a in yi:
for b in yi:
if b!=a:
for c in yi:
if c!=a and c!=b:
if a!='x'and c!='x' and c!='z':
print('a,b,c的对手分别是%s,%s,%s'%(a,b,c))
9、打印出一个1357的菱形
#打印出一个1357的菱形
for i in range(1,8,2):
space=int((7-i)/2)
print(space*' ',i*'*',space*' ')
for j in range(5,0,-2):
space = int((7 - j) / 2)
print(space * ' ', j * '*', space * ' ')
```
10、有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
```python
#有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁。问第4个人岁数,他说比第3个人大2岁。问第三个人,又说比第2人大两岁。问第2个人,说比第一个人大两岁。最后问第一个人,他说是10岁。请问第五个人多大?
a=10
for i in range(4):
a=a+2
print(a)
11、给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
这里我意识到最好定义成函数,方便以后调用(which to me, is unlikely to happen frequently,but just practice)
#给一个不多于5位的正整数,要求:一、求它是几位数,二、逆序打印出各位数字。
def summary(a):
print(len(str(a)))
def rev(a,l):
alist=[int(x) for x in str(a)]
if l==1:
print(alist[0])
else:
print(alist[l-1])
rev(a,l-1)
summary(4627)
rev(4627,4)
12、一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
#一个5位数,判断它是不是回文数。即12321是回文数,个位与万位相同,十位与千位相同。
def huiwen(a):
alist=[int(x) for x in str(a)]
if alist[0]==alist[-1] and alist[1]==alist[-2]:
print('%d是回文数'%a)
else:
print('%d不是回文数'%a)
huiwen(23732)
13、请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#请输入星期几的第一个字母来判断一下是星期几,如果第一个字母一样,则继续判断第二个字母。
#monday, tuesday, wednesday, thursday, friday, saturday, sunday
#大小写不区分,全部转化为小写比较
#麻烦但好想的方法
def weekday(a):
alist=[x.lower() for x in a]
if alist[0]=='m':
print('monday')
elif alist[0]=='f':
print('friday')
elif alist[0]=='w':
print('wednesday')
elif alist[0]=='t':
if alist[1]=='u':
print('tuesday')
else:
print('thursday')
else:
if alist[1]=='a':
print('saturday')
else:
print('sunday')
weekday('Tuesday')
#略难但简洁的方法,两个strlist逐个字母比较
weekdays=['monday',"tuesday", "wednesday", "thursday", "friday", "saturday", "sunday"]
def panduan(a):
alist = [y.lower() for y in a]
for weekday in weekdays:
daylist=[x.lower() for x in weekday]
if alist[0]== daylist[0]:
if alist[1]==daylist[1]:
print(weekday)
panduan('thursday')
14、对10个数进行排序
#对10个数进行排序
def sort(alist):
print(sorted(alist))
sort([1,53,17,6,9,12,64])
15、求一个3*3矩阵对角线元素之和
#求一个3*3矩阵对角线元素之和
def ogono(a,b,c):
for i in range(3):
for j in range(3):
for z in range(3):
if i==j==z:
r=a[i]+b[j]+c[z]
print(r)
ogono([1,4,7],[6,12,9],[4,0,8])
16、有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中
#有一个已经排好序的数组。现输入一个数,要求按原来的规律将它插入数组中。
a=[2,6,9,13,24,11]
a=sorted(a)
a2=[]
def rearr(x):
for i in range(len(a)):
if a[i]>=x and x not in a2:
a2.append(x)
a2.append(a[i])
else:
a2.append(a[i])
print(a2)
rearr(10)
17、输入3个数a,b,c,按大小顺序输出
#输入3个数a,b,c,按大小顺序输出
#从小到大
a=int(input('a:'))
b=int(input('b:'))
c=int(input('c:'))
if a>b:
x=a
a=b
b=x
if b>c:
y=b
b=c
c=y
print(a,b,c)#输出是这样,但是里面的数不再是原来初始输入的abc了
18、输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
#输入数组,最大的与第一个元素交换,最小的与最后一个元素交换,输出数组
nums=input('输入一个数组空格分开:')
list=nums.split(' ')
list2=[int(x) for x in list]
l=len(list2)
for i in range(l):
if list2[i]>list2[0]:
x=list2[0]
list2[0]=list2[i]
list2[i]=x
for j in range(l):
if list2[j]<list2[l-1]:
y=list2[l-1]
list2[l-1]=list2[j]
list2[j]=y
print(list2)
19、有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
#有n个整数,使其前面各数顺序向后移m个位置,最后m个数变成最前面的m个数
def changepos(n,m):
i=0
lists=[]
list1=[]
minus = abs(n - m)
for i in range(n):
a=int(input('输入第%d个数:'%i))
lists.append(a)
i+=1
#如果m=n
if m==n:
print(lists)
#如果m<n,n=5,m=3,[2,46,17,8,23]则会变成[17,8,23,2,46]
elif m<n:
#挑选出要挪走的数形成列表
for j in range(minus):
list1.append(lists[j])
#原始列表和要挪走的拼接到一起
list3=lists+list1
#drop掉前minus个数字
del list3[0:minus]
print(list3)
#如果m>n,n=5,m=8,[2,46,17,8,23]则会变成同n=5,m=3一样,所以只要将minus赋值给m即可
else:
m=minus
for j in range(minus):
list1.append(lists[j])
# 原始列表和要挪走的拼接到一起
list3 = lists + list1
# drop掉前minus个数字
del list3[0:minus]
print(list3)
changepos(5,8)
20、编写一个函数,输入n为偶数时,调用函数求1/2+1/4+…+1/n,当输入n为奇数时,调用函数1/1+1/3+…+1/(n-1)
#编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数1/1+1/3+...+1/(n-1)
def genf(n,r):
if n%2==0:#偶数
for i in range(2,n+1,2):
r=r+1/i
print(r)
else:#奇数
for i in range(1,n,2):
r=r+1/i
print(r)
genf(97,0)
21、电话加密
#某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:每位数字都加上5,然后用和除以10的余数代替该数字,再将第一位和第四位交换,第二位和第三位交换
def swap(listn,n1,n2):#n1和n2为python的index(从0起数)
x=listn[n1]
listn[n1]=listn[n2]
listn[n2]=x
return(listn)
def encode_tel(t):#t is a str
tele=[int(x) for x in t]
tele2=[(y+5)%10 for y in tele]
swap(tele2,0,3)
swap(tele2,1,2)
nums=0
for i in range(4):
nums=nums+tele2[i]*(10**(3-i))
print(nums)
encode_tel('9528')
哈哈最后发现其实这个链接里的题目没有到100题,所以就此完结啦,下一篇会是有关text analytics的~