当前练习题如果每篇更新五题可能会导致某些文章篇幅过长,因此我决定后续每天更新三篇。
第三十一题,计算字典值总和:
#定义一个函数,该函数接收一个字典作为参数,并返回该字典中所有值的总和
#定义函数
def sum_of_dict_values(dictionary):
"""
计算并返回字典中所有值的总和
:param dictionary:字典
:return: 字典中所有值的总和
"""
#定义变量保存总和
result = 0
#获取字典中所有值
for values in dictionary.values():
result += values
return result
#给定字典
example_dict = {'a':100,'b':200,'c':300}
#调用函数
total = sum_of_dict_values(example_dict)
print(total)
下面是这个代码块开发出来的运行逻辑以及编写逻辑:
计算字典所有值的总和
字典可以理解成一本"账本",里面记的是一条条"名目 → 金额"的对应关系,比如 a 对应 100、b 对应 200、c 对应 300。这里的名目就是"键",金额就是"值"。
这道题要算的是所有金额的总和,也就是说,我们只关心"值",名目是什么并不重要。
思路其实很生活化,就像数钱:先准备一个空的存钱罐,初始是 0;然后把账本里的每一笔金额逐个取出来,取一笔就往存钱罐里丢一笔------100、再加 200、再加 300;等所有金额都数完,存钱罐里的总数就是答案,也就是 600。
换成程序的语言,就是三步:先准备一个从 0 开始的累加器,再遍历字典里所有的值,每遇到一个就加进累加器,最后把累加器的结果返回即可。
这里有个小关键:怎么"只取出值、不管键"?字典本身就提供了专门的能力,可以一次性把所有值单独拎出来(对应的还有"只取键"和"键值一起取"),我们需要的正是"只取值"这一种。
如果想更省事,Python 还内置了一个专门"求和"的工具,把取出来的所有值直接丢给它,一行就能得到总和,效果和手动一笔笔累加完全一样,只是写起来更清爽。
第三十二题,计算倒数序列和:
#定义一个函数,该函数用于根据传入的整数n返回对应的倒数序列和,若n是奇数,则计算1/1 + 1/3 + ... + 1/n,若n是偶数,则计算1/2 + 1/4 + ... + 1/n
#用户输入数据
n = int(input('请填入n的值:'))
#定义函数
def sum_of_reciprocal_series(n):
"""
计算并返回倒数序列和
:param n: 正整数
:return: 倒数序列和(float类型)
"""
result = 0
if n % 2 == 1:
for i in range(1, n + 1, 2):
result += 1 / i
else:
for i in range(2, n + 1, 2):
result += 1 / i
return result
#调用函数
result = sum_of_reciprocal_series(n)
print(result)
下面是这个代码块开发出来的运行逻辑以及编写逻辑:
计算倒数序列和
这道题比前面多了个"分情况"的小机关,我们先把规则说清楚。
先解释"倒数":一个数的倒数,就是 1 除以它,比如 3 的倒数是 1/3、5 的倒数是 1/5。
题目要求根据传入的数字 n 来算一串倒数的和,而且分两种情况:
如果 n 是奇数,就算 1/1 + 1/3 + 1/5 + ...... 一直到 1/n;
如果 n 是偶数,就算 1/2 + 1/4 + 1/6 + ...... 一直到 1/n。
说白了,就是"n 是奇数就只挑奇数来取倒数,n 是偶数就只挑偶数来取倒数"。
思路分三步走:
第一步,先判断 n 是奇数还是偶数。办法很简单,看它除以 2 是不是余 1------余 1 就是奇数,否则就是偶数。
第二步,挑出对应的那串数。这里有个小技巧:不用一个个去筛,而是"每隔一个取一个"。奇数的情况就从 1 开始,1、3、5......一路跳到 n;偶数就从 2 开始,2、4、6......跳到 n。这样取出来的正好是我们要的数列。
第三步,累加。和之前"数钱"一样,准备一个从 0 开始的存钱罐,每挑到一个数,就先算出它的倒数(1 除以它),再丢进存钱罐里。等这串数都处理完,存钱罐里的总和就是答案。
举个例子:如果 n 填 4(偶数),就挑出 2 和 4,算 1/2 + 1/4 = 0.5 + 0.25,最后得到 0.75;如果 n 填 5(奇数),就挑出 1、3、5,算 1/1 + 1/3 + 1/5,结果约等于 1.53。
整道题的核心,其实就是"先分奇偶选对数列,再对每个数取倒数累加",比单纯的求和多了一层判断和挑选而已。
第三十三题,计算给定日期是年中的第几天:
#定义一个函数,该函数接收年月日作为参数,计算这一天是这一年的第几天
#接收用户输入
year = int(input("请输入年份:"))
month = int(input("请输入月份:"))
day = int(input("请输入日期:"))
#定义函数
def is_leap_year(year):
"""
判断给定的年份是否是闰年
:param year: 年
:return: 如果是闰年返回True,否则返回False
"""
return year % 4 == 0 and year % 100 != 0 or year % 400 == 0
def day_of_year(year, month, day):
"""
计算并返回给定日期是这一年的第几天
:param year: 年
:param month: 月
:param day: 日
"""
#定义变量保存平年每月的天数
days_in_month = [31,28,31,30,31,30,31,31,30,31,30,31]
#判断是否是闰年
if is_leap_year(year):
days_in_month[1] = 29
#计算累计天数
day_count = sum(days_in_month[:month - 1]) + day
return day_count
print(f'给定日期是这一年的第{day_of_year(year, month, day)}天')
下面是这个代码块开发出来的运行逻辑以及编写逻辑:
计算给定日期是这一年的第几天
这道题问的是:给一个日期,比如 3 月 15 日,它是这一年里从头算起的第几天。
核心思路:拆成两部分相加
想象一年是一本厚厚的日历,你要算某一天翻到了"第几页",最省事的办法就是------把前面已经翻完的整月天数全加起来,再加上当前这个月已经过了的天数。
而"当前这个月过了几天"其实就是那个"日号"。比如 3 月 15 日,到 15 号为止,3 月正好过了 15 天。所以:
答案 = 1 月的天数 + 2 月的天数 + 15
注意这里只加到上一个完整月份为止,当月不加整月,只加"日号",因为当月还没过完。
第一步:得先知道每个月有多少天
大月 31 天、小月 30 天,二月最特殊。可以先把平年 12 个月的天数记成一张"对照表",用的时候按月去查就行。
第二步:处理闰年这个变量
唯一的变数在二月------平年 28 天,闰年 29 天。所以在累加之前,得先判断这一年是不是闰年:如果是,就把对照表里二月那一格从 28 改成 29,其余月份不变。
至于闰年怎么判断,规则有点绕,用大白话说就是:能被 4 整除的一般是闰年;但碰到整百年(能被 100 整除的),必须能被 400 整除才算。比如 2024 能被 4 整除,是闰年;1900 能被 100 整除却不能被 400 整除,就不是;2000 能被 400 整除,是闰年。
第三步:累加求和
把当月之前所有月份的天数加起来,再补上当月的日号,总和就是答案。
举个例子:算 2024 年 3 月 15 日。2024 是闰年,二月按 29 天算,于是 1 月 31 天 + 2 月 29 天 + 15 = 75,也就是这一年的第 75 天。
整道题的精髓,就是"先查表把前面的整月天数累加,再考虑闰年给二月多加一天,最后补上当月日号"------把一个看起来复杂的问题,拆成了查表、判断、累加三个简单动作。
以上就是这三题的全部内容,加油!