Python 100道经典练习题

目录

实例001:数字组合

实例002:“个税计算”

实例003:完全平方数

实例004:这天第几天

实例005:三数排序

实例006:斐波那契数列

实例007:copy

实例008:九九乘法表

实例009:暂停一秒输出

实例010:给人看的时间

实例011:养兔子

实例012:100到200的素数

实例013:所有水仙花数

实例014:分解质因数

实例015:分数归档

实例016:输出日期

实例017:字符串构成

实例018:复读机相加

实例019:完数

实例020:高空抛物

实例021:猴子偷桃

实例022:比赛对手

实例023:画菱形

实例024:斐波那契数列II

实例025:阶乘求和

实例026:递归求阶乘

实例027:递归输出

实例028:递归求等差数列

实例029:反向输出

实例030:回文数

实例031:字母识词

实例032:反向输出II

实例033:列表转字符串

实例034:调用函数

实例035:设置输出颜色

实例036:算素数

实例037:排序

实例038:矩阵对角线之和

实例039:有序列表插入元素

实例040:逆序列表

实例041:类的方法与变量

实例042:变量作用域

实例043:作用域、类的方法与变量

实例044:矩阵相加

实例045:求和

实例046:打破循环

实例047:函数交换变量

实例048:数字比大小

实例049:lambda

实例050:随机数

实例051:按位与

实例052:按位或

实例053:按位异或

实例054:位取反、位移动

实例055:按位取反

实例056:画圈

实例057:画线

实例058:画矩形

实例059:画图(丑)

实例060:字符串长度

实例061:杨辉三角

实例062:查找字符串

实例063:画椭圆

实例064:画椭圆、矩形

实例065:画组合图形

实例066:三数排序

实例067:交换位置

实例068:旋转数列

实例069:报数

实例070:字符串长度II

实例071:输入和输出

实例072:创建链表

实例073:反向输出链表

实例074:列表排序、连接

实例075:不知所云

实例076:做函数

实例077:遍历列表

实例078:字典

实例079:字符串排序

实例080:猴子分桃

实例081:求未知数

实例082:八进制转十进制

实例083:制作奇数

实例084:连接字符串

实例085:整除

实例086:连接字符串II

实例087:访问类成员

实例088:打印星号

实例089:解码

实例090:列表详解

实例091:time模块

实例092:time模块II

实例093:time模块III

实例094:time模块IV

实例095:转换时间格式

实例096:计算复读次数

实例097:磁盘写入

实例098:磁盘写入II

实例099:磁盘读写

实例100:列表转字典


实例001:数字组合

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

L= [1,2,3,4]

result= []

count= 0

for iin L:  # 作为百位数

  for jin L:  # 作为十位数

      for kin L: #作为个位数

        if i!= jand i!= kand j!=k:

            A= i*100 + j*10 + k

result.append(A)

            count+= 1

print(count,'个,它们分别是:',result)

或者采用itertools 模块中的permutations 更简单的实现

import itertools

result = [i*100+j*10+k for i,j,k in itertools.permutations([1,2,3,4],3)]

print(result)

实例题002:个税计算”

题目 企业发放的奖金根据利润提成。利润(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,求应发放奖金总数?

def bonus(I):

  if I < 10:

      return I * 0.1

  elif I < 20 and I >10:

      return 1 + (I-10)*0.075

  elif I < 40 and I > 20:

      return 1 + 0.75 + (I-20) * 0.05

  elif I < 60 and I > 40:

      return 1 + 0.75 + 1 + (I - 40) * 0.03

  elif I < 100 and I > 60:

      return 1 + 0.75 + 1 + 0.6 + (I-60) * 0.015

  else:

      return 1 + 0.75 + 1 + 0.6 + 0.06 + (I - 60) * 0.01

I= int(input('请输入今年的利润I= ') )

A= bonus(I)

print(A)

或者采用循环方法

level = [0,100000,200000,400000,600000,1000000,float('inf')]

rate = [0,10,7.5,5,3,1.5,1]

def bonus():

  profit = float(input('请输入企业的利润:'))

  result = 0

  for i in range(1,len(level)): #从1开始循环,避免i-1时出现-1,也是两个列表前面加0的原因,用于占位。

      if profit <= level[i]:

        result += (profit - level[i-1]) * (rate[i]/100)

        return result

        # break #不再往下计算,跳出循环

      else:

        result += (level[i]-level[i-1])*(rate[i]/100)

  return '%.2f' %result

print(bonus())

递归方法

level = [0, 100000, 200000, 400000, 600000, 1000000, float('inf')]

rate = [0, 10, 7.5, 5, 3, 1.5, 1]

test = float(input('请输入企业的利润:'))

def calc_bonus(profit):

  if profit == 0:

      return 0

  for i in range(len(level)):

      if profit <= level[i]:

        return calc_bonus(level[i - 1]) + (profit - level[i - 1]) * rate[i] / 100

A= calc_bonus(test)

print(A)

注意,在level 的最后我加了一个float('inf'),这是因为最后测试的时候,发现如果利润大于100万就计算不出来了,原来是大于100万的数字无法满足 profit <= level[i] 这个条件,自然也就无法计算。而 float('inf')在一般情况下可以表示无穷大。

实例003:完全平方数

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

def sqrt():

  for Bin range(1,168): #从1开始一直试到167

      for Ain range(1,B):  #从1一直是到i,因为它不可能超越i

        if B**2 -A**2 == 168:  #如果i² - j² = 168

            print (B**2 - 268,end = ' ')  #要求的数就等于 i² - 268,因为这个数+268才等于i²

C= sqrt()

或者

n=0

while (n+1)**2-n*n<=168:

    n+=1

for i in range((n+1)**2):

    if i**0.5==int(i**0.5) and (i+168)**0.5==int((i+168)**0.5):

        print(i-100,end = ' ')

实例004:这天第几天

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

思路:首先需要考虑平闰年天数不同的问题。

其次计算天数时,已经过去的月份包含的天数是可以确定的,因此我们可以提前计算出。

最后根据“天数= 至上一个月已过天数+ 这个月已过天数”写出程序

day_of_month =[0,31,28,31,30,31,30,31,31,30,31,30]

partdays = 0

'''

def funcname(paralist):

function body

'''

def get_date():#获取用户输入日期  年月日

    year = int(input('Year:'))

    month = int(input('Month:'))

    day = int(input('day:'))

    return (year,month,day)  #返回元组  一个函数可以返回多个值

def is_leap(year):#判断一个年份是否闰年

    if year % 400 == 0 or (year % 4 == 0 and year % 100 != 0):

return True

else:

return False

def cal_days(year,month,day):# 计算当前这一天是当年的第几天

    partdays = 0

    for i in range(month):  # 计算当前月份之前的所有天数

        partdays += day_of_month[i]

    if is_leap(year) and month > 2:

        return partdays + day +1  # 到当前这一天为止所有天数totalday += 1

    else:

        return partdays + day

def main():

    year,month,day = get_date()

    days = cal_days(year,month,day)

    print('{}年{}月{}日是这年的第{}天'.format(year,month,day,days))

main()

或者更简洁方法:

方法3

import datetime

def func3(year, month, day):

    date = datetime.date(year, month, day)

    return date.strftime('%j')  # %j十进制表示的每年的第几天

print(func3(2020, 12, 20))  # 355

实例005:三数排序

题目 输入三个整数x,y,z,请把这三个数由小到大输出。

我们不妨把题目改为:请用户在一行中输入三个整数,用逗号隔开,并将这三个数从小到大排列输出。注意,用户的任何不合法输入都要返回重新输入,比如把逗号输成了全角或其他符号、不小心输入了字母或空格、输入不够或者超过3个数字等等。

def sort_user_input():

  user_input= input('请输入三个整数,用逗号分隔:')

  input_limit= list(map(str,range(10)))+[',']#做一个包含0-9以及','的列表,用于之后判断用户的输入是不是在这个列表里,由于用户输入的时候都是字符串,所以还需要将列表元素中的数字转换成字符串。这里我们用到了高级函数 map。

  for iin user_input:

      if(not iin input_limit) or ('' in user_input.split(',')):#后面一个条件经验证可以筛选重复输入了','的情况

        print('你的输入有误,请重新输入')

        return sort_user_input()

      if len(user_input.split(','))!=3:#判断是否为3个数字

        print("你输入的数字个数不正确!请重新输入")

        return sort_user_input()

      return sorted(list(map(int,user_input.split(','))))#用map函数将用逗号分割后的列表中的元素转换成int类型,然后进行排序。

A= sort_user_input()

print(A)

6.斐波那契数列

斐波那契数列(Fibonaccisequence),从1, 1开始,后面每一项等于前面两项之和。图方便就递归实现,图性能就用循环。

递归方法

def Fib(n):

  if n <= 2:

      return 1

  return Fib(n-1) + Fib(n-2)

print(Fib(8),end=' ')

循环

target=int(input('请输入n项数列n=:'))

res=0

a,b=1,1

for iin range(target-1):

  a,b=b,a+b

print(a,end=' ')

7.copy

将一个列表的数据复制到另一个列表中。使用列表[:],拿不准可以调用copy模块。

import copy

a= [1,2,3,4,['a','b']]

b= a# 赋值

c= a[:]        # 浅拷贝

d= copy.copy(a)    # 浅拷贝

e= copy.deepcopy(a)  # 深拷贝

a.append(5)

a[4].append('c')

print('a=',a)

print('b=',b)

print('c=',c)

print('d=',d)

print('e=',e)

8.输出九九乘法表

for iin range(1,10):

  for jin range(1,i+1):

      print('{}x{}={}\t'.format(j,i,i*j),end = '')

  print()  # print()--print一个空内容的目的是为了让它在每一行进行换行

9.暂停一秒输出  (使用 time模块的 sleep() 函数)

import time

for iin range(4):

  print(str(int(time.time()))[-2:])

  time.sleep(1)

10.给人看的时间 (暂停一秒输出,并格式化当前时间。)

import time

for iin range(4):

  print(time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time())))

  time.sleep(1)

11.养兔子

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

程序分析 我认为原文的解法有点扯,没有考虑3个月成熟的问题,人家还是婴儿怎么生孩子?

考虑到三个月成熟,可以构建四个数据,其中:一月兔每个月长大成为二月兔,二月兔变三月兔,三月兔变成年兔,成年兔(包括新成熟的三月兔)生等量的一月兔。

month=int(input('繁殖几个月?:'))

month_1=1

month_2=0

month_3=0

month_elder=0

for iin range(month):

  month_1,month_2,month_3,month_elder=month_elder+month_3,month_1,month_2,month_elder+month_3

print('第%d个月共'%(i+1),month_1+month_2+month_3+month_elder,'对兔子')

  print('其中1月兔:',month_1)

  print('其中2月兔:',month_2)

  print('其中3月兔:',month_3)

  print('其中成年兔:',month_elder)

12.实例012:100到200的素数

题目 判断101-200之间有多少个素数,并输出所有素数。

程序分析 判断素数的方法:用一个数分别去除2到sqrt(这个数),如果能被整除,则表明此数不是素数,反之是素数。用else可以进一步简化代码.

import math

for iin range(100,200):

  flag=0

  for jin range(2,round(math.sqrt(i))+1):

      if i%j==0:

        flag=1

        break

  if flag:  # 注意if的位置!

      continue

  print(i,end=',')

print('\nSimplify the code with "else"\n')

另一种方法

for iin range(100,200):

  for jin range(2,round(math.sqrt(i))+1):

      if (i% j) == 0:

break

else:

      print(i)

flag= 1

def F():

  for iin range(100,201):

      for jin range(2,i):

        if i% j!= 0:

            flag= 1

        else:

            flag= 0

  return flag

if flag== 1:

  print('素数')

else:

  print('不是素数')

13.实例013:所有水仙花数

题目 打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身。例如:153是一个"水仙花数",因为153=1的三次方+5的三次方+3的三次方。

程序分析 利用for循环控制100-999个数,每个数分解出个位,十位,百位。

for iin range(100,1000):

  s= str(i)

  one= int(s[2])

  ten= int(s[1])

  hun= int(s[0])

  if i== one**3 + ten**3 + hun**3:

      print(i)

14.实例014:分解质因数

**将一个整数分解质因数。例如:输入90,打印出90=2*3*3*5。

分析:**根本不需要判断是否是质数,从2开始向数本身遍历,能整除的肯定是最小的质数。

target=int(input('输入一个整数:'))

print(target,'= ',end='')

if target<0:

    target=abs(target)

    print('-1*',end='')

flag=0

if target<=1:

    print(target)

    flag=1

while True:

    if flag:

break

    for iin range(2,int(target+1)):

        if target%i==0:

            print("%d"%i,end='')

            if target==i:

                flag=1

                break

            print('*',end='')

            target/=i

break

15、实例015:分数归档

**利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示。

points= float(input('输入分数:'))

if points>= 90:

  grade= 'A'

elif points<60:

  grade= 'C'

else:

  grade=  'B'

print(grade)

16.实例016:输出日期

*输出指定格式的日期。  **使用 datetime模块。

import datetime

print(datetime.date.today())

print(datetime.date(2021,12,3))

print(datetime.date.today().strftime('%d/%m/%Y'))

day=datetime.date(2012,12,3)

day=day.replace(year=day.year+28)

print(day)

17.实例017:字符串构成

输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。

分析:利用 while 或 for 语句,条件为输入的字符不为 '\n'。

string= str(input('请输入一行字符l='))

alpha= 0

space= 0

digit= 0

other= 0

for iin range(len(string)):

  if string[i].isalpha():

      alpha+= 1

  elif string[i].isspace():

      space+= 1

  elif string[i].isdigit():

      digit+= 1

  else:

      other+= 1

print('alpha: ',alpha)

print('space: ',space)

print('digit: ',digit)

print('other: ',other)

可以探讨一下如何输出一个字典。比如-->{字母:10,空格:3,数字:8 ,其他:2}

18.实例018:复读机相加

求s=a+aa+aaa+aaaa+aa...a的值,其中a是一个数字。例如2+22+222+2222+22222(此时共有5个数相加),几个数相加由键盘控制。

分析:用字符串解决。

a= 2

n= int(input("请输入几个数相加:"))

A= ''

B= []

s= 0

for iin range(n):

  A+= '2'

  B.append(int(A))

print(B)

for jin range(len(B)):

  s+= B[j]

print(s)

题目答案:

a=input('被加数字:')

n=int(input('加几次?:'))

res=0

for iin range(n):

  res+= int(a)

  a+= a[0]  # 没看明白,a不是一个数吗?难道a是一个列表?换成a=a+a[i]效果一样

print(res)

19.完数

**题目:**一个数如果恰好等于它的因子之和,这个数就称为"完数"。例如6=1+2+3.编程找出1000以内的所有完数。

**程序分析:**将每一对因子加进集合,在这个过程中已经自动去重。最后的结果要求不计算其本身。

因子:整除为0,










https://zhuanlan.zhihu.com/p/342422332

你可能感兴趣的:(Python 100道经典练习题)