人人都能用Python
最近有个需求,亲戚家小朋友上小学一年级,开始学简单的加减法。考试成绩不理想。
吃饭时,和我聊了这事情,因为懂一点 Python 的皮毛,于是我大包大揽,接下一个“软件外包”的活儿,为他开发一个小程序,随机生成一些加减法的题目,每天打印出来,给小朋友回家练习用。
其实目标很简单:每次随机生成大概约100道题目,使用打印机打印出来即可。
所有测试试题写入表格中,用 Word 的表格其实最方便,但 Word 的 docx 不好弄,遂决定用markdown的表格功能。
工具
- Python 3.6.x
- Markdown 编辑器 (Typora)
- Python编辑器(notepad++之类就可以了,或者Pycharm)
思路
- 简单的加减法,a ± b,a 和 b 为 1~100 内的随机数;加法or减法也随机生成;小朋友还没学到三位数和负数,所以要满足 a+b < 100,a-b>0 这两个条件
- 进阶的加减法:a ± b ± c,同样,三个随机数
- a + b + c < 100
- 0 < a + b - c < 100
- 0 < a - b + c < 100,且 a > b
- 0 < a - b - c < 100,且 a > b
- 满足如上条件的题目,写入
.md
文件中,以表格的形式存在。使用Typora打开后,直接打印,or 存为PDF后打印 - 试题的数量可变,只需要修改表格的 row 和 column 的数量即可
开始
-
先看看 Typora 中表格的 markdown 格式。
Typora中,使用
CTRL+T
,然后输入 row 和 column 的数量,软件就会自动创建表格。接下来
CTRL + /
查看 markdown 表格的语法。 -
表格由三部分组成
- 表格标题抬头:直接以
|
分隔,如| 姓名 | 年龄 | 电话 |
,抬头中的内容会加粗 - 表格分割线:类似上面的,中间内容部分以
----
替换,比如| ---- | ---- | ---- |
- 表格内容:和抬头格式一致,如
| 张三 | 24岁 | 13512341234 |
- 表格标题抬头:直接以
-
搞定了表格的格式,直接在 Python 中把格式和内容放进去,以
|
隔开就好了 -
python中按行写入文件
.md
文件
开干
- 使用
random.randint(1, 99)
来生成 1~99 之间的随机数 - 使用
ROW
和COL
来控制表格的行和列 - 还要弄一个数组来存放所有的答案:
Answer100[]
,让小娃娃自己检查订正
先把100道题所有的答案设为0(本来想一张试卷只有100道题的,所以数组叫 Answer100
# coding: utf-8
import random
ROW = 26 # 表格的行数
COL = 5 # 表格的列数
COUNT = ROW * COL # 行×列,一张试卷总共题目的数量
Answer100 = [] # 数组初始化
for i in range(0, COUNT):
Answer100.append(0)
生成等式 & 把答案填入数组中
- 创建一个函数,作用是返回一个 string,string的内容是表格中的每一行,函数就叫
printLine()
好了 - 表格的标题行,运行一次函数
- 表格的分割线,填入
| ---- | ---- | ---- |
- 表格的内容行,反复运行多次函数
# n 是表格的行数,通过 n 可以方便计算数组下标,把答案写入Answer100[]中
def printLine(n):
output = '| ' # 该行中第一个 “|”
count = 0
while (count < COL):
a = random.randint(1, 99)
b = random.randint(1, 99)
op = random.randint(0, 1) # +/-
if op == 0 and (a + b) < 100: # ADD
# print('%d + %d = ' % (num1, num2), ' | ', end='')
count += 1
Answer100[n * COL + count - 1] = a + b
output += str(a) + ' + ' + str(b) + ' = | '
if op == 1 and (a > b) and (a - b) > 0: # SUB
# print('%d - %d = ' % (num1, num2), ' | ', end='')
count += 1
Answer100[n * COL + count - 1] = a - b
output += str(a) + ' - ' + str(b) + ' = | '
output += '\n'
return output
main函数(懒得写了,直接调用printLine()吧)
with open("简单运算.md", 'w') as f: # 写到硬盘中的 简单运算.md 文件中
f.write(printLine(0)) # 表格标题行
f.write('| ---- | ---- | ---- | ---- | ---- |\n')
# 表格分隔行,全是字符
# 其实这里应该根据 COL 的数量来判断中间几个 “----” 的
# 但是好像在Typora 中,这个错了不影响表格,那就这么样吧,懒得弄了
for i in range(1, ROW): # 写后面的内容行
f.write(printLine(i))
# 答案写在另一页,先来个二级标题
f.write('## Answer \n')
# 答案的标题行
f.write('| ' + str(Answer100[0]) + ' | '
+ str(Answer100[1]) + ' | '
+ str(Answer100[2]) + ' | '
+ str(Answer100[3]) + ' | '
+ str(Answer100[4]) + ' | \n')
# 答案的分隔行
f.write('| ---- | ---- | ---- | ---- | ---- |\n')
# 答案剩下的行
for i in range(1, ROW):
f.write('| ' + str(Answer100[i * 5]) + ' | '
+ str(Answer100[i * 5 + 1]) + ' | '
+ str(Answer100[i * 5 + 2]) + ' | '
+ str(Answer100[i * 5 + 3]) + ' | '
+ str(Answer100[i * 5 + 4]) + ' | \n')
OK,基本上完成了一个简单试卷了
测试一遍
C:\Users\haha>f:
F:\>cd exam
F:\exam>python easy.py
F:\exam>dir
驱动器 F 中的卷是 ETC
卷的序列号是 2EEE-AFDC
F:\exam 的目录
2018/05/06 周日 16:13 <DIR> .
2018/05/06 周日 16:13 <DIR> ..
2018/05/06 周日 15:45 1,810 easy.py
2018/05/06 周日 16:13 2,713 简单运算.md
2 个文件 4,523 字节
2 个目录 14,612,041,728 可用字节
F:\exam>
生成了 简单运算.md
文件,用typora可以正常打开,直接打印就OK了
效果如图所示:


后续
花了一个小时写完了两个脚本,后来去他家喝酒
感受到他儿子看着我仇视的眼神
我不禁产生了怀疑,我这是算造孽么??
网友评论