《Python程序设计基础》【第三章】习题

#1 一年365天,初始值水平值为1.0,每工作一天水平增加N,不工作是水平不下降,,一周连续工作4天,请编写程序运算结果并填写下表:

N0.0010.0020.0030.0040.0050.0060.0070.0080.0090.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,该月其他时间工作与否都不增加水平值。请运算结果并填写下表。

N0.0010.0020.0030.0040.0050.0060.0070.0080.0090.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)

输出结果:

 心得:

        运用了字符串的基本运算