前言
前面的python基础部分都学习完了,那么剩下的只有练习了,对于很多精通python的人而言,没有捷径可言、唯手熟尔。一旦缺少持久的练习,就会对很多知识点选择性遗忘,尽管能从百度找到答案,但作者建议:不要每次都去百度,要学会自己解决问题。练习篇会从一些经典的练习题或面试题进行讲解。
练习
天下武功,唯快不破。为什么?因为快,敌人无法及时作出回应,便已经输了。那么开发一途,唯有勤加苦练。但是也需要一点点技巧,不能盲目。
计算器
卖橘子的计算器:写一段代码,提示用户输入橘子的价格,然后随机生成购买的斤数(5到10斤之间),最后计算出应该支付的金额!
分析
这里面涉及多个基础知识的应用,如输入input、随机数的产生random、计算涉及的运算、扩展的话应该还有异常及条件判断
- input函数的处理,接收数据后的类型只能是字符串,那么在算术运算时需要的是int或者float类型
import random
try:
price = float(input("请输入橘子的价格:"))
except:
print("输入数据错误")
raise
weight = random.randint(5,10)
money = round(price * weight,2)
print("用户购买{}斤橘子,应付{}元。".format(weight,money))
- 思考点1:对于输入的价格,为什么是float而不是int?
- 思考点2:最后计算的金额,为什么要使用round()函数?或者有什么其他用法代替?
猜数字
程序会随机生成一个1-9之间数值,提示用户猜数字,猜错继续猜(需要给出提示大小,让用户继续输入),猜对了则退出程序。加个条件,用户只有3次机会,不能无限次输入,因为总会猜对。
分析
提取题目描述的关键信息:随机数random、循环while、break关键字、有限制次数
- break关键字的用法,在循环体中,执行到break程序会中断退出,不会再执行后面的代码
import random
guess = random.randint(1,9)
i = 0
while i < 3:
guest=int(input("请用户输入1-9范围的整数,不能是小数(仅有3次机会):"))
if guest > guess:
print("用户输入数值大了,请重新输入:")
elif guest < guess:
print("用户输出数值小了,请重新输入:")
else:
print("恭喜用户猜对了。")
break
i += 1
猜拳
这个游戏和猜数字差不多,但是多了一点点运算,且看要求如何:提示用户输入要出的拳:石头(1)/剪刀(2)/布(3)/退出(4) 电脑随机出拳比较胜负,显示 用户胜、负还是平局;注意:用户有权选择退出游戏,且每次猜拳电脑也要随机,而不像上次猜数字那样电脑只在当前运行中随机产生一次;所以不限次数。
分析
所以电脑出拳要在循环体类,保证用户每次出拳,电脑也随机出拳;根据要求,肯定是需要一个变量来储存石头剪刀布。
- 分析数据特点,有数字和中文,那么何种方式来储存数据呢?两个方案:一是字典,二是随机函数;下面会给两个方案都演示一个案例:
方案一:字典储存猜拳数据
import random
guess_dic = {
1:"石头",2:"剪刀",3:"布"}
while True:
guest = int(input("请用户输入1-4的整数,分表代表:石头(1)/剪刀(2)/布(3)/退出(4),开始猜拳:"))
com_guess = random.randint(1,3)
if guest == 4:
print("选择出游戏或输入数字不在范围内退出游戏!!!")
break
elif (guest==1 and com_guess==3) or (guest==2 and com_guess==1) or (guest==3 and com_guess==2):
print("用户出拳:{},电脑也出拳:{},电脑赢了!".format(guess_dic.get(guest),guess_dic.get(com_guess)))
elif guest == com_guess:
print("用户出拳:{},电脑也出拳:{},平局!".format(guess_dic.get(guest),guess_dic.get(com_guess)))
else:
print("用户出拳:{},电脑也出拳:{},用户赢了!".format(guess_dic.get(guest),guess_dic.get(com_guess)))
- 小技巧:列举电脑赢的所有组合及平局的情况,那么剩下的就是用户赢,同时作者一边写也在一边测试,
方案二:列表储存,随机选择
import random
guess_lis = ["石头","剪刀","布"]
while True:
guest = int(input("请用户输入1-4的整数,分表代表:石头(1)/剪刀(2)/布(3)/退出(4),开始猜拳:"))
com_guess = guess_lis.index(random.choice(guess_lis)) + 1
if guest == 4:
print("选择出游戏或输入数字不在范围内退出游戏!!!")
break
elif (guest==1 and com_guess==3) or (guest==2 and com_guess==1) or (guest==3 and com_guess==2):
print("用户出拳:{},电脑也出拳:{},电脑赢了!".format(guess_lis[guest-1],guess_lis[com_guess-1]))
elif guest == com_guess:
print("用户出拳:{},电脑也出拳:{},平局!".format(guess_lis[guest-1],guess_lis[com_guess-1]))
else:
print("用户出拳:{},电脑也出拳:{},用户赢了!".format(guess_lis[guest-1],guess_lis[com_guess-1]))
- 缺点:复杂度高了很多,电脑的随机出拳,是先随机选择列表,再得到索引,最后还得加1才能跟用户比较,否则用户赢面很大。
九九乘法表
作为经典的面试题,练习必不可少。提示:熟练掌握嵌套循环
嵌套for循环
for i in range(1,10):
for j in range(1,i+1):
print("{} * {} = {}".format(i,j,i*j),end=" ")
print(" ")
嵌套while循环
i = 1
while i <= 9:
j = 1
while j <= i:
print("{} * {} = {}".format(i, j, i * j), end=" ")
j += 1
i += 1
print("")
- 点评:相较而言for循环实现会比较简单且不易出错,while关于变量的运算位置,可能会导致出错,例如j在最外层初始化,可能的情况是只得到1-9的乘法结果
总结
这篇练习比较综合,复习了数据类型、运算、循环、条件控制等基础语法;下一篇还会从这些方面来复习,唯有通过更多的练习来巩固所学的知识,作者也权当复习了。