700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Python快速编程入门 第2版 实训案例及课后编程题

Python快速编程入门 第2版 实训案例及课后编程题

时间:2021-03-31 22:09:39

相关推荐

Python快速编程入门 第2版 实训案例及课后编程题

目录

本文档仅供参考,更新了

第2章

第3章

第4章

第5章

第6章

第7章

本文档仅供参考,更新了6、7章

第2章

2.4.1打印购物小票

蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行、地铁出行、在线消费等行为,可在蚂蚁森林中获取能量,当能量到达一定数值后,用户可以在支付宝中申请一颗虚拟的树,申请成功后会收到支付宝发放的一张植树证书。植树证书中包含申请日期、树苗编号等信息,具体如图2-1所示。

图2-1

import datetimei = datetime.datetime.now()opp1 = int(input('金士顿U盘8GB购买的数量:'))opp2 = int(input('胜创16GBTF卡购买的数量:'))opp3 = int(input('读卡器购买的数量:'))opp4 = int(input('网线2米购买的数量:'))print('.'*35)print('单号:DH09230001')print('时间:%s'%i)print('='*35)a1=40a2=50a3=8a4=5sum1=opp1+opp2+opp3+opp4money1=opp1*a1money2=opp2*a2money3=opp3*a3money4=opp4*a4sum2=money1+money2+money3+money4print('名称 数量 单价 金额')print('金士顿U盘8GB %s %.2f %.2f'%(opp1,a1,money1))print('胜创16GBTF卡 %s %.2f %.2f'%(opp2,a2,money2))print('读卡器%s %.2f %.2f'%(opp3,a3,money3))print('网线2米 %s %.2f %.2f'%(opp4,a4,money4))print('='*35)print('总数:%s'%sum1+' 金额:%.2f'%sum2)print('折后总额:%.2f'%sum2)print('实收:%.2f'%sum2+' 找零:0.00')print('收银:管理员')print('.'*35)

运行结果:

2.4.2 打印蚂蚁森林植树证书

蚂蚁森林是支付宝客户端发起“碳账户”的一款公益活动:用户通过步行、地铁出行、在线消费等行为,可在蚂蚁森林中获取能量,当能量到达一定数值后,用户可以在支付宝中申请一颗虚拟的树,申请成功后会收到支付宝发放的一张植树证书。植树证书中包含申请日期、树苗编号等信息,具体如图2-2所示。

图2-2

import timeimport datetimeyear = datetime.datetime.now().yearmonth = datetime.datetime.now().monthday = datetime.datetime.now().dayx = input('请输入你想要种植的数:')print(' 植树证书1 \n')print('谢谢你 \n')print(f'你于{year}年{month}月{day}日申请种植的%s,\n已被中国扶贫基金会认领,将种植到\n威武地区。'%(x))print('\n\n 树苗编号 ')print(' NO.HFK20308960305')

运行结果:

2.7.1绝对温标

绝对温标又称开氏温标、热力学温标,是热力学和统计物理中的重要参数之一,也是国际单位制七个基本物理量之一。绝对温标的单位为开尔文(简称开,符号为K),绝对温标的零度对应我们日常使用的摄氏温度(单位为摄氏度,简称度,符号为℃)的-273.15℃。本实例要求编写代码,实现将用户输入的摄氏温度转换为以绝对温标标识的开氏温度的功能。

celsius = float(input("请输入摄氏温度:"))kelvin = celsius + 273.15print(celsius,"℃对应的开尔文为:",kelvin)

运行结果:

2.7.2身体质量指数

BMI指数即身体健康指数,它与人的体重和身高相关,是目前国际常用的衡量人体胖瘦程度以及是否健康的一个标准。已知BMI值的计算公式如下:

体质指数(BMI)=体重(kg)÷身高^2(m)

本实例要求编写代码实现根据用户输入的身高体重计算BMI指数的功能。

height = float(input('请输入您的身高(m):'))weight = float(input('请输入您的体重(kg):'))BMI = weight / (height ** 2)print('您的BMI值为:',BMI)

运行结果:

课后编程题1:编写程序,要求程序能根据用户输入的圆的半径数据计算圆的面积(圆的面积公式:S=πr2),并分别输出圆的直径和面积。

r = float(input('请输入圆的半径:'))d = 2 * rarea = 3.14 * (r**2)print('圆的直径为:',d)print('圆的面积为:',area)

运行结果:

课后编程题2:已知某煤场有29.5t煤,先用一辆载重4t的汽车运3次,剩下的用一辆载重为2.5t的汽车运输,请计算还需要运送几次才能送完?编写程序,解答此问题。

sum = 29.5a = sum-4*3b = int(a/2.5)print('还需要运算的次数为:',b)

运行结果:

第3章

3.2.1计算器

计算器极大地提高了人们进行数字计算的效率与准确性,无论是超市的收银台,还是集市的小摊位,都能够看到计算器的身影。计算器最基本的功能是四则运算。本实例要求编写代码,实现计算器的四则运算功能。

a = float(input('请输入第一个数:'))b = float(input('请输入第二个数:'))c = input('请选择运算符:+ - * /:')if c=='+':print(a+b)elif c=='-':print(a-b)elif c=='*':print(a*b)elif c=='/':if b==0:print('除数不能为0')else:print(a/b)

运行结果:

3.2.2猜数字

猜数游戏是一个古老的密码破译类、益智类小游戏,通常由两个人参与,一个人设置一个数字,一个人猜数字,当猜数字的人说出一个数字,由出数字的人告知是否猜中:若猜测的数字大于设置的数字,出数字的人提示“很遗憾,你猜大了”;若猜测的数字小于设置的数字时,出数字的人提示“很遗憾,你猜小了”;若猜数字的人在规定的次数内猜中设置的数字,出数字的人提示“恭喜,猜数成功”。

本实例要求编写程序,实现上述规则的猜数字游戏,并限制猜数机会只有5次。

num = input('请设定一个数字:')for degree in range(1,6):number = input(f'请输入第{degree}次猜测的数字:')if int(number)<0 or int(number)>100:print('请输入1-100范围的数字')elif int(num) == int(number):print('恭喜猜数成功')breakelif int(num) > int(number):print('很遗憾,你猜小了')else:print('很遗憾,你猜大了')if degree == 5:print('很遗憾,猜数机会用完了')

运行结果:

3.4.1逢7拍手游戏

逢7拍手游戏的规则是:从1开始顺序数数,数到有7或者包含7的倍数的时候拍手。本实例要求编写程序,模拟实现逢七拍手游戏,输出100以内需要拍手的数字。

for i in range(1,101):if "7" in str(i) or int(i)%7==0:print("拍手",end=' ')elif "7" not in str(i) or int(i)%7!=0:print(i,end=' ')if i%20==0: #每隔20个换行print('\n')

运行结果:

3.4.2打印五子棋棋盘

五子棋是一种由双人对弈的纯策略型棋类游戏,它使用的棋盘一般由横纵等距的各15条平行线构成,这些线垂直交叉形成的225个交叉点为对弈双方的落子点。本案例要求编写代码,实现按用户要求打印指定大小的五子棋棋盘的程序(10×10的五子棋棋盘如图3-1所示)。

3-1五子棋棋盘示例

size = int(input('请输入棋盘的大小:'))for i in range(size):for j in range(size):if i==0 and j==0:print('┌',end='')elif i==0 and j==size-1:print('┐',end='')elif i==size-1 and j==0:print('└',end='')elif i==size-1 and j==size-1:print('┘',end='')elif j==0:print('├',end='')elif i==size-1:print('┴',end='')elif j==size-1:print('┤',end='')elif i==0:print('┬',end='')else:print('┼',end='')print('')

运行结果:(因为符合原因,运行出来会有些粗糙,见谅)

3.6房贷计算器

房贷计算器是支付宝平台中搭载的一款在线计算工具,按用户选择的贷款类型(商业贷款、公积金贷款、组合贷款)、贷款金额(万)、期限(年)、利率(%)可计算得出每月月供参考(元)、支付利息(元)、还款总额(元)这些信息,关于这些信息的计算方式如下:

每月月供参考=贷款金额×[月利率×(1+月利率)^还款月数]÷{[(1+月利率)^还款月数]-1}

还款总额=每月月供参考×期限×12

支付利息=还款总额-贷款金额×10000

以上计算方式中月利率(月利率=利率÷12)指以月为计息周期计算的利息。不同贷款类型的利率是不同的:对于商业贷款而言,五年以下(含五年)的贷款利率是4.75%,五年以上的贷款利率是4.90%;对于公积金贷款利率而言,五年以下(含五年)的贷款利率是2.75%,五年以上的利率是3.25%。

本案例要求编写程序,根据以上计算方式开发一个房贷计算器。

# 等额本息(均使用基准利率)# 组合贷可作为课后习题# 商业贷款利率:4.9%# 公积金利率:3.25%# 每月还款额=贷款本金×[月利率×(1+月利率) ^ 还款月数]÷{[(1+月利率) ^ 还款月数]-1}while True:loan_type = input("请选择贷款类型:1.商业贷款 2.公积金贷款 3.组合贷款\n")# 贷款金额if loan_type != '3':loan_amount = float(input("请输入贷款金额(万)\n"))term = int(input("请选择期限(年):5、10、15、20、25\n"))if term in [5,10,15,20,25]:if term==5:mon_rate = (4.75 / 100) / 12 # 计算月利率# 计算每月应还金额mon_pay = loan_amount * 10000 * (mon_rate * ((1 + mon_rate) ** (term * 12))) / (((1 + mon_rate) ** (term * 12)) - 1)# 计算还款总额all_pay = mon_pay * term * 12# 计算支付利息interest = all_pay - loan_amount * 10000print("每月月供参考(元):{:.2f}元".format(mon_pay))print("支付利息(元):{:.2f}元".format(interest))print("还款总额(元):{:.2f}元".format(all_pay))else:# 商业贷款if loan_type == '1': # 商业贷款mon_rate = (4.90 / 100) / 12 # 计算月利率# 计算每月应还金额mon_pay = loan_amount * 10000 * (mon_rate * ((1 + mon_rate) ** (term * 12))) / (((1 + mon_rate) ** (term * 12)) - 1)# 计算还款总额all_pay = mon_pay * term * 12# 计算支付利息interest = all_pay - loan_amount * 10000print("每月月供参考(元):{:.2f}元".format(mon_pay))print("支付利息(元):{:.2f}元".format(interest))print("还款总额(元):{:.2f}元".format(all_pay))elif loan_type == '2': # 公积金贷款if term==5:mon_rate = (2.75 / 100) / 12 # 计算月利率else:mon_rate = (3.25 / 100) / 12 # 计算月利率# 计算每月应还金额mon_pay = loan_amount * 10000 * (mon_rate * ((1 + mon_rate) ** (term * 12))) / (((1 + mon_rate) ** (term * 12)) - 1)# 计算还款总额all_pay = mon_pay * term * 12# 计算支付利息interest = all_pay - loan_amount * 10000print("每月月供参考(元):{:.2f}元".format(mon_pay))print("支付利息(元):{:.2f}元".format(interest))print("还款总额(元):{:.2f}元".format(all_pay))else:print('请输入合法的期限')else:# 商贷金额business_loan = float(input("请输入商业贷款金额(万):\n"))# 公积金贷款fund_loan = float(input("请输入公积金贷款金额(万):\n"))term = int(input("请选择期限(年):5、10、15、20、25\n"))if term in [5, 10, 15, 20, 25]:if term ==5:business_mon_rate = (4.75 / 100) / 12 # 商贷月利率found_mon_rate = (2.75 / 100) / 12 # 公积金月利率else:business_mon_rate = (4.90 / 100) / 12 # 商贷月利率found_mon_rate = (3.25 / 100) / 12 # 公积金月利率# 计算商业贷款 每月应还金额business_mon_pay = business_loan * 10000 * (business_mon_rate * ((1 + business_mon_rate) ** (term * 12))) / (((1 + business_mon_rate) ** (term * 12)) - 1)# 计算公积金贷款 每月应还金额found_mon_pay = fund_loan * 10000 * (found_mon_rate * ((1 + found_mon_rate) ** (term * 12))) / (((1 + found_mon_rate) ** (term * 12)) - 1)# 每月总应还mon_all_pay = business_mon_pay + found_mon_payall_pay = mon_all_pay * term * 12# 计算支付利息interest = all_pay - (business_loan + fund_loan)*10000print("每月月供参考(元):{:.2f}元".format(mon_all_pay))print("支付利息(元):{:.2f}元".format(interest))print("还款总额(元):{:.2f}元".format(all_pay))else:print('请输入合法的期限')

运行结果:

课后编程题1:编写程序,实现利用while循环输出100以内偶数的功能。

i = 0while i<101:if i%2==0 and i!=0:print(i,end=' ')if i % 40 == 0:print('\n')i+=1

运行结果:

课后编程题2:编写程序,实现判断用户输入的数是正数还是负数的功能。

i = float(input('请输入一个数:'))if i==0:print(f'{i}既不是正数也不是负数')elif i>0:print(f'{i}是一个正数')else:print(f'{i}是一个负数')

运行结果:

课后编程题2:编写程序,实现输出100以内质数的功能。

for i in range(2,100): #先取100以内的数for j in range(2,i): #再取小于i取得数if i%j == 0: #较大的数除以较小的数break #如果取余为0表示J是i的因子,舍去,结束本次i所在数的所有循环else:print(i,end=' ') #无法整除所有j,则无因子

运行结果:

第4章

4.3.1进制转换

十进制是实际应用中最常使用的计数方式,除此之外,还可以采用二进制、八进制或十六进制计数。本实例要求编写代码,实现将用户输入的十进制整数转换为指定进制的功能。

num = int(input('请输入要转换的数据:\n'))ch = input('请选择转换进制:2、8、10、16\n')if ch=='2':print(f'进制转换后的数据为:{bin(num)}')if ch=='8':print(f'进制转换后的数据为:{oct(num)}')if ch=='10':print(f'进制转换后的数据为:{int(num)}')if ch=='16':print(f'进制转换后的数据为:{hex(num)}')'''if ch=='2':print('进制转换后的数据为:{:b}')if ch=='8':print(f'进制转换后的数据为:{:o}')if ch=='10':print(f'进制转换后的数据为:{:d}')if ch=='16':print(f'进制转换后的数据为:{:x}')'''

运行结果:

4.3.2 文本进度条

进度条一般以图形的方式显示已完成任务量和未完成任务量,并以动态文字的方式显示任务的完成度。

import timeincomplete_sign = 50 # .的数量print('='*23+'开始下载'+'='*25)for i in range(incomplete_sign + 1):completed = "*" * i # 表示已完成incomplete = "." * (incomplete_sign - i) # 表示未完成percentage = (i / incomplete_sign) * 100 # 百分比print("\r{:.0f}%[{}{}]".format(percentage, completed, incomplete), end="")time.sleep(0.5)print("\n" + '='*23+'下载完成'+'='*25)

运行结果:

4.5.1 过滤敏感词

敏感词通常是指带有敏感政治倾向、暴力倾向、不健康色彩的词或不文明的词语,对于文章中出现的敏感词常用的处理方法是使用特殊符号(如“*”)对敏感词进行替换。本实例要求编写代码,实现具有过滤敏感词功能的程序。

ch = '暴力''你好' #敏感词test =input('请输入一段话:')for line in ch:if line in ch:test = test.replace(line,'*')print(test)

运行结果:

4.5.2 文字排版工具

文字排版工具是一款强大的文章自动排版工具,它会将文字按现代汉语习惯及发表出版要求进行规范编排。文字排版工具一般具备删除空格、英文标点替换、英文单词大写功能,本实例要求编写代码,实现具有上述功能的文字排版工具。

string = input('请输入一句话:')print('1.删除空格')print('2.英文标点替换')print('3.英文单词大写')print('4.退出')while True:option = input('请输入功能选项:\n')if option=='1':string = string.replace(' ','')print(string)elif option=='2':string = string.replace(',',',')string = string.replace('.', '。')string = string.replace('"', '“')print(string)elif option=='3':string = string.upper()print(string)elif option=='4':break

运行结果:

课后编程题1:编写程序,已知字符串s=‘AbcDeFGhIJ’,计算该字符中小写字母的数量

s = 'AbcDeFGhIJ'num = 0for i in range(len(s)):if 'a'<=s[i]<='z':num+=1print('小写字母的个数为:%d'%num)

运行结果:

课后编程题2:编写程序,检查字符串“Life is short. I use python”中是否包含字符串“python”,若包含则替换为“Python”后输出新字符串。否则输出原字符串。

s = 'Life is short.I use python'if 'python' in s:print(s.replace('python','Python'))else:print(s)

运行结果:

第5章

5.4.1十大歌手

为丰富校园文化生活,学校拟组织一场歌手大赛,从参赛选手中选拔出十名相对突出的学生,授予“校园十大歌手”称号。比赛之中设置有评委组,每名选手演唱完毕之后会由评委组的十名评委打分。为保证比赛公平公正、防止作弊和恶意打分,计算得分(即平均分)时会先去掉最高分和最低分。

本案例要求编写程序,实现根据需求计算每位选手得分的功能。

# 评分列表score_li = []# 总分total_score = 0for i in range(1, 11):score = float(input(f"请第{i}位评委输入评分:\n"))score_li.append(score)score_li.sort()print(f"去掉最低分:{score_li[0]}")print(f"去掉最高分:{score_li[len(score_li)-1]}")# 去掉最低分score_li.remove(score_li[0])# 去掉最高分score_li.pop()for j in score_li:total_score += jprint(f'选手最终得分为:{total_score/(len(score_li))}')

运行结果:

5.4.2神奇魔方阵

魔方阵又称纵横图,是一种n行n列、由自然数1~n×n组成的方阵,该方阵中的数符合以下规律:

(1)方阵中的每个元素都不相等。

(2)每行、每列以及主、副对角线上的个元素之和都相等。

本案例要求编写程序,输出一个5行5列的魔方阵。

n = 5# 5*5二维列表magic_square = [[0 for x in range(n)] for y in range(n)]i = n / 2j = n - 1num = 1while num <= (n * n):if i == -1 and j == n:j = n - 2i = 0else:if j == n:j = 0if i < 0:i = n - 1if magic_square[int(i)][int(j)]:j = j - 2i = i + 1continueelse:magic_square[int(i)][int(j)] = numnum = num + 1j = j + 1i = i - 1for i in range(0, n):for j in range(0, n):print('%2d ' % (magic_square[i][j]),end='')if j == n - 1:print()

运行结果:

5.7.1青春有你

如今两年偶像选秀节目风头正盛,吸引了许多喜欢唱跳、有明星梦想的少男少女参加,青春有你正是节目之一。青春有你采用计票机制,选手获得的票数越多,排名就越靠前。本案例要求编写程序,接收选手的姓名和票数,输出排序后的成绩。

player_info = {}li = []print('输入quit表示选手成绩录入完毕')while True:name = input("请输入选手名称:\n")if name == 'quit':breakscore = float(input("请输入选手票数:\n"))player_info[name] = scoreitems = player_info.items()for j in items:li.append([j[1], j[0]])# 转换为list类型,进行排序li.sort()# 获取选手索引count = len(li) – 1# 输出排名for i in range(1, len(li) + 1):print(f"第{i}名:{li[count][1]},成绩为{li[count][0]}分")count -= 1

运行结果:

5.7.2手机通讯录

通讯录是记录了联系人姓名和联系方式的名录,手机通讯录是最常见的通讯录之一,人们可以在通讯录中通过姓名查看相关联系人的联系方式,也可以在其中新增、修改或删除联系人信息。

本案例要求编写程序,实现具备添加、查看、修改以及删除联系人信息功能的手机通讯录。

person_info = []print("=" * 20)print('欢迎使用通讯录:')print("1.添加联系人")print("2.查看通讯录")print("3.删除联系人")print("4.修改联系人信息")print("5.查找联系人")print("6.退出")print("=" * 20)while True:per_dict = {}fun_num = input('请输入功能序号:')if fun_num == '1':per_name = input('请输入联系人的姓名:')phone_num = input('请输入联系人的手机号:')per_email = input('请输入联系人的邮箱:')per_address = input('请输入联系人的地址:')# 判断输入的是否为空if per_name.strip() == '':print('请输入正确信息')continueelse:per_dict.update({'姓名': per_name,'手机号': phone_num,'电子邮箱': per_email,'联系地址': per_address})person_info.append(per_dict) # 保存到列表中print('保存成功')elif fun_num == '2':if len(person_info) == 0:print('通讯录无信息')for i in person_info:for title, info in i.items():print(title + ':' + info)elif fun_num == '3': # 删除if len(person_info) != 0:del_name = input('请输入要删除的联系人姓名:')for i in person_info:if del_name in i.values():person_info.remove(i)print(person_info)print('删除成功')else:print('该联系人不在通讯录中')else:print('通讯录无信息')elif fun_num == '4': # 修改if len(person_info) != 0:modi_info = input('请输入要修改联系人姓名:')for i in person_info:if modi_info in i.values():# 获取所在元组在列表中的索引位置index_num = person_info.index(i)dict_cur_perinfo = person_info[index_num]for title, info in dict_cur_perinfo.items():print(title + ':' + info)modi_name = input('请输入新的姓名:')modi_phone = input('请输入新的手机号:')modi_email = input('请输入新的邮箱:')modi_address = input('请输入新的地址:')dict_cur_perinfo.update(姓名= modi_name)dict_cur_perinfo.update(手机号= modi_phone)dict_cur_perinfo.update(电子邮箱= modi_email)dict_cur_perinfo.update(联系地址= modi_address)print(person_info)else:print('通讯录无信息')elif fun_num == '5': # 查找if len(person_info) != 0:query_name = input('请输入要查找的联系人姓名:')for i in person_info:if query_name in i.values():index_num = person_info.index(i)for title, info in person_info[index_num].items():print(title + ':' + info)breakelse:print('该联系人不在通讯录中')else:print('通讯录无信息')elif fun_num == '6': # 退出break

运行结果:

课后编程1:。已知列表li_num1=[4,5,2,7]和li_num2=[3,6],请将这两个列表合并为一个列表,并将合并后的列表中的元素按降序排序。

li_num1=[4,5,2,7]li_num2=[3,6]li_num3=li_num1+li_num2print(f"合并后的列表为:{li_num3}")li_num3.sort(reverse=True) #降序排序print(f"排序后的列表为:{li_num3}")

运行结果:

课后编程2: 已知元组tu_num1 = ('p','y','t',['o','n']),请向元组的最后一个列表中添加新元素‘h’

tu_num1 = ('p','y','t',['o','n']) #元组是不可变类型,元组中的元素不能修改list = list(tu_num1[3]) #list()函数接收一个可迭代类型的数据,返回一个列表list.append('h') #append()用于在列表末尾添加新元素;extend()用于在列表末尾一次性添加另一个列表中的所有元素;insert()用于按照索引将新元素插入到列表指定位置print(list)tu_num1 = tu_num1[:3]+(list,) #更新元组print(tu_num1)

运行结果:

课后编程3:已知字符串str='skdaskerkjsalkj',请统计该字符串中各字母出现的次数

str='skdaskerkjsalkj'resoult = {} #定义一个空字典for i in str: #遍历输入的字符串,以键值对的方式存储在字典中resoult[i]=str.count(i)for key in resoult: #遍历字典,格式化输出结果print(f'"{key}":出现{resoult[key]}次')

运行结果:

课后编程4:已知列表li_one = [1,2,1,2,3,5,4,3,5,7,4,7,8],请删除列表li_one中的重复数据

li_one = [1,2,1,2,3,5,4,3,5,7,4,7,8]li_two = []for i in li_one:if not i in li_two:li_two.append(i)print(li_two)

运行结果:

第6章

6.6.1角谷猜想

角谷猜想又称冰雹猜想,是由日本数学家角谷静发现的一种数学现象,它的具体内容是:以一个正整数n为例,如果n为偶数,就将它变为n/2,如果除后变为奇数,则将它乘3加1(即3n+1)。不断重复这样的运算,经过有限步后,必然会得到1。据日本和美国的数学家攻关研究,所有小于7×1011的自然数,都符合这个规律。

本案例要求编写代码,计算用户输入的数据按照以上规律经多少次运算后可变为1。

def guess(number):i = 0# 统计变换的次数original_number = number # 记录最初的numberwhile number != 1:if number % 2 == 0: # number为偶数number = number / 2else: # number为奇数number = number * 3 + 1i += 1print(f"{original_number}经过{i}次变换后回到1")num = int(input("请输入一个大于1的正整数:"))guess(num)

运行结果:

6.6.2 饮品自动售货机

随着无人新零售经济的崛起,商场、车站、大厦等各种场所都引入了无人饮品自动售货机,方便人们选购自己想要的饮品。购买者选择想要的饮品,通过投币或扫码的方式支付,支付成功后从出货口取出饮品。本案例要求编写代码,利用函数实现具有显示饮品信息、计算总额等功能的程序。

# 饮品信息def all_goods():goods = {"可口可乐": 2.5, "百事可乐": 2.5, "冰红茶": 3, "脉动": 3.5, "果缤纷": 3, "绿茶": 3, "茉莉花茶": 3, "尖叫": 2.5}return goods# 展示饮品信息def show_goods():for x, y in all_goods().items():print(x, ":", str(y) + "元")# 计算总额def total(goods_dict):count = 0for name, num in goods_dict.items():total_money = all_goods()[name] * num# 总金额count += total_moneyprint("需要支付金额:", count, "元")def main():goods_dict = {}print("饮 品 自 动 售 货 机")show_goods()# 循环选购的商品print("输入q完成购买")while True:goods_name = input("请输入购物的商品:")if goods_name == 'q':breakif goods_name in [g_name for g_name in all_goods().keys()]:goods_num = input("请输入购物数量:")if goods_num.isdigit():goods_dict[goods_name] = float(goods_num)else:print('商品数量不合法')else:print('请输入正确的商品名称')total(goods_dict)if __name__ == '__main__':main()

运行结果:

6.8.1兔子数列

兔子数列又称斐波那契数列、黄金分割数列,它由数学家列昂纳多·斐波那契以兔子繁殖的例子引出,故此得名。兔子繁殖的故事如下:

兔子一般在出生两个月之后就有了繁殖能力,每对兔子每月可以繁殖一对小兔子,假如所有的兔子都不会死,试问一年以后一共有多少对兔子?

本案例要求编写代码,利用递归实现根据月份计算兔子总数量的功能。

def fibonacci(month):if month == 0 or month == 1:return 1else:return fibonacci(month-1) + fibonacci(month-2)# 测试经过12个月份后的兔子对数result = fibonacci(12)print(result)

运行结果:

6.8.2归并排序

归并排序是一种基于归并算法的排序方法,该方法采用分治策略:先将待排序的序列划分成若干长度为1的子序列,依次将两个子序列排序后合并成长度为2的子序列;再依次将两个子序列排序后合并成长度为4的子序列,直至合并成最初长度的序列为止,得到一个排序后的序列。例如,列表[8, 4, 5, 7, 1, 3, 6, 2]的元素采用归并排序的方法进行排列的过程如图6-5所示。

def merge_sort(li):n = len(li)if n == 1:return li# 把数据分成左右两部分mid = n // 2left = li[:mid]right = li[mid:]# 递归拆分left_res = merge_sort(left)right_res = merge_sort(right)# 把下层返回上来的数据,组成有序序列result = merge(left_res, right_res)# 合并return resultdef merge(left, right):result = []left_index = 0right_index = 0while left_index < len(left) and right_index < len(right):if left[left_index] <= right[right_index]:result.append(left[left_index])left_index += 1else:result.append(right[right_index])right_index += 1# while循环结束后,把剩下的数据添加进来result += right[right_index:]result += left[left_index:]return resultif __name__ == '__main__':list_demo = [6, 5, 7, 4, 3, 1]print(merge_sort(list_demo))

运行结果:

6.9 阶段案例——学生管理系统

学生信息是高等院校的一项重要数据资源,具有数量庞大、学员广泛、更新频繁等特点,给管理人员带来了不小的冲击。随着计算机应用的普及,人们使用计算机设计了针对学生信息特点及实际需要的学生管理系统,使用该系统可以高效率地、规范地管理大量的学生信息,减轻了管理人员的工作负担。本案例要求开发一个具有添加、删除、修改、查询学生信息及退出系统功能的简易版学生管理系统,该系统的功能菜单如图6-6所示。

# print_menu():用于打印学生管理系统的功能菜单;# add_stu_info():用于添加学生的信息;# del_stu_info():用于删除学生的信息;# modify_stu_info():用于修改学生的信息;# show_stu_info():用于显示所有学生的信息;# main():主程序,用于控制一次使用学生管理系统的完整流程。# 保存所有的学生信息stu_info = []# 打印功能菜单def print_menu():print('=' * 30)print('学生管理系统 V10.0')print('1.添加学生信息')print('2.删除学生信息')print('3.修改学生信息')print('4.查询所有学生信息')print('0.退出系统')print('=' * 30)# 添加学生信息def add_stu_info():# 提示并获取学生的姓名new_name = input('请输入新学生的姓名:')# 提示并获取学生的性别new_sex = input('请输入新学生的性别:')# 提示并获取学生的手机号new_phone = input('请输入新学生的手机号码:')new_info = dict()new_info['name'] = new_namenew_info['sex'] = new_sexnew_info['phone'] = new_phonestu_info.append(new_info)# 删除学生信息def del_stu_info(student):del_num = int(input('请输入要删除的序号:')) - 1del student[del_num]print("删除成功!")# 修改学生信息def modify_stu_info():if len(stu_info) != 0:stu_id = int(input('请输入要修改学生的序号:'))new_name = input('请输入要修改学生的姓名:')new_sex = input('请输入要修改学生的性别:(男/女)')new_phone = input('请输入要修改学生的手机号码:')stu_info[stu_id - 1]['name'] = new_namestu_info[stu_id - 1]['sex'] = new_sexstu_info[stu_id - 1]['phone'] = new_phoneelse:print('学生信息表为空')# 显示所有的学生信息def show_stu_info():print('学生的信息如下:')print('=' * 30)print('序号 姓名 性别 手机号码')i = 1for tempInfo in stu_info:print("%d %s %s %s" % (i, tempInfo['name'],tempInfo['sex'], tempInfo['phone']))i += 1# 在main函数中执行不同的功能def main():while True:print_menu()# 打印功能菜单key = input("请输入功能对应的数字:") # 获取用户输入的序号if key == '1': # 添加学生信息add_stu_info()elif key == '2': # 删除学生信息del_stu_info(stu_info)elif key == '3': # 修改学生信息modify_stu_info()elif key == '4': # 查询所有学生信息show_stu_info()elif key == '0':quit_confirm = input('亲,真的要退出么?(Yes or No):').lower()if quit_confirm == 'yes':print("谢谢使用!")break # 跳出循环elif quit_confirm == 'no':continueelse:print('输入有误!')if __name__ == '__main__':main()

运行结果:

课后编程1:编写函数,输出1~100中偶数之和

sum=0for i in range(1,101):if i%2==0:sum += iprint(sum)

运行截图:

课后编程2:编写函数,计算20*19*18*...*3的结果

def f(): #def关键字:函数的开始标志s=1for i in range(20,2,-1): #20为开始值,默认从0开始;2为结束值的下标;-1为步进值数据之间相隔s*=ireturn s #return返回函数的处理结果给调用方,是函数结束的标志,若没有返回值,可省略print(f())

运行截图:

课后编程3:编写程序,判断用户输入的整数是否是回文数。回文数是一个正向和逆向都相同的整数,如123454321。

def test(num):if not isinstance(num,int): #isinstance()判断一个对象是否是一个已知的类型print("请输入一个整数!")else:num=str(num)value = num[::1]if value == num:print("{}是回文数".format(num))else:print("{}不是回文数".format(num))num = int(input("请输入一个正整数:"))test(num)

运行截图:

课后编程4:编写函数,判断用户输入的3个数字是否能构成三角形的三条边。

def test(a,b,c):if a<=0 or b<=0 or c<=0:print("三角形的边必须大于0")elif a+b<=c or b+c<=a or a+c<=b:print("两边之和应该大于第三边")else:print("输入的三条边符合三角形的规则")a = float(input("请输入边长a:"))b = float(input("请输入边长b:"))c = float(input("请输入边长c:"))test(a,b,c)

运行截图:

课后编程5:编写函数,求2个正整数的最小公倍数。

def fangfa(a,b):if a>b:bigger=asmaller=belse:bigger=bsmaller=ai=1while True:if (bigger*i)%smaller==0: #如果大的那个数,一旦他的倍数能整除小的那个数,就直接跳出循环,他的倍数就是最小公倍数print('最小公倍数为:',(bigger*i))breaki+=1if __name__ == '__main__':a = int(input('请输入第一个数:'))b = int(input('请输入第二个数:'))fangfa(a,b)

运行截图:

第7章

7.4.1安全策略——文件备份

当下是信息时代,信息在当今社会占据的地位不言而喻,信息安全更是当前人类重视的问题之一。人类考虑从传输和存储两方面保障信息的安全,备份是在存储工作中保障信息安全的有效方式。本案例要求编写程序,实现一个具有备份文件与文件夹功能的备份工具。

import osdef file_backups(file_name, path):# 备份的文件名file_back = file_name.split('\\')[-1]# 判断用户输入的内容是文件还是文件夹if os.path.isdir(file_name) is not True:with open(file_name, mode='r') as file_data:# 创建新文件 , 以只读的方式打开new_path = path + '/' + file_backwith open(new_path, 'w') as file_back:# 逐行复制源文件内容到新文件中for line_content in file_data.readlines():file_back.write(line_content)# 判断是目录还是文件def judge(back_path, file_path):if os.path.isdir(file_path) is True:# 遍历当前目录下的文件file_li = os.listdir(file_path)for i in file_li:# 拼接文件名称new_file = file_path + '\\' + ifile_backups(new_file, back_path)else:# 是文件if os.path.exists((file_path)):file_backups(file_path, back_path)else:print("备份的文件不存在!")exit()# 备份目录def backups_catalog():# 指定备份的目录back_path = input("请输入备份的目录:\n")file_path = input("请输入备份的文件:\n")# 指定目录不存在if os.path.exists(back_path) is False:os.mkdir(back_path) #mkdir()创建目录judge(back_path, file_path)print('备份成功!')# 指定目录存在else:judge(back_path, file_path)print('备份成功!')if __name__ == '__main__':backups_catalog()

运行截图:

7.4.2 用户账户管理

某些网站要求访问者在访问网站内容之前必须先进行登录,若用户没有该网站的账号,则需要先进行注册。用户注册完账号后,网站的服务器会保存账号信息,以便用户下次访问网站时网站可根据保存的信息验证用户的身份。为保障账户安全,用户可时常修改密码;若后续用户不再使用网站,可以选择注销账户。

本案例要求实现包含用户注册、登录、修改密码和注销功能的用户账户管理程序(要求程序使用文件存储用户的账户信息)。

import os# 将文件中的数据转换为字典def convert_data():info_li = []with open('info.txt', mode='r+', encoding='utf8') as f:info_data = f.readlines()for i in info_data:info_dict = dict()# 替换{ 和 } 并去掉空格step_one = i.replace('{', '').replace('}', '')# 以冒号进行分隔step_two = step_one.split(':')# 拼接字典info_dict["姓名"] = step_two[1].split(',')[0].replace("'", '').strip()info_dict["密码"] = step_two[2].replace("'", '').strip()# 保存到列表中info_li.append(info_dict)return info_li# 注册def register():if os.path.exists('info.txt') is not True:with open('info.txt', mode='w', encoding='utf8') as f:f.write('')# 用户名列表name_li = []info_li = convert_data()# 接收注册信息person_info = {}name = input("请输入注册用户名:\n")# 获取用户列名列表for i in info_li:name_li.append(i['姓名'])# 判断用户是否存在if name in name_li:print('用户已注册')else:password = input("请输入注册密码:\n")person_info['姓名'] = nameperson_info['密码'] = password# 写入注册信息with open('info.txt', mode='a+', encoding='utf8') as info_data:info_data.write(str(person_info) + '\n')# 登录def login():if os.path.exists('info.txt') is not True:print('当前无数据,请先注册')else:# 用户名列表name_li = []info_li = convert_data()name = input("请输入登录用户名:\n")password = input("请输入登录密码:\n")# 获取用户列名列表for i in info_li:name_li.append(i['姓名'])# 判断用户是否存在if name in name_li:# 获取修改用户的索引modify_index = name_li.index(name)# 判断密码是否正确if password == info_li[modify_index]['密码']:print('登录成功')else:print('用户名或密码不正确')else:print('用户名或密码不正确')# 注销def cancel():if os.path.exists('info.txt') is not True:print('当前无数据,请先注册')else:cancel_name = input("请输入注销的用户\n")cancel_password = input("请输入密码\n")# 用户名列表name_li = []info_li = convert_data()for i in info_li:name_li.append(i['姓名'])if cancel_name in name_li:# 获取注销用户的索引cancel_index = name_li.index(cancel_name)# 判断输入的密码是否正确if cancel_password == info_li[cancel_index]['密码']:info_li.pop(cancel_index)# 写入空数据with open('info.txt', mode='w+', encoding='utf8') as f:f.write('')for i in info_li:with open('info.txt', mode='a+', encoding='utf8')as info_data:info_data.write(str(i) + '\n')print('用户注销成功')else:print('用户名或密码不正确')else:print('注销的用户不存在')# 修改密码def modify():if os.path.exists('info.txt') is not True:print('当前无数据,请先注册')else:# 用户名列表name_li = []info_li = convert_data()modify_name = input("请输入用户名:\n")password = input("请输入旧密码:\n")# 获取用户列名列表for i in info_li:name_li.append(i['姓名'])# 判断用户是否存在if modify_name in name_li:# 获取修改密码用户的索引modify_index = name_li.index(modify_name)# 判断密码是否正确if password == info_li[modify_index]['密码']:# 修改密码new_password = input("请输入新密码\n")info_li[modify_index]['密码'] = new_passwordwith open('info.txt', mode='w+', encoding='utf8') as f:f.write('')for i in info_li:with open('info.txt', mode='a+', encoding='utf8') as info_data:info_data.write(str(i) + '\n')else:print("用户名或密码不正确")else:print("用户名或密码不正确")def welcome():print("欢迎使用账户管理程序")print("1.用户注册")print("2.用户登录")print("3.用户注销")print("4.修改密码")print("5.退出")while True:option = input("请选择功能\n")# 用户注册if option == '1':register()# 用户登录elif option == '2':login()# 注销elif option == '3':cancel()# 修改密码elif option == '4':modify()elif option == '5':breakif __name__ == '__main__':welcome()

运行截图:

课后编程1:读取一个文件,打印除以字符#开头的行之外的所有行。

name = input('请输入文件名或文件路径:')file = open(name,'r')r=file.readlines()for i in r:if i[0]=='#':continueelse:print(i)file.close()

运行截图:

课后编程2:编写程序,实现文件备份功能。

#1.用户输入目标文件old_name=input('请输入你要备份的文件名:')#提取后缀 找到名字中的点 名字和后缀分离 最右侧的点才是后缀点 查找某个字符串index = old_name.rfind('.')if index>0:postfix = old_name[index:] #提取后缀#新名字=原名字+[备份]+后缀new_name=old_name[:index]+'[备份]'+postfix#备份文件写入数据(数据和原文件一样)old_f=open(old_name,'rb') #rb只读new_f=open(new_name,'wb') #wb只写#原文件读取,备份文件写入while True:content = old_f.read(1024)if len(content)==0:breaknew_f.write(content)old_f.close()new_f.close()

运行截图:

课后编程3:编写程序,读取一个存储若干数字的文件,对其中的数字排序后输出

#只能读取一行数字name = input('请输入文件名或文件路径:')file = open(name,'r')con = file.read()print(f'排序前文件中的数字:{con}')filelist=list(con)filelist.sort()file.close()print('排序后文件中的数字:'+''.join(filelist))

运行截图:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。