经过这几天的学习,我想用Python编程的思想去思考一下,每天进步一点点和每天退步一点点的问题。
问题一
如果每天在原来的基础上进步千分之一,那么一年365天我们进步了多少?那如果每天退步千分之一,那又是多少?他们相差多少?
1
2
3
4
5
6
7
8
|
dayup = 0.001
daydown = 0.001
up = pow(1+dayup, 365)
dowm = pow(1-daydown, 365)
disparity = round(up/dowm,1)
print("每天进步千分之一,一年后是:{0:.2f}\n"
"每天退步千分之一,一年后是:{1:.2f}\n"
"他们之间的差距:{2:.2f}\n".format(up,dowm,disparity))
|
输出
1
2
3
|
每天进步千分之一,一年后是:1.44
每天退步千分之一,一年后是:0.69
他们之间的差距:2.10
|
总结:在上面的代码中,使用到了两个数学函数,分别是pow(a,b),它的作用跟数学上的a^b(a的b次方)是一致的,另一个是round(<浮点数>,<数值>),作用是去除尾数,保留n位小数。有人说它是四舍五入的方式保留小数,其实是不对的,准确来说它采用了 四舍六入五成双的方式。原理以后再深入。
问题二
如果每天在原来的基础上进步百分之一,那么一年365天我们进步了多少?那如果每天退步百分之一,那又是多少?他们相差多少?
1
2
3
4
5
6
7
8
|
dayup = 0.01
daydown = 0.01
up = pow(1+dayup, 365)
dowm = pow(1-daydown, 365)
disparity = round(up/dowm,1)
print("每天进步百分之一,一年后是:{0:.2f}\n"
"每天退步百分之一,一年后是:{1:.2f}\n"
"他们之间的差距:{2:.2f}\n".format(up,dowm,disparity))
|
输出
1
2
3
|
每天进步百分之一,一年后是:37.78
每天退步百分之一,一年后是:0.03
他们之间的差距:1480.70
|
总结:看到这个结果,实在是太恐怖了,坚持的力量远比我想象中的要大得多的多。
问题二中,没什么新的内容,需要注意的是print输出格式,字符串的格式化输出,用槽{ }引出,{<这里是序号>:.2f},用.format()引出。
问题三
如果一年365天,我们工作日的时候进步1%,双休日的时候退步1%。一年后会发生什么?
1
2
3
4
5
6
7
8
9
|
up = 1.0
dayup = input("请输入进步的程度(格式为:<数字>%):\n")
daydown = input("请输入退步的程度(格式为:<数字>%):\n")
for i in range(365):
if i % 7 in [6,0]: #假设6代表星期6,0代表星期天
up = up*(1-(eval(daydown[:-1])) / 100)
else:
up = up*(1+(eval(dayup[:-1])) / 100)
print("一年后:{0:.2f}\n".format(up))
|
输出
1
2
3
4
5
|
请输入进步的程度(格式为:<数字>%):
1%
请输入退步的程度(格式为:<数字>%):
1%
一年后:4.63
|
总结:可以看到,不间断的进步1%一年后是:37.78。而工作日努力,双休日休息退步的话,一年后是4.63,差距还是没非常大的。
问题三中,复习了字符串的切片操作,在输入进退步的程度时,故意多加了一个百分号,目的是为了让自己更熟悉字符串切片操作,并不是画蛇添足。有意思的是,刚开始我忘了输入进来的是字符串,运行总会出错,后来才发现字符串是不能运算的,必须使用eval()将最外层的引号去除。这点跟c语言有很大的不同。在这段代码中,还利用了循环语句for i in range()。分支判断语句if i in [] 和if else。(要注意的是,在最后要记得加:冒号)
问题四
那如果一年365天,我三天打鱼两天晒网,我打鱼的时候进步1%,我晒网的时候退步2%,情况又会是如何?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
up = 1.0
a= 0
b = 0
day = input("请输入一个完整的周期:\n")
upday = input("请输入一个周期内努力的天数:\n")
dayup = input("请输入努力的程度(格式为:<数字>%):\n")
daydown = input("请输入颓废的程度(格式为:<数字>%):\n")
for i in range(365):
if (i % eval(day)) >= eval(upday):
up = up*(1-(eval(daydown[:-1])) / 100)
a+=1
else:
up = up*(1+(eval(dayup[:-1])) / 100)
b+=1
print("一年后:{0:.2f}\n"
"你努力了%d天\n"
"你颓废了%d天\n".format(up) %(b,a))
|
1
2
3
4
5
6
7
8
9
10
11
|
请输入一个完整的周期:
5
请输入一个周期内努力的天数:
3
请输入努力的程度(格式为:<数字>%):
1%
请输入颓废的程度(格式为:<数字>%):
2%
一年后:0.46
你努力了219天
你颓废了146天
|
**总结:**问题四 if (i % eval(day)) >= eval(upday):这条语句要注意,刚开始我花了很多时间去看错误在哪,原来是我的逻辑没有弄清楚,写了大于号,导致结果不对,这里考的是数学思维。
问题五
一年360天,如果A君每天进步1%,B君工作5天,休息两天,休息时退步1%。C君工作3天,休息两天,休息时退步0.5%.请问B君和C君在工作时至少需要多大的努力才能比A君一年的进步要大?
解答:在编程前要先在脑海里有一个思维导图,就好像A君和B君比较,设B君的努力程度dayfactorB为X,如果B君比不过A君,则dayfactorB+ 0.001后再传入函数daydayupB里进行计算365天的成长值,返回成长值dayupB,与A君的成长值dayupA再进行比较,利用while函数如此循环反复,直至B君的成长值dayupB超过A君的成长值后,输出结果。C君的原理也是一样的,就不多赘述了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
def daydayupB(df):
dayupB = 1.0
for i in range(365):
if i % 7 in [6,0]: #假设6为星期六,0为星期天
dayupB = dayupB*(1 - 0.01) #退步1%
else:
dayupB = dayupB*(1 + df)
return dayupB
def daydayupC(df):
dayupC = 1.0
for i in range(365):
if i % 5 in [4,0]: #假设4,0时休息日
dayupC = dayupC*(1 - 0.005) #退步0.5%
else:
dayupC = dayupC*(1 + df)
return dayupC
dayfactorB = 0.01
dayfactorC = 0.01
dayupA = pow(1.01,365) #A君365每天进步1%
print(dayupA)
while daydayupB(dayfactorB) < dayupA:
dayfactorB += 0.001
print("B需要用:{:.3f}".format(dayfactorB))
while daydayupC(dayfactorC) < dayupA:
dayfactorC += 0.001
print("C需要用:{:.3f}".format(dayfactorC))
|
1
2
3
|
37.78343433288728
B需要用:0.019
C需要用:0.021
|
总结:问题五中,第一次接触到python的def函数概念,其实跟其它语言也是类似,传递参数等等,但深入的我还没去了解,不过这里解锁了两个关键字def和while。也是很开心的。
大总结
虽然是短短的几行代码,但包含了很多的语法元素。条件循环、计数循环、分支、函数、计算思维。
通过这个问题的讨论分析,也可知道,坚持的力量不容小觑。进步是指数型上涨的,不进则退也是这个道理。
参考资料:Python语言程序设计基础(第2版)》嵩天、礼欣、黄天羽著,高等教育出版社,2017.2(讲授Python 3版本)
视频课程
Python3菜鸟教程