Python初学者练习实例(含问题分析+代码)

Python初学者练习实例(含问题分析+代码)

  • 1.用一条语句判断是否为闰年
  • 2.用户输入一个三位自然数,计算并输出其百位、十位和个位上的数字
  • 3.给定一个正整数,判断它是否是素数
  • 4.已知自然常数e的泰勒展开式是:e=1+1/1!+1/2!+1/3!+...请用迭代法计算它的第i项1/i!
  • 5.输入任意两个正整数p和q,计算它们的最大公约数,并返回结果,例如p=12,q=18,返回值为6
  • 6.用字典设计一个程序录入学生作业的情况,例如:{‘海航’:{‘20200322’:‘未交’,‘20200401’:‘已交’},‘国航’:{‘20200322’:‘已交’,‘20200401’:‘已交’}}
  • 7.现有4门课的成绩字典如下所示,统计每个人的平均成绩,并根据平均成绩进行排序。要求按姓名检索平均成绩和排名:
  • 8.编写一个函数,要求打印m行n列的平行四边形
  • 9.小猴在一天摘了若干桃,当天吃掉一半多一个,第二天接着吃剩下的一半多一个,以后每天都吃掉尚存桃子的一半多一个,第七天早上只剩下1个,问小猴摘了多少个桃?
  • 10.请编写面向对象程序,实现万年历Calender,它可以显示用户输入的年、月的星期日历
  • 11.编写程序,生成包含20个列表,然后将前十个元素升序排列,后十个元素降序排列,并输出结果
  • 12.有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子总数为多少?
  • 13.在health.tex文件中包含健康指数如下,编写health.py模块,能够读取文件内容,并根据人工输入的体重和身高计算BMI,测算健康指数。当输入身高为0时,能够进行异常处理。文件内容:
  • 14.随机生成二维数据,并以散点图的形式进行展示,模拟随机游走的过程
  • 15.编写程序,生成一个包含20个随机整数的列表,然后删除所有奇数
  • 16.输入某年某月某日,判断这一天是这一年的第几天?

1.用一条语句判断是否为闰年

问题分析:根据闰年的定义,能被4整除不能被100整除的或能被400整除的为闰年,根据此可以编写ifelse语句来判断。

year = int(input("请输入一个年份:"))
if (year % 4) == 0 and (year % 100) !=0 or (year % 400) == 0:
    print("%s年是闰年" % year)
else:
print("%s年不是闰年" % year)

运行结果:
在这里插入图片描述

2.用户输入一个三位自然数,计算并输出其百位、十位和个位上的数字

问题分析:三位数的自然数想要知道其个、十、百位上的数字,可以先让他除以100,得到一个余数和商,这个商就是百位的数字,再用余数除以10,得到一个商和余数,这个商是十位的数字,余数为个位的数字。
代码:

x = input('请输入一个三位数:')
x = int(x)
a, b = divmod(x, 100)
b, c = divmod(b, 10)
#函数把除数和余数运算结果结合起来,
#返回一个包含商和余数的元组(a // b, a % b)。
print(a, b, c)

运行结果:
在这里插入图片描述

3.给定一个正整数,判断它是否是素数

问题分析:根据素数的定义:只能被 1 和它本身整除的数叫做素数,来编写函数,运用ifelse语句进行判断,先判断是否大于1,大于1则继续判断,否则推出,确定大于1后再判断是否能被大于等于2的数整除,不能则为素数,能的话就不是素数。
代码:

n = int(input("请输入一个正整数n:"))
if n < 2:           #判断是否大于1的整数,且1不是素数
    print("%d不是素数!"%n)
else:
    for i in range(2,n):
        if n % i == 0:    #判断2——i是否有能被整除
            print("%d不是素数!"%n)
            break
    else:
        print("%d是素数!"%n)

运行结果:
在这里插入图片描述

4.已知自然常数e的泰勒展开式是:e=1+1/1!+1/2!+1/3!+…请用迭代法计算它的第i项1/i!

问题分析:
可以看出该问题就是要运用python计算阶乘,根据阶乘的计算公式,可以定义一个函数,如果i=0的话结果为1,如果不等于0,则结果为i乘以该函数的参数为i-1时的值,相当于循环调用,最后得出结果,再取结果分之一,为题中要求结果。
代码:

def jiecheng(n):   
    if n == 0:
        return 1   
    else:       
        return n * jiecheng(n - 1)
i = int(input("请输入i:"))
print(1/jiecheng(i))

运行结果:
Python初学者练习实例(含问题分析+代码)_第1张图片

5.输入任意两个正整数p和q,计算它们的最大公约数,并返回结果,例如p=12,q=18,返回值为6

问题分析:求解最大公约数的具体步骤为:1.整数A对整数B进行取整, 余数用整数C来表示,即C = A % ;2.如果C等于0,则C就是整数A和整数B的最大公约数;3.如果C不等于0, 将B赋值给A, 将C赋值给B ,然后进行 1, 2 两步,直到余数为0, 则可以得知最大公约数。根据该过程进行编写函数
代码:

def fun(num1, num2):  # 定义一个函数, 两个形参
    if num1 < num2:  # 判读两个整数的大小,目的为了将大的数作为除数,小的作为被除数
        num1, num2 = num2, num1  # 如果if条件满足,则进行值的交换
    vari = num1 % num2  # 对2个整数进行取余数
    while vari != 0:  # 判断余数是否为0, 如果不为0,则进入循环
        num1 = num2  # 重新进行赋值,进行下次计算
        num2 = vari
        vari = num1 % num2  # 对重新赋值后的两个整数取余数        
    print("最大公约数为:%d" % num2)    # 输出
fun(12,18)

运行结果:
在这里插入图片描述

6.用字典设计一个程序录入学生作业的情况,例如:{‘海航’:{‘20200322’:‘未交’,‘20200401’:‘已交’},‘国航’:{‘20200322’:‘已交’,‘20200401’:‘已交’}}

问题分析:根据定义字典的知识将题中给的信息录入并输出结果。
代码:

stu1 = {'海航':{'20200322':'未交','20200401':'已交'}}
stu2 = {'国航':{'20200322':'已交','20200401':'已交'}}
print(stu1)
print(stu2)

运行结果:
在这里插入图片描述

7.现有4门课的成绩字典如下所示,统计每个人的平均成绩,并根据平均成绩进行排序。要求按姓名检索平均成绩和排名:

grade1={‘刘达’:89,‘王尔’:95,‘李珊’:67,‘陈思’:75}
grade2={‘刘达’:75,‘王尔’:79,‘李珊’:79}
grade1={‘李珊’:87,‘陈思’:91,‘张悟’:75}
grade1={‘刘达’:89,‘王尔’:86,‘张悟’:99}

问题分析:先将已知条件录入字典,然后运用for循环进行遍历,遍历过程中进行判断和计算学生平均成绩。
代码:

grade1 = {"刘达": 89, "王尔": 95, "李珊": 67, "陈思": 75}
grade2 = {"刘达": 75, "王尔": 79, "李珊": 79}
grade3 = {"李珊": 87, "陈思": 91, "张悟": 75}
grade4 = {"刘达": 89, "王尔": 86, "张悟": 99}
grade = [grade1, grade2, grade3, grade4]
b = []
nsum = 0
n = 0
a = str(input("输入姓名:"))
for i in grade:
    for key, value in i.items():
        if a == key:
            nsum += value
            n = n+1
            b.append(nsum/n)
print(nsum/n)

运行结果:
Python初学者练习实例(含问题分析+代码)_第2张图片

8.编写一个函数,要求打印m行n列的平行四边形

问题分析:
根据输入的行数和列数,进行while循环,当i<=m时继续循环,在第一个循环里嵌套一个j<=n的一个循环用来书写列上的“*”,当j>n时循环结束,输出四边形。
代码:

i = 1
m=int(input('请输入行数:'))
n=int(input('请输入列数:'))
while i <= m:
    j = 1
    while j <= i-1:  
        print(" ", end=" ")
        j += 1
    j = 1
    while j <= n: 
        print(end=" ")
        j += 1
    print()

运行结果:
Python初学者练习实例(含问题分析+代码)_第3张图片

9.小猴在一天摘了若干桃,当天吃掉一半多一个,第二天接着吃剩下的一半多一个,以后每天都吃掉尚存桃子的一半多一个,第七天早上只剩下1个,问小猴摘了多少个桃?

问题分析:逆向思维思考,设后一天的桃子数量为x,则前一天剩余的桃子数量为(x+1)×2,据此运用for循环进行编写函数。
代码:

x = 1
day = 7
for i in range(6):
    day = day-1
    x = (x+1)*2
    print ('第%d天的桃子数为%d个'%(day, x))

运行结果:
Python初学者练习实例(含问题分析+代码)_第4张图片

10.请编写面向对象程序,实现万年历Calender,它可以显示用户输入的年、月的星期日历

问题分析:
已知1900年1月1日是星期一
1.先输出提示语句,接受用户输入年、月。
2.根据输入的年份判断是否是闰年。
3.根据月份判断月的天数。
4.循环计算输入的年份距1900年1月1日的总天数。
5.循环计算输入的月份距输入年份的1月1日共有多少天。
6.相加4与5的天数得到总天数
7.用总天数计算输入月份的第一天是星期几
8.格式化显示这个月的日历
代码:

def isLeapYear(year):#判断是否是闰年
    return True if (year % 100 != 0 and year % 4 == 0) or year % 400 ==0 else False
 
def monthDay(year,month):#判断当前月天数
    li = [31,28,31,30,31,30,31,31,30,31,30,31]
    if isLeapYear(year):
        li[1] = 29
    return li[month-1]
 
def totalDay(year, month):#距190011日的天数
    days = 0
    for index_year in range(1900, year):
        days += 366 if isLeapYear(index_year) else 365
    for index_month in range(1, month):
        days += monthDay(year, index_month)
    return days
def Calender(): #显示当前月
    year,month = eval(input("输入年份、月份:"))
    space_num = totalDay(year, month) % 7 + 1
    #print("空格数",space_num)
    #print("星期",totalDay(year, month) % 7 + 1,"开始")
    print("星期日\t一\t二\t三\t四\t五\t六")
    for i in range(1, monthDay(year,month) + 1):
        if (i == 1):
            for j in range(space_num % 7):
                print("\t",end="")
        print("\t%2d"%i,end="")
        if (i + space_num) % 7 == 0:
            print()
Calender()

运行结果:
Python初学者练习实例(含问题分析+代码)_第5张图片

11.编写程序,生成包含20个列表,然后将前十个元素升序排列,后十个元素降序排列,并输出结果

问题分析:运用random.randint语句随机生成数,然后再运用sorted语句进行排序。
代码:

import random 
x = [random.randint(0,100)for i in range(20)]
print(x)
x[:10] = sorted(x[:10])
x[10:] = sorted(x[10:],reverse=True)
print(x)

运行结果:
在这里插入图片描述

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

问题分析:兔子的规律为数列1,1,2,3,5,8,13,21…,实际上就是斐波拉契数列。
代码:

f1 = 1
f2 = 1
for i in range(1,22):
    print('%12ld %12ld' % (f1,f2),end=' ')
    if (i % 3) == 0:
        print()
    f1 = f1 + f2
    f2 = f1 + f2

运行结果:
Python初学者练习实例(含问题分析+代码)_第6张图片

13.在health.tex文件中包含健康指数如下,编写health.py模块,能够读取文件内容,并根据人工输入的体重和身高计算BMI,测算健康指数。当输入身高为0时,能够进行异常处理。文件内容:

health.txt
<18.5:“过轻”
<24:“正常”
<27:“过重”
<32:“肥胖”
》32:"非常肥胖"

问题分析:根据题中要求编写health.tex文件,然后在python中调用,再运用if-else语句进行判断就可以了。

def health(weight, height):
    if height == 0:
        print("身高输入异常")
    else:
        BMI = weight/(height**2)
        print("BMI为:",BMI)
        if BMI < 18.5:
            print("偏瘦")
        elif BMI < 24:
            print("正常")
        elif BMI < 27:
            print("偏胖")
        elif BMI < 32:
            print("肥胖")
        elif BMI > 32:
            print("过度肥胖")

def main():
    m, n = map(float, input("输入的体重(kg)和高度(m):").split())
    health(m, n)
    with open('health.txt', 'r', encoding='utf-8') as f:
        print(f.read())
        for line in f:
            print(line, end='')
    print()
if __name__ == '__main__':
main()

运行结果:
Python初学者练习实例(含问题分析+代码)_第7张图片

14.随机生成二维数据,并以散点图的形式进行展示,模拟随机游走的过程

问题分析:每次行走都完全是随机的,没有明确的方向,结果是由一系列随机决策决定的。创建一个RandomWalk雷,随机的选择前进的方向,一共有三个属性一个是存储随机漫步次数的变量,其他两个是列表,分别存储随机漫步经过的每个点的x和y坐标。
代码:

from random import choice
class RandomWalk():
	"一个生成随机漫步数据的表"
	def __init__(self, num_points = 5000):
		"""初始化随机漫步的属性"""
		self.num_points = num_points
		# 所有随机漫步都起始于(0, 0)
		self.x_values = [0]
		self.y_values = [0]
	def fill_walk(self):
		"""计算随机漫步包含的所有点"""
		# 不断漫步,直到列表达到指定的长度
		while len(self.x_values) < self.num_points:
			# 决定前进的方向以及沿这个方向前进的距离
			x_direction = choice([-1, 1])
			x_distance = choice([0, 1, 2, 3, 4])
			x_step = x_distance * x_direction 
			y_direction = choice([-1, 1])
			y_distance = choice([0, 1, 2, 3, 4])
			y_step = y_distance * y_direction
			# 拒绝原地踏步
			if x_step == 0 and y_step == 0:
				continue
			# 计算下一个点的x和y值
			next_x = self.x_values[-1] + x_step
			next_y = self.y_values[-1] + y_step
			self.x_values.append(next_x)
			self.y_values.append(next_y)
# 不断的模拟随机漫步
while True:
	# 创建一个RandomWalk实例,将其包含的点绘制出来
	rw = RandomWalk()
	rw.fill_walk()
	point_numbers = list(range(rw.num_points))
	plt.scatter(rw.x_values, rw.y_values, c = point_numbers, cmap = plt.cm.Blues, 
		edgecolor = 'none', s = 5 
	# 突出起点和终点
	plt.scatter(0, 0, c='green', edgecolors = 'none', s = 100)
	plt.scatter(rw.x_values[1], rw.y_values[-1], c = 'red', edgecolors = 'none', s = 100)
	# 隐藏坐标轴
	# plt.axes().get_xaxis().set_visible(False)
	# plt.axes().get_yaxis().set_visible(False)
	plt.show()
 	keep_running = input("Make another walk? (y/n): ")
	if keep_running.lower().startswith('n'):
		break

运行结果:
Python初学者练习实例(含问题分析+代码)_第8张图片
Python初学者练习实例(含问题分析+代码)_第9张图片

15.编写程序,生成一个包含20个随机整数的列表,然后删除所有奇数

问题分析:按照题目要求生成列表,然后运用for循环进行遍历,在遍历过程中判断是否是奇数,即是否可以整除2,不能整除就是奇数,将其删除。
代码:

import random 
x = [random.randint(0,100)for i in range(20)]
print(x)
for i in range(len(x))[::-1]:
    if x[i]%2 ==1:
        del x[i]
print(x)

运行结果:
在这里插入图片描述

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

问题分析:
以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于2时需考虑多加一天。
代码:

date = input("输入年月日(yyyy-mm-dd):")
y,m,d = (int(i) for i in date.split('-'))
sum=0
special = (1,3,5,7,8,10)
for i in range(1,int(m)):
    if i == 2:
        if y%400==0 or (y%100!=0 and y%4==0):
            sum+=29
        else:
            sum+=28
    elif(i in special):
        sum+=31
    else:
        sum+=30
sum+=d
print("这一天是一年中的第%d天"%sum)

运行结果:
在这里插入图片描述

你可能感兴趣的:(python,机器学习)