我做过的Python30道练习题

练习题 1

成绩等级

要求输出成绩等级A、B、C、D、E,
其中90-100分为A,80-89分为B,70-79分为C,60-69分为D,60分以下为E。
要求:
- 用If语句实现;
- 输入百分制成绩后要判断该成绩的合理性,对不合理的成绩应输出出错信息。

成都创新互联自2013年创立以来,先为南宫等服务建站,南宫等地企业,进行企业商务咨询服务。为南宫企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。


参考答案:


while True:
    content = input("请输入成绩:")
    if not content.isdigit():
        print("您输入的成绩格式错误,请输入一个0-100之间的数字。")
        continue
    elif not 0 <= int(content) <= 100:
        print("您输入的成绩格式错误,请输入一个0-100之间的数字。")
        continue
    else:
        break

score = ""
if int(content) < 60:
    score = "E"
elif 60 <= int(content) <= 69:
    score = "D"
elif 70 <= int(content) <= 79:
    score = "C"
elif 80 <= int(content) <= 89:
    score = "B"
else:
    score = "A"
print("您的成绩等级为:%s" % (score,))

练习题 2

预判比赛结果

篮球比赛是高分的比赛,领先优势可能很快被反超。
作为观众,希望能在球赛即将结束时,就提早知道领先是否不可超越。
体育作家Bill James发明了一种算法,用于判断领先是否“安全”。
算法描述:

  • 获取领先的分数 ,减去3分
  • 如果目前是领先队控球,则加0.5;否则减0.5(数字小于0则变成0);
  • 计算平方后的结果;
  • 如果得到的结果比当前比赛剩余时间的秒数大,则领先是“安全”的。

请编写程序实现上述算法的功能,并给出运行结果。


参考答案:


# 方法一:输入两队分数
a = int(input("A队分数:"))  # a队成绩
b = int(input("B队分数:"))  # b队成绩
d = 0
winner = ""
possession = input("球权【a or b】:")  # 球权 “a” or "b"
time_remaining = int(input("剩余时间:"))  # 剩余时间
if a > b:
    winner = "a"
    c = a - b
    if possession == "a":
        d = c - 2.5
    else:
        d = c - 3.5
elif b > a:
    winner = "b"
    c = b - a
    if possession == "b":
        d = c - 2.5
    else:
        d = c - 3.5
else:
    d = 0
if d < 0:
    d = 0
if d ** 2 > time_remaining:
    print("%s队将获得最终胜利!" % (winner,))
else:
    print("比赛结果不确定。")

# 方法二:输入领先分数

a = int(input("领先分数:"))
possession = input("领先队是否控球【y/n】:")
time_remaining = int(input("剩余时间:"))
if possession == 'y':
    b = a + 0.5
else:
    b = a - 0.5
if b < 0:
    b = 0
score = b ** 2
if score > time_remaining:
    print("安全")
else:
    print("不安全")

练习题 3

购物组合

小明单位发了100元的购物卡,
小明到超市买三类洗化用品:
洗发水(15元)、香皂(2元)、牙刷(5元)。要把100元正好花掉,
可有哪些购买组合?


参考答案:


x = range(0, 7)
y = range(0, 51)
z = range(0, 21)
total_list = []
for a in x:
    for b in y:
        for c in z:
            total = 15 * a + 2 * b + 5 * c
            if 100 == total:
                msg = "洗发水:{0}瓶;\n香皂:{1}块;\n牙刷:{2}支;\n".format(a, b, c)
                total_list.append(msg)
print("一共有%s种组合。" % (len(total_list),))
for m in total_list:
    print(m)

练习题 4

猜数字

首先由计算机产生一个[0,100]之间的随机整数,然后由用户猜测所产生的随机数。
根据用户猜测的情况给出不同提示:

  • 如猜测的数大于产生的数,则显示“High”,小于则显示“Low”,等于则显示“You won !”,游戏结束。
  • 用户最多可以猜7次,如果7次均未猜中,则显示“You lost!”,并给出正确答案,游戏结束。
  • 游戏结束后,询问用户是否继续游戏,选择“Y”则开始一轮新的猜数游戏;选择“N”则退出游戏。!

参考答案:


while True:
    answer = random.randint(0, 100)  # 生成一个0~100的随机数
    for i in range(6, -1, -1):  # 循环 6,5,4,3,2,1,0
        message = "还剩%d次机会" % (i,)
        try:
            number = int(input("请输入一个数字:"))  # 接受一个用户输入的数字
        except ValueError:
            print("输入的不是数字,", message)
            continue
        if num == answer:  # 如果大了,提示用户大了并返回while重新开始
            print("恭喜猜中!!!")
            break
        elif num < answer:  # 否则,提示用户大了并返回while重新开始
            print("小了,", message)
        else:
            print("大了,", message)
        if i == 0:
            print("很遗憾,您未猜中!!!,答案是:", answer)
    ask = input("再来一次?(Y/any):").upper()
    if ask == "Y":
        continue
    else:
        break

练习题 5

赶鸭子

一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。
这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?

要求:
- 利用递归函数编程实现。


参考答案:


def f(n):
    if n == 8:
        return 2
    else:
        sum = f(n+1)*2+2
        return sum
print('一共有{}只鸭子'.format(f(1)))

练习题 6

从键盘输入一个1~7的数字,格式化输出对应数字的星期字符串名称。
如:输入3,返回“您输入的是星期三”。


参考答案:


num = int(input("请输入1-7:"))
num_list = ["","一", "二", "三", "四", "五", "六", "日"]
print("您输入的是星期{}".format(num_list[num]))

练习题 7

数字密码

编程程序,从键盘任意输入1个4位数,
将该数字中的每位数与7相乘,然后取乘积结果的个位数对该数字进行替换,最后得到1个新的4位数。


参考答案:


v = input("请输入一个四位数:")
v2 = ""
for i in v:
    v1 = int(i) * 7
    v2 += str(v1 % 10)
print(v2)

练习题 8

九九乘法表

99乘法表


参考答案:


for a in range(1, 10):
    for b in range(1, a+1):
        print("%s*%s=%s\t" % (b, a, b*a,),end="")
    print()

练习题 9

字符查询

输入一个字符串 str,输出第 m 个只出现过 n 次的字符

  • 如在字符串 gbgkkdehh 中,找出第 2 个只出现 1 次的字符,输出结果:d

参考答案:


def find_out(s, n, c):
    lis = []
    for i in s:
        count = content.count(i, 0, len(content))
        if count == c:
            lis.append(i)
    return lis[n - 1]


content = input("请输入一段字符串:")
num = int(input("第m个字符,m? :"))
counts = int(input("出现过n次,n? :"))

print("第{}个出现过{}次的字符是:".format(num, counts), find_out(content, num, counts))

练习题 10

判断奇偶数

给定一个数 a,判断一个数字是奇数或偶数


参考答案:


def odd_or_even(num):
    while True:
        try:
            # 判断输入是否为整数
            number = int(num)
            break
        except ValueError:
            # 不是纯数字需要重新输入
            print("输入的不是整数!")
            continue
    if number % 2 == 0:
        return '偶数'
    else:
        return '奇数'


print(odd_or_even(input("请输入一个数字:")))

练习题 11

字符串去重排列

将字符串 s = “ajldjlajfdljfddd”,去重并从小到大排序输出”adfjl”。


参考答案:



s = "ajldjlajfdljfddd"
s_set = set()  # 集合自带去重功能,所以只要for循环字符串s,并添加到集合中,就可以自动去重。
for i in s:
    s_set.add(i)
    s_lis = sorted(list(s_set))  # 使用 sorted 方法,对字母进行排序
result = "".join(s_lis)  # sorted方法返回的是一个列表,这边将列表数据转换成字符串
print(result)

练习题 12

打印菱形

打印如下内容:

   *
  ***
 *****
*******
 *****
  ***
   *

参考答案:



for i in range(-3,4):
    s = 2 * (4 - abs(i)) - 1
    print(" " * abs(i), "*" * s)

练习题 13

判断几位数和逆序打印

给一个不多于 5 位的正整数(如 a = )
求它是几位数和逆序打印出各位数字。


参考答案:



def num(n):
    print("您输入的是%s位数。" % (len(n)))
    print(n[::-1])
num(input("请输入一个不多于5位的正整数:"))

练习题 14

水仙花数

如果一个 3 位数等于其各位数字的立方和,则称这个数为水仙花数。
例如:153 = 1^3 + 5^3 + 3^3,因此 153 就是一个水仙花数。
那么如何求 1000 以内的水仙花数(3 位数)。


参考答案:


for num in range(100, 1000):
    hun = num // 100  # 取百位
    ten = (num - hun * 100) // 10  #取十位
    one = (num - hun * 100 - ten * 10)  # 取个位
    # hun = int(str(num)[0])  # 取百位,先将数字转换为字符串,再通过索引取值,再转换为数字
    # ten = int(str(num)[1])  # 取十位,先将数字转换为字符串,再通过索引取值,再转换为数字
    # one = int(str(num)[2])  # 取个位,先将数字转换为字符串,再通过索引取值,再转换为数字
    d = hun ** 3 + ten ** 3 + one ** 3
    if d == num:
        print(str(num),"是水仙花数")

练习题 15

求质数

求以内的所有质数


参考答案:


prime_list = []  # 创建一个空列表用于接收发现的质数。
for i in range(2, ):  # 循环2~9999
    for a in range(2,i):  # 循环2~i-1
        b = i % a
        if b == 0:  # 如果i 能被 除1和i本身之外的一个正整数整除,则i不是质数,退出本次for循环
            break
    else:  # 这个else是for语句的,如果 整个for循环过程,b都不等于0,则执行else,否则不执行
        # print("%s是质数。" % (i,))
        prime_list.append(i)
print(prime_list)  # 打印所有质数列表
print(len(prime_list))  # 打印质数数量

"""

练习题 16

求值

计算 1-2+3-4+5-…-100 的值。


参考答案:


total = 0
for i in range(1,101):
    if i % 2 == 0:  # i如果是偶数,total = total - i
        total -= i
    else:
        total += i # i如果是奇数,total = total + i
print(total)

练习题 17

立方和

现有计算公式 1^3 + 2^3 + 3^3 + 4^3 + …….+ n^3,
如何实现:当输入 n = 5 时,输出 225(对应的公式 : 1^3 + 2^3 + 3^3 + 4^3 + 5^3 = 225)。


参考答案:


n = int(input("输入一个数字:"))
total = 0
for i in range(1, (n + 1)):
    total += i ** 3
print(total)

练习题 18

对称数组

例如 [1,2,0,2,1],[1,2,3,3,2,1],这样的数组都是对称数组。
判断,是对称数组打印 True,不是打印 False。


参考答案:


def list_symmetry(l):
    if l == l[::-1]:
        # reverse 和 [::-1]的区别是,前者改变列表本身,后者不改变列表本身,生成一个反转后的新列表
        return True
    else:
        return False


print(list_symmetry(['a', 'b', 'd', 'd', 'a']))
print(list_symmetry(['a', 'b', 'c', 'b', 'a']))

练习题 19

取最大值

取出列表 L1 = [1, 2, 3, 11, 2, 5, 3, 2, 5, 33, 88] 中最大的三个值。


参考答案:


l1 = [1, 2, 3, 11, 2, 5, 3, 2, 5, 33, 88]
l1.sort()  # 列表从小到大排序
print(l1[-3:])  # 使用切片取列表最后三位

练习题 20

数字组合

有四个数字:1、2、3、4,能组成多少个互不相同且无重复数字的三位数?各是多少?


参考答案:


# 方法一
l1 = [1, 2, 3, 4]
l2 = []
for x in l1:  # 从列表中取值,作为百位数
    for y in l1:
        if y == x:  # 从列表中取值,如果和百位数重复,重新取值,不重复,作为十位数。
            continue
        for z in l1:
            if z != x and z != y:  # 从列表中取值,如果与百位和十位不重复,作为个位数。
                result = x * 100 + y * 10 + z
                l2.append(result)
print(len(l2),"种")
print(l2)


# 方法二 简便方法:用itertools中的permutations即可。
import itertools  # 网上看到的别人的解法,对于itertools不了解,粘贴一下,以供参考。
count = 0
l1 = [1, 2, 3, 4]
for i in itertools.permutations(l1, 3):
    print(i)
    count += 1
print(count)

练习题 21

计算奖金

题目:企业发放的奖金根据利润提成。

  • 利润(I)低于或等于10万元时,奖金可提10%;
  • 利润高于10万元,低于20万元时,低于10万元的部分按10%提成,高于10万元的部分,可提成7.5%;
  • 20万到40万之间时,高于20万元的部分,可提成5%;
  • 40万到60万之间时高于40万元的部分,可提成3%;
  • 60万到100万之间时,高于60万元的部分,可提成1.5%,
  • 高于100万元时,超过100万元的部分按1%提成,

从键盘输入当月利润I,求应发放奖金总数?


参考答案:


# 我的方法
profit = int(input("利润金额:"))
if profit <= :
    bonus = profit * 0.1
elif  < profit <= :
    bonus =  + (profit - ) * 0.075
elif  < profit <= :
    bonus =  + (profit - ) * 0.05
elif  < profit <= :
    bonus =  + (profit - ) * 0.03
elif  < profit <= :
    bonus =  + (profit - ) * 0.015
else:
    bonus =  + (profit - ) * 0.01
print("奖金:%s元" % (bonus, ))


# 网上其他人的方法
profit = int(input('利润金额: '))
bonus = 0
thresholds = [, , , , ]
rates = [0.1, 0.075, 0.05, 0.03, 0.015, 0.01]
for i in range(len(thresholds)):
    if profit <= thresholds[i]:
        bonus += profit * rates[i]
        profit = 0
        break
    else:
        bonus += thresholds[i] * rates[i]
        profit -= thresholds[i]
bonus += profit * rates[-1]
print("奖金:%s元" % (bonus, ))

练习题 22

找数字

一个正整数,它加上100后是一个完全平方数,再加上168又是一个完全平方数,请问该数是多少?

思路:

  • z + 100 = x ** 2
  • z + 100 + 168 = y ** 2
    x y为两个相邻的数时,z为最大值

参考答案:


x = 0
while True:
    y = 0
    x += 1
    while True:
        y += 1
        if y ** 2 - x ** 2 >= 168:
            break
    if y ** 2 - x ** 2 == 168 and x ** 2 > 100:
        z = x ** 2 - 100
        print("这个整数是:{}".format(z, ))
    if y - x == 1:
        break

练习题 23

查询第几天

题目:输入某年某月某日,判断这一天是这一年的第几天?

思路:闰年判断方法,四年一闰,百年不闰,四百年再闰.


参考答案:


# 例如:2022-9-21
date = input("请输入日期,格式【XXXX-XX-XX】: ")
date_list = s1.split("-")  # 以“-”为分隔符,将字符串分割成列表。
day_list = [31, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]  # 创建一个缺省2月份天数的列表
year = int(date_list[0])
if year % 400 == 0 or year % 100 != 0 and year % 4 == 0:  # 判断年份是否为闰年
    day_list.insert(1, 29)  # 如果是,在列表索引1的位置插入29
else:
    day_list.insert(1, 28)  # 不是,插入28
days = int(date_list[2])
for d in range(int(date_list[1]) - 1):  # 循环月数-1,并相加,即,该月份之前的所有天数之和
    days += day_list[d]  # 再加上当月的天数
print(days)

练习题 24

十秒倒计时

题目:十秒倒计时。
程序分析:使用 time 模块的 sleep() 函数。
ps:熟悉time模块


参考答案:


import time
for i in range(10, 0, -1):
    print(i)
    time.sleep(1)

练习题 25

打印当前时间

题目:持续打印当前时间,一分钟。


参考答案:


import time

for i in range(60):
    print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))
    time.sleep(1)

练习题 26

养兔子

题目:
有一对兔子,从出生后第3个月起每个月都生一对兔子,
小兔子长到第三个月后每个月又生一对兔子,
假如兔子都不死,问每个月的兔子总数为多少?

思路分析:
        一月兔     二月兔     成年兔
一月      2          0         0
二月      0          2         0
三月      2          0         2
四月      2          2         2
五月      4          2         4
六月      6          4         6
七月     10          6        10
八月     16         10        16
九月     26         16        26

综上分析可知,
①二月兔的数量,就是上个月一月兔的数量;
②成年兔的数量,就是上个月成年兔的数量+二月兔的数量;
③一月兔的数量,就是本月成年兔的数量;

参考答案:


month_total = int(input("养殖多少个月:"))
m1 = 2
m2 = 0
m_end = 0
for i in range(month_total):
    rabbit_total = m1 + m2 + m_end
    print("-" * 20)  # 分隔符
    print("第%d个月,一共%d只兔子" % (i + 1, rabbit_total))
    print("其中一月兔数量:%d只" % (m1,))
    print("其中二月兔数量:%d只" % (m2,))
    print("其中成年兔数量:%d只" % (m_end,))
    m1, m2, m_end = m_end + m2, m1, m_end + m2  # 根据思路分析得出

练习题 27

养兔子——扩展题

上一题扩展,假设兔子寿命只有6个月,
养殖一年,一共还剩多少兔子,一月兔、二月兔、成年兔数量各多少

思路分析:
1. 前6个月数据不变
2. 第七个月开始,成年兔需要减去6个月之前的一月兔数量
3. 一月兔还是等于成年兔数量
4. 二月兔还是等于上个月一月兔数量

需要建立一个列表,记录每个月一月兔的数量,以便于第七个月开始可以调用

参考答案:


month_total = 12
m1 = 2
m2 = 0
m_end = 0
m1_list = [0, 0, 0, 0, 0]
for i in range(month_total):
    rabbit_total = m1 + m2 + m_end
    m1_list.append(m1)
    print("-" * 20)
    print("第%d个月,一共%d只兔子" % (i + 1, rabbit_total))
    print("其中一月兔数量:%d只" % (m1,))
    print("其中二月兔数量:%d只" % (m2,))
    print("其中成年兔数量:%d只" % (m_end,))
    m1, m2, m_end = m_end + m2 - m1_list[i], m1, m_end + m2 - m1_list[i]
    print("下月死亡成年兔:%d只" % (m1_list[i]))

练习题 28

找出101-200之间的质数

题目:判断101-200之间有多少个素数,并输出所有素数。
思路,与练习题15一样

prime_list = []
for i in range(101, 201):
    for a in range(2,i):
        b = i % a
        if b == 0:
            break
    else:
        print("%s是质数。" % (i,))
        prime_list.append(i)
print("101到200之间质数的数量为:", len(prime_list))

练习题 29

猴子分桃子

题目:海滩上有一堆桃子,五只猴子来分。
第一只猴子把这堆桃子平均分为五份,多了一个,这只猴子把多的一个扔入海中,拿走了一份。
第二只猴子把剩下的桃子又平均分成五份,又多了一个,它同样把多的一个扔入海中,拿走了一份,
第三、第四、第五只猴子都是这样做的,
问海滩上原来最少有多少个桃子,最后还剩多少个?

思路分析
a = 5 * b + 1  # 第一只猴子拿走b个桃子
4 * b = 5 * c + 1  # 第二只猴子拿走c个桃子
4 * c = 5 * d + 1  # 第三只猴子拿走d个桃子
4 * d = 5 * e + 1  # 第四只猴子拿走e个桃子
4 * e = 5 * f + 1  # 第五只猴子拿走f个桃子

参考答案:


# 方法一
f = 0  # 第五只猴子拿走的桃子数
while True:
    f += 1  # 第五只猴子拿走的桃子数
    e = ((5 * f) + 1) / 4  # 第四只猴子拿走的桃子数
    d = ((5 * e) + 1) / 4  # 第三只猴子拿走的桃子数
    c = ((5 * d) + 1) / 4  # 第二只猴子拿走的桃子数
    b = ((5 * c) + 1) / 4  # 第一只猴子拿走的桃子数
    a = (5 * b) + 1  # 最开始桃子总数
    if e % 1 ==0 and d % 1 ==0 and c % 1 ==0 and b % 1 ==0 and a % 1 ==0:  # 桃子数量肯定是整数。
        msg = """
        一共有{0}个桃子
        第一只猴子拿走{1}个桃子
        第二只猴子拿走{2}个桃子
        第三只猴子拿走{3}个桃子
        第四只猴子拿走{4}个桃子
        第五只猴子拿走{5}个桃子
        最后还剩{6}个桃子""".format(int(a), int(b), int(c), int(d), int(e), f, 4 * f)
        print(msg)
        break

# 方法二
x = 0  # 上一只猴子拿走的桃子数
y = 0  # 最后一只猴子拿走的桃子数
res = 0  # 桃子总数
b = True
while b:
    y += 1 # 第五只猴子拿走的桃子
    x = ((5 * y) + 1) / 4 # 第四只猴子拿走的桃子
    for i in range(3):  # 循环出前三只猴子拿走的桃子数,所以是range(3)
        if ((5 * x) + 1) % 4 != 0:  # ((5 * y) + 1) 需要是4的倍数
            break
        else:
            x = ((5 * x) + 1) / 4
        if i == 2:  # 如果可以顺利完成三次循环,桃子总数就是第一只猴子拿走的桃子数 乘以5,再加上1.
            res = (5 * x) + 1
            b = False
print("原来最少有%s个桃子,最后还剩%s个桃子。" % (res, 4 * y))

练习题 30

数据加密/解密

题目:某个公司采用公用电话传递数据,数据是四位的整数,在传递过程中是加密的,加密规则如下:
每位数字都加上5,然后用和除以10的余数代替该数字,
再将第一位和第四位交换,第二位和第三位交换。

分析:
① 加5,然后用和除以10的余数,其实就是加5后,新数字的个位数。
② 一四交换,二三交换,其实就是反转。

参考答案:


# 加密
def encode(content):
    res = 0
    for i in range(content):  # 循环四位数(字符串)
        n = (int(i) + 5) % 10  # 加5 取余
        res += n * (10 ** i)  # 这里很巧妙将得数直接反转了,i=0时 content[0]是千位,而10 ** i = 1,得数编程了个位
    return res

# 解密
def decode(res):
    plain = 0
    data = str(res)
    for i in range(4):
        if int(data[i]) < 5:
            n = int(data[i]) + 5
        else:
            n = int(data[i]) - 5
        plain += n * (10 ** i)
    return plain

当前标题:我做过的Python30道练习题
当前地址:http://scyanting.com/article/dsogsep.html