Python基础语法练习题(31-33)

当前练习题如果每篇更新五题可能会导致某些文章篇幅过长,因此我决定后续每天更新三篇。

第三十一题,计算字典值总和:

复制代码
#定义一个函数,该函数接收一个字典作为参数,并返回该字典中所有值的总和

#定义函数

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 天。

整道题的精髓,就是"先查表把前面的整月天数累加,再考虑闰年给二月多加一天,最后补上当月日号"------把一个看起来复杂的问题,拆成了查表、判断、累加三个简单动作。

以上就是这三题的全部内容,加油!

相关推荐
CRMEB系统商城1 小时前
前后端技术栈全面换代!CRMEB 多商户(Java)v3.0更新预告
java·开发语言·小程序·php
2601_962885721 小时前
如何用 Python 画 K 线图(蜡烛图)?(mplfinance + 均线 + 成交量)
开发语言·python
事圆则缓1 小时前
Flutter 状态管理框架对比(三):Riverpod 如何连起购物车与异步价格
开发语言·javascript·flutter
蓝宝石的傻话1 小时前
onvif-go(mickeyzzc/onvif-go v2)完整参考手册:从建工程到写出自己的 NVR 接入
开发语言·后端·golang
Elastic 中国社区官方博客1 小时前
使用 Lucene 搜索你的 Bean —— Elasticsearch
大数据·开发语言·人工智能·elasticsearch·搜索引擎·全文检索·lucene
Sayai2 小时前
Neo4j 内嵌模式(Embedded)实战:Java 嵌入式 vs 服务端部署的写入性能对比与 GC 调优
java·开发语言·性能优化·neo4j·图数据库
Y3815326622 小时前
行业动态周报:用新闻 API 追踪一个赛道的声音变化
python·搜索引擎
零域码客2 小时前
零基础Python爬虫入门:从HTTP协议到 requests + BeautifulSoup 实战
爬虫·python·http
“AI国潮设计-小江”2 小时前
【SDXL实战】用AI生成“财神爷蛋糕×英歌舞人物”潮汕国潮甜品IP,附Prompt与批量生成思路
开发语言·人工智能·python·aigc