《Python高级应用》实验报告
实验名称 : 实验3 程序的控制结构及函数使用
实验日期 : 2021.4.7 姓 名 : 汪珊珊
学 号 : 084619248
班 级 : 计算机192
成 绩 :
人工智能与信息技术学院
南京中医药大学
实验目的:
(1)熟悉 Python程序控制结构使用
(2)熟练使用函数相关操作
(3)掌握pyinstaller库的使用
实验内容和要求
1、猜数游戏。
随机产生一个预设数字,在0~100之间。
用户通过键盘输入想猜数字,如果大于预设数字,显示“遗憾,太大了”;小于预设数字,显示“遗憾,太小了”;当用户输入的不是整数(如字母、浮点数等),给出提示“输入的内容必须是整数”;如此循环,直到猜中该数,显示“预测N次,你猜中了!”,其中N是用户输入的次数。
2、请在实现Fabnacci数列求和的基础上,计算和与任意个输入数字的乘积。要求输入的不是数字时,提示“输入有误”。调用函数时,将函数置于if name==‘main’下运行。
3、获取系统时间,使用七段数码管显示获取到的系统时间。要求美观(间隔、颜色、出现并摆放好“年月日”)
4、倒计时数码管绘制
输入你想从某个数倒计时,绘制对应的数码管。并对最后的倒计时数码管对应的.py代码进行打包,生成.exe文件。
提示:turtle.clear()清空画板
选做:显示“倒计时结束!”,turtle.write()函数
5、验证课件上组合数据类型相关的代码。
运行结果(写清题号)
1.猜数游戏。
随机产生一个预设数字,在0~100之间。
用户通过键盘输入想猜数字,如果大于预设数字,显示“遗憾,太大了”;小于预设数字,显示“遗憾,太小了”;当用户输入的不是整数(如字母、浮点数等),给出提示“输入的内容必须是整数”;如此循环,直到猜中该数,显示“预测N次,你猜中了!”,其中N是用户输入的次数。
import random
guess = 0 # 猜的数字
secert = random.randint(0, 100) # 生成0-100的随机数
times = 1 # 猜的次数
while guess != secert: # 条件
guess = input(‘数字区间0-100,请输入你猜的数字:’)
if type(guess) != int:
print(“输入的内容必须是整数”)
if guess == secert: # 判断猜的数字是否为预设的数字
print(‘你猜了{}次,你猜中了!’.format(times))
else: # 如果不正确
if guess < secert: # 猜的数字小于预设的数字
print(‘遗憾,太小了!’)
else: # 猜的数字大于预设的数字
print(‘遗憾,太大了!’)
times += 1
print(‘游戏结束’)
2.请在实现Fabnacci数列求和的基础上,计算和与任意个输入数字的乘积。要求输入的不是数字时,提示“输入有误”。调用函数时,将函数置于if name==‘main’下运行。
在文件text_A中
num=int(input(“你需要第几项”))
n1=0
n2=1
count=2
if num<=0:
print(“请输入一个正整数”)
elif num==1:
print(n1)
else:
while count<num:
sum=n1+n2
n1=n2
n2=sum
count+=1
print(n2)
if name==‘main’:
print(“name 得到”, name)
print(“n2:”, n2)
from text_A import n2
从text_A中调入变量n2
def main():
print(n2)
if name == ‘main’:
main()
n=int(input(“你要输入几个数”))
list=[]
for i in range(n):
list.append(int(input(“请输入你的值”)))
for i in range(n):
n2=n2*list[i]
print(“乘积是:{}”.format(n2))
exit(0)
3.获取系统时间,使用七段数码管显示获取到的系统时间。要求美观(间隔、颜色、出现并摆放好“年月日”)
import turtle, time
def drawGap():
turtle.speed(0) # 设置画笔速度 “fastest”:0 “fast”:10 “normal”:6 “slow”:3 “slowest”:1
# turtle.Turtle().screen.delay(0) #画笔速度无延迟
turtle.penup()
turtle.fd(5)
def drawLine(draw): # 绘制单段数码管
drawGap()
turtle.speed(0)
# turtle.Turtle().screen.delay(0)
turtle.pendown() if draw else turtle.penup()
turtle.fd(40)
drawGap()
turtle.right(90)
def drawDigit(digit): # 根据数字绘制七段数码管
drawLine(True) if digit in [2, 3, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 3, 4, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 6, 8] else drawLine(False)
turtle.left(90)
drawLine(True) if digit in [0, 4, 5, 6, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 2, 3, 5, 6, 7, 8, 9] else drawLine(False)
drawLine(True) if digit in [0, 1, 2, 3, 4, 7, 8, 9] else drawLine(False)
turtle.left(180)
turtle.penup() # 为绘制后续数字确定位置
turtle.fd(20) # 为绘制后续数字确定位置
def drawDate(date):
turtle.pencolor(“purple”)
for i in date:
if i == ‘+’:
turtle.write(“年”, font=(“Arial”, 18, “normal”))
turtle.pencolor(“pink”)
turtle.fd(40)
elif i == ‘-’:
turtle.write(“月”, font=(“Arial”, 18, “normal”))
turtle.pencolor(“orange”)
turtle.fd(40)
elif i == ‘*’:
turtle.write(“日”, font=(“Arial”, 18, “normal”))
turtle.pencolor(“lightyellow”)
turtle.fd(70)
elif i == '$':
turtle.write("时", font=("Arial", 18, "normal"))
turtle.pencolor("lightgreen")
turtle.fd(40)
elif i == '&':
turtle.write("分", font=("Arial", 18, "normal"))
turtle.pencolor("lightblue")
turtle.fd(40)
elif i == '@':
turtle.write("秒", font=("Arial", 18, "normal"))
else:
drawDigit(eval(i))
def main(): # 主函数
turtle.setup(1600, 1000, 0, 0)
turtle.penup()
turtle.left(90)
turtle.fd(200)
turtle.right(90)
turtle.fd(-600)
turtle.pensize(5)
drawDate(time.strftime("%Y+%m-%d*%H$%M&%S@", time.gmtime()))
turtle.hideturtle()
turtle.done()
main()
4.倒计时数码管绘制
输入你想从某个数倒计时,绘制对应的数码管。并对最后的倒计时数码管对应的.py代码进行打包,生成.exe文件。
提示:turtle.clear()清空画板
选做:显示“倒计时结束!”,turtle.write()函数
import turtle,time
def drawgap():
turtle.penup()
turtle.fd(5)
def drawline(draw):
drawgap()
turtle.pendown()if draw else turtle.penup()
turtle.fd(40)
drawgap()
turtle.right(90)
def drawdigit(digit):
drawline(True) if digit in [2,3,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,1,3,4,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,6,8] else drawline(False)
turtle.left(90)
drawline(True) if digit in [0,4,5,6,8,9] else drawline(False)
drawline(True) if digit in [0,2,3,5,6,7,8,9] else drawline(False)
drawline(True) if digit in [0,1,2,3,4,7,8,9] else drawline(False)
turtle.left(180)
turtle.penup()
turtle.fd(20)
def drawtimecount(t):
for i in range(t+1):
start=time.perf_counter()
drawdigit(t-i)
time.sleep(1-(time.perf_counter()-start))
turtle.clear()
turtle.penup()
turtle.goto(0,0)
turtle.pendown
turtle.pencolor(‘purple’)
turtle.penup()
turtle.goto(-300,-20)
turtle.pendown
turtle.write(‘倒计时结束!’‘TIME IS OVER’,font=(‘楷体’,30,‘normal’))
def main():
turtle.setup(800,350,200,200)
turtle.penup()
turtle.pensize(5)
turtle.speed(0)
drawtimecount(9)
turtle.hideturtle()
turtle.done()
main()
5、验证课件上组合数据类型相关的代码。
实验的体会与建议
1.在条件语句if-else多的情况下格式容易出现问题
2.对题目要求有的时候不太理解,如:第二题
每个 .py 文件都有一个变量名__name__, 这个变量名的值会根据这个文件的用途有两个不同的值。
一、当文件作为模块被其他文件使用时,name 的值是这个文件的模块名[文件名]
二、当文件作为脚本(就是作为可执行文件)使用时,__name__的值是字符串类型的’main’
__name__是python的内置变量,用于表示当前模块的名字
所以if name == ‘main’ 拆开来看其实就是一个 if a == b 的判断语句
当我们在模块 text_B 中调用模块 text_A 中定义的变量x的时候,整个text_A都会执行一遍
之所以没有将text_A的输出显示在text_B上
是因为当文件text_A处于被调用的状态的时候,它的__name__的值已经变成了模块名text_A,,而不是等于字符串"main"