经济学本科生一枚,之前学了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的~