《Python程序设计基础》【第三章】习题
#1 一年365天,初始值水平值为1.0,每工作一天水平增加N,不工作是水平不下降,,一周连续工作4天,请编写程序运算结果并填写下表:
N 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.010 年终值
N=0.001
for i in range(10):
day = 1
result = 1 # 初始值
while (day <= 365):
if day%7 in [1,2,3,4]:
result = result * (1 + N)
day += 1
print("{:.3f}:{}".format(N,result))
N=N+0.001
输出结果:
0.001:1.2323163005439783
0.002:1.5182867431621188
0.003:1.870229922988007
0.004:2.303275972345272
0.005:2.8360044444047596
0.006:3.491226058242302
0.007:4.296940556228787
0.008:5.287510111325379
0.009:6.505096500264536
0.010:8.001420979242294
心得:
(1)这个问题涉及到对每一天是星期几的判断,因此可使用“模运算”进行day变量进行映射。
(2)一开始使用了N+=0.001的方法,发现卡在了N在第九次循环时值为0.00900...001,因此边界情况0.01丢失了。这是由于浮点数精确度有限所导致的,因此解决的方法是边界情况设为N>0.01001之类,或者直接使用range(10)规定循环次数。若需打印出N,则课通过format方法进行格式控制。
#2 一年360天,初始水平值为1.0,以每个月30天计算,在每个月月初连续10天里,每工作一天水平增加N,该月其他时间工作与否都不增加水平值。请运算结果并填写下表。
N 0.001 0.002 0.003 0.004 0.005 0.006 0.007 0.008 0.009 0.010 年终值
N=0.001
while(1):
day=1
result=1.0
while (day<=360):
if day%30 in range(1,11):
result*=(1+N)
day+=1
print("{:.3f} : {}".format(N,result))
N+=0.001
if round(N,6)>0.01: #使用round()保留一定的小数位数解决浮点数精确度带来的问题
break
输出结果:
0.001 : 1.1274292488610933
0.002 : 1.2709444932274685
0.003 : 1.4325571693064072
0.004 : 1.614527836041606
0.005 : 1.819396734032291
0.006 : 2.0500180567980495
0.007 : 2.309598380981194
0.008 : 2.601739755279334
0.009 : 2.9304880073702093
0.010 : 3.3003868945736694
#3带刷新的文本条
import time
scale=50
print("{:-^50}".format("start"))
for i in range(scale+1):
a='*'*i
b='.'*(scale-i)
number=i/scale*100 #a为进度条中已加载的部分,b为未加载的部分,number显示加载量
t=time.perf_counter() #t为秒表计时值
print("\r{:^3.0f}%[{}->{}]{:.2f}s".format(number,a,b,t),end='')
time.sleep(0.05)
print("\n{:-^50}".format("finish!"))
输出结果:
心得:
(1)书上用的秒表计时方法time.clock()已经被新版本的time.perf_counter()方法代替
(2)每次循环的最后使用了time.sleep()方法进行了一段时间的暂停以达到加载的视觉效果
(3)\r实现单行文本刷新效果
#4【天天向上续】假设能力增长值符合模型:以7天为周期,连续学习3天能力值不变从第四天开始至第七天每天增长为前一天的1%。如果7天中有1天间断学习,则周期从头计算。现固定每10天休息一天,365天后能力值为多少?如果每15天休息一天呢?
for N in [10,15]:
result = 1.0
day = 1
while day<=365:
if (day%N) in [1,2,3]:
result=result #开始的3天
elif (day%N) ==0: #周期的最后一天
result=result
else: #中间的几天
result = result*(1+0.01)
day+=1
print("{}天周期年终值:{}".format(N,result))
输出结果:
10天周期年终值:8.751036285544979
15天周期年终值:14.108648906301106
#5回文数判断。如果任意自然数n的各位数字反向排列所得自然数仍为本身,则称n为回文数。从键盘输入一个任意位数字,请编写程序判断这个数字是不是回文数。
while True:
numberstr = input("Enter your 5-digit-number:(enter 'q' to finish the test)")
if numberstr=='q': #退出循环情况
break
elif numberstr.isnumeric(): #字符串中无异常字符则符合要求进入判断测试
#测试部分
n=len(numberstr)
isp=1 #isp作为判断回文数的单出口布尔判据
for i in range(n):
if numberstr[i]==numberstr[n-i-1]:
continue
else:
isp=0
break
if (isp):
print("{} is a palindrome number.".format(numberstr))
else:
print("{} is not a palindrome number.".format(numberstr))
else: #字符串中出现非数字型字符
print("Wrong format!")
心得:
(1)原题为输入5位数数字,我在此基础上拓展成任意位数。最开始在测试部分中出现了“string index out of range”的情况,最后通过debug,发现了用长度表示索引时漏减一的情况
(2)运用了分层次的条件判断和单出口思想
(3)使用了str.isnumeric()方法对字符串进行检测
#6打印如下形式的文本进度条:
Starting...Done!
import time
x='a'
for i in range(50):
if x=='a':
x='b'
print("\rStarting ",end='')
time.sleep(0.3)
continue
elif x=='b':
x='c'
print("\rStarting. ",end='')
time.sleep(0.3)
continue
elif x=='c':
x='d'
print("\rStarting.. ",end='')
time.sleep(0.3)
continue
else:
x='a'
print("\rStarting...",end='')
time.sleep(0.3)
continue
print("\rStarting...Done!")
心得:
(1)time.sleep()实现暂停达到动态效果
(2)通过x变量划分三种文本情况
(3)\r实现单行文本刷新
#7使用print()函数输出田字格:
line1='+' + 4*' - ' + ' + ' + 4*' - ' + ' + '
line2='|' + 4*' ' + ' | ' + 4*' ' + ' | '
for i in range(11):
if i in [0,5,10]:
print(line1)
else:print(line2)
输出结果:
心得:
运用了字符串的基本运算