【每周一坑】疯狂的小母牛 +【解答】数据库

简介: 这道题,如果你网上搜一下,会有很多地方用各种语言写过。一般来说是迭代(循环)和递归两种解法。不过我当年看到这道题的时候,就觉得这个很适合用面向对象的思想来实现,因为母牛就是一种类型,每头母牛都是这个类型的一个实例。这个思路你也可以考虑下。

之前我们的“每周一坑”栏目挖了一个“单词本”的系列。不过看起来大家都这种中长线项目兴趣不大啊……最近的一期,直到最近几天才有一位同学提交了解答。所以我决定暂停一下,今天还是来点短平快的小练习。

上期的分析解答在本文后半部分给出,前几期内容见:



也可从公众号(Crossin的编程教室菜单栏最右侧进入查看所有往期练习。

今天要讲的这个,是一道算得上经典的编程问题:


母牛问题


有一头母牛,它每年年初生一头小母牛。每头小母牛从第 4 个年头开始,每年年初也生一头小母牛。(别问我公牛上哪去了……)请编程实现计算在第 n 年的时候,共有多少头母牛?

输入:年份 n

输出:母牛的数量

运行示例:


这道题,如果你网上搜一下,会有很多地方用各种语言写过。一般来说是迭代(循环)递归两种解法。不过我当年看到这道题的时候,就觉得这个很适合用面向对象的思想来实现,因为母牛就是一种类型,每头母牛都是这个类型的一个实例。这个思路你也可以考虑下。

详细解答和参考代码将在下次栏目中给出,也可以其他同学在留言中的代码。

期待各位同学提交解答,更期待你能完成整个系列。

提交代码可以使用 paste.ubuntu.com

codeshare.io 等代码分享网站,只需将代码复制上去保存,即可获得一个分享地址,非常方便。



【解答】单词本 - 数据库

上次我们的题目是使用数据库存储单词数据。这里我们以最简单的 sqlite 为例(参考:《Python 实战(2):简单的数据库》):

创建数据表及读取数据

import sqlite3
# 建立数据库连接
conn = sqlite3.connect('words.db')
cursor = conn.cursor()
# 如果不存在数据表则新建
create_tb_cmd='''
    CREATE TABLE IF NOT EXISTS WORD
    (english TEXT,
     date DATE,
     phonetic TEXT,
     chinese TEXT
    );
'''
cursor.execute(create_tb_cmd)
cursor.execute('select english from WORD;')
# 读取已有数据
words = [w[0] for w in cursor.fetchall()]


写入数据

# 插入数据库
insert_cmd = '''
    INSERT INTO WORD
    (english, date, phonetic, chinese)
    VALUES (?, ?, ?, ?);
'''
cursor.execute(insert_cmd, (word, t, ph, chs))
conn.commit()


特别说明下:Linux 和较新版的 Mac 系统都默认装有 SQLite,Windows 需要安装但也不复杂。另外 Python 直接带有对 SQLite 的支持,无需再安装其他模块。

如上述代码,直接对数据库进行读写操作,你还需要了解一点 SQL 语句的基本语法。

还有种选择就是《像对象一样对待数据》里提到的 ORM 方式来操作数据库。来自 @Nttzl 同学的解答就使用了此方法。其中数据库部分代码:

import datetime,requests,peewee
db = peewee.SqliteDatabase("words.db")
# 创建表
class Word(peewee.Model):
    #将表和数据库连接
    class Meta:
        database = db
    word = peewee.CharField()
    ph_en = peewee.CharField()
    means = peewee.CharField()
    date = peewee.DateTimeField()
Word.create_table()
# 读取已有数据
t_list = Word.select()
words = [t.word for t in t_list]
# ...
# 写入数据
t = Word()
t.word = word
t.ph_en = ph_en
t.means = means
t.date = datetime.date.today()
t.save()
# ...
# 查找单个数据
t = Word.get(word=word)
print(t.word+'    ['+t.ph_en+']    '+t.means+'    '+str(t.date)+'\n')

关于 sqlite3peewee 的详细介绍可从上面提供的文章链接进入查看。

感谢各位同学的参与。

期待在下一期中看到你的代码!


其他内容回复左侧关键词获取:

python :零基础入门课程目录

新手 :初学者指南及常见问题

资源 :超过500M学习资料网盘地址

项目 :十多个进阶项目代码实例

如需了解视频课程及答疑群等更多服务,请号内回复 码上行动

代码相关问题可以在论坛上发帖提问 bbs.crossincode.com

推荐阅读:

Python转行 | 爬抖音 | 如何debug | 查天气 | 我用Python | 知乎 | 单词表 | 新手建 | 如何提问 | 一图学Python | 智能防挡弹幕 | 红包提醒|流浪地球

相关文章
|
25天前
|
SQL 存储 缓存
数据库太慢跑崩的另一罪魁
JOIN是数据库计算中的难点,传统方法如HASH JOIN在处理大规模数据时效率低下,甚至导致系统崩溃。esProc SPL通过创新的算法,如维表主键参与的外键关联优化、维表序号化等,显著提高了JOIN操作的性能,尤其在处理超大数据集时表现出色。SPL不仅支持物理有序存储,还提供了高效的JOIN函数,适用于多种JOIN场景,包括多层维表预关联和主子表归并。此外,esProc SPL具有良好的扩展性和易用性,支持Java环境下的集成,提供丰富的开发调试工具,是处理复杂数据关联的理想选择。
|
28天前
|
SQL 存储 算法
数据库太慢跑崩的一大罪魁
帐号去重计数是商业分析中的常见需求,通过 SQL 的 COUNT(DISTINCT ...) 实现。然而,当数据量庞大时,COUNT(DISTINCT) 的性能问题凸显,可能导致数据库崩溃。esProc SPL 通过有序数据处理和高效的去重算法,解决了这一难题,尤其适用于复杂的漏斗分析等场景,显著提升了计算效率和资源利用率。
|
4月前
|
固态存储 关系型数据库 MySQL
"惊!20亿数据秒速入MySQL,揭秘数据库极速插入的黑科技,你不可不知的绝密技巧!"
【8月更文挑战第11天】面对20亿级数据量,高效插入MySQL成为挑战。本文探讨优化策略:合理设计数据库减少不必要的字段和索引;使用批量插入减少网络往返;优化硬件如SSD和内存及调整MySQL配置;并行处理加速插入;附Python示例代码实现分批导入。这些方法将有效提升大规模数据处理能力。
128 2
|
4月前
|
数据库 关系型数据库 MySQL
惊!Hibernate与MySQL的绝密优化技巧大揭秘,让你的数据库飞起来!
【8月更文挑战第31天】在企业应用开发中,结合使用持久层框架Hibernate与数据库管理系统MySQL可显著提升数据库交互效率。本文探讨了多项优化策略,包括配置二级缓存、采用单向关联减少JOIN操作、优化HQL查询语句以及合理使用MySQL索引。通过具体示例,文章详细讲解了如何实施这些优化措施,以期为企业应用提供更高效稳定的数据支持。
70 0
|
存储 数据采集 JSON
【每周一坑】数据库 +【解答】自动翻译
虽然目前这段小代码并不非要用数据库,但对于功能复杂、数据庞大应用来说,数据库是很有必要的。之后我们这个工具还要做更多扩展,数据库会便于读写数据,所以我们不妨现在就做好准备。
|
7月前
|
SQL 存储 数据库
常用数据库复习资料
常用数据库复习资料
|
7月前
|
存储 SQL 关系型数据库
【周末闲谈】关于“数据库”你又知道多少?
【周末闲谈】关于“数据库”你又知道多少?
120 0
|
SQL 数据可视化 数据库
<数据库视图>--数据库的“眼镜”(世界杯例题篇),查阅必备
<数据库视图>--数据库的“眼镜”(世界杯例题篇),查阅必备
123 0
|
存储 SQL 安全