分享你的测试成长经历,吴老师免费送书 !
同学们,先问一个尖锐的问题,你们都多大了,如果你已成为宝爸宝妈,那么你们有没有过这样的需求呢:你的熊孩子已经步入了小学,数学课的计算要求越来越高,你需要让Ta每天做上几十道口算题。有同学说了,这定西在淘宝拼多多上七八块钱不能就买一套嘛。是的,七八块钱确实可以买一套,但七八块钱它也是钱呀,难道你不想省吗?而且一套题做几天也做完了,接着你不还得再花七八块嘛,这样积少成多实际钱也没少花。
如果你不差钱儿,那么好,你有没有这样的尴尬时刻:你身边的朋友们对你说,你这个做IT的能不能用编程帮我们搞出点算术题来呀,这时,身为手工酱的你编程水平太一般了,你只好弱弱地说:
“亲,我……,我……,我不会……”
此时,你的朋友翻着白眼,一脸嫌弃地说:“呦,做IT的还不会编程啊,谁信呀,切,不想管就直说呗,得,不劳您大驾,我自己淘宝拼多多上买去!”
此时你想辩解,可是你苍白的辩解有谁信呢?这时候,你看额别说跳进黄河了,就算你跳进密西西比河也洗不清了!你说,这尴尬不尴尬?
如果你也遇到过这种尴尬,那么好了,今天这篇文章你算是来着了,因为它就是为身为宝爸宝妈的你量身打造的,绝对是宝宝宝妈们的code福音呢。
但有同学说,我水平比较高,我已经会了,那你就请自行绕路吧,可以去阴凉地儿休息休息,还不太会的同学继续。
我们先说需求,假设你的熊孩子已经二年级了,不仅学习了100以内的加减法,还学了九九乘法表,那么需求来了:生成1000道算术题,要求加减乘除四种算式各随机占25%,且答案不得大于100,加减法的加数和减数不能超过100,乘除法只能包含九九乘法表里的内容,所有算式题每50题为一组,每一组题的后面要跟上这组算式的答案,即第一组题,第一组答案,第二组题,第二组答案……这样以此类推,直到1000道题及其答案全部打印完成。
怎么样,宝爸宝妈们有思路吗?如果你没有思路,那就跟着文章继续看下去吧。
首先,这里用到了九九乘法表,那么,我们是不是首先应该生成一个九九乘法表呢,当然,这不需要算式,只需要结果,所以,我们把九九乘法表里每一个算式的结果存在一个列表里:
def get_chengfa_result_list():
r = []
for ir in range(1,10):
for ir1 in range(1,ir+1):
r.append(ir1 * ir)
if ir1 == ir:
break
return r
这样,就生成了结果,结果为:
有人说了,这数据也不多啊,我一个数一个数地手敲行不?当然行,但那样不是麻烦嘛,而且也容易被人鄙视,回头你的朋友又该说了:“呦,会编程的连个九九乘法表都写不出来呀,谁信呀!”,那你又该跳密西西比河了(密西西比河:“我招谁惹谁了!”)。
九九乘法这个比较简单,我们就不在这里过多赘述了,我们下面创建最关键的函数,那就是生成算式及其答案,下面先上结果:
# coding=utf-8
import random
import copy
def jiajianchengchu(maxdigit):
f_list = ["+", "-", "×", "÷"]
tem_list0 = []
while 1:
d_list = range(0, 101)
d_chengchu_list= [0,1,2,3,4,5,6,7,8,9]
d_chengchu_list_result = get_chengfa_result_list()
f = random.choice(f_list)
if f == "+":
while 1:
d0 = random.choice(d_list)
d1 = random.choice(d_list)
if d0 + d1 > 100:
continue
else:
tem_list0.append(str(d0) + "+" +str(d1) + "=")
break
if f == "-":
while 1:
d0 = random.choice(d_list)
d1 = random.choice(d_list)
if d0 - d1 < 0:
continue
else:
tem_list0.append(str(d0) + "-" +str(d1) + "=")
break
if f == "×":
d0 = random.choice(d_chengchu_list)
d1 = random.choice(d_chengchu_list)
tem_list0.append(str(d0) + "×" +str(d1) + "=")
if f == "÷":
while 1:
d0 = random.choice(d_chengchu_list_result)
d1 = random.choice(d_chengchu_list)
if d1 == 0:
continue
if d0 % d1 != 0:
continue
if d0 / d1 >=10:
continue
if d0 < d1:
continue
else:
tem_list0.append(str(d0) + "÷" +str(d1) + "=")
break
if len(tem_list0) == maxdigit:
break
r_list = []
tem_list = []
tem_list_result = []
for ite_str in tem_list0:
suanshi = copy.deepcopy(ite_str)
if "×" in ite_str:
ite_str = ite_str.replace("×","*")
if "÷" in ite_str:
ite_str = ite_str.replace("÷","/")
tem_list.append(suanshi)
tem_list_result.append(suanshi + str(int(eval(ite_str[0:-1]))))
if len(tem_list) == 50:
for ite in tem_list:
r_list.append(ite + " "*8)
r_list.append("-"*50)
tem_list = []
for iter in tem_list_result:
r_list.append(iter + " "*8)
r_list.append("-" * 50)
tem_list_result = []
r_str = ""
for i in r_list:
r_str += i
return r_str
在这个函数里,我们需要生成加减乘除各25%,有同学说了,那我就生成250道加法,250道减法,250道乘法和250道除法不就完了,多简单。不,同学,你错了,我们要求的可是随机生成,你这样能随机吗?所以你看,我们在最前面引入了随机模块。
在函数中我们首先生成一个列表f_list,它里面包含了四个符号"+", "-", "×", "÷",为的就是随机。
接着,我们创建了一个临时列表tem_list0,它用来存储所有的算式,此时先不管答案。
下面,我们搞一个死循环while 1,有同学说了,既然是1000道,数目是定的,为什么要死循环?为什么不循环1000遍?这个啊,你要知道,题目是有限制的,计算结果不能超过100,加数和减数不能超过100,乘除法只能包含九九乘法表里的内容,那么我们又是随机生成的,难免会生成超出范围的算式,那超出了范围怎么办呢?自然就放弃了,进行下一次循环,因为是随机的,那么到底会发生几次放弃我们也不知道,所以就必须死循环啦。
我们在死循环里先创建一个数字列表d_list,它包含从1到100的所有数字,我们的加数、减数都从这里面出,它就是我们加法和减法的原料池。
再定义一个乘数和除数的原料池,是0到9。
再定义一个乘除法结果的列表,这个列表里存的是九九乘法表里所有算式的结果,它来自于我们事先定义好的那个函数。
我们从d_list里随机取一个数,存到变量f里,下面,f分四种情况分别处理。
当f为加号时,我们要再嵌套一个死循环,在这个死循环里,先把加数d0和被加数d1分别从d_list里随机取出来,计算,如果d0+d1大于100,则放弃,进行下一个循环,否则如果小于100,则把算式存储到tem_list0里,然后跳出死循环,别忘了这个跳出哦,因为这可是死循环,没有这步跳出它就会一直循环下去,循环到你怀疑人生。还有一点要注意,这里存的是算式,没有结果哦。
当f为减号时,用同样的思路,这里直接进行下一次循环的条件是d0-d1为负数,因为熊孩子还没学负数,如果有的同学说了,我孩子都上高年级了,早就学负数了,那你就不要那个条件就好了,同时也恭喜你响应了当年国家的晚婚晚育号召。
下面是乘法,乘法的话不需要有什么直接进入下一个循环的条件了,这个就不多解释了,大家自品,细品。
除法复杂一点,直接进入下一个循环的条件有四个,第一是d1不能为0,因为分母不能为0,这个如果有忘的,自行复习啊,而且别忘了给你们中学数学老师赔个不是:“对不起老师,我把您教的东西还给您了!”
第二个条件是d0除以d1不能有余数,即必须是整除,还是因为熊孩子没学,当然,如果你说你孩子学了,那还得恭喜你响应了当年的晚婚晚育号召。
第三个条件是d0除以d1必须大于10,不然就有小数点了,不多解释了,没学,号召。
第四个条件是d0不能小于d1,不然就得零点几了,还是没学,号召。
以上四个条件都通过了,恭喜你,即将进入否则环节,也就是else语句块,那就是拼接除法算式并存入tem_list0
接下来,跳出,别忘了,不然又怀疑人生了。
再下面,我们判断一下tem_list0的长度,如果等于maxdigit,就跳出这个大死循环。有同学问了,不是说1000个算式嘛,那这个maxdigit是什么鬼?这个啊,就是做灵活一点,这次是生成1000个,下次需要生成2000了怎么办?难道重写一个吗?那不又被鄙视了,如果你没得被鄙视综合症,那还是写灵活一点吧。
接下来,可就有意思了,我们创建三个列表,r_list用来存储最终的结果,即所有算式加结果,并以50个为一组。tem_list用来存储算式,tem_list_result用来存储结果。
我们搞一个循环,来循环tem_list0,就是所有算式,每一次循环的值存储在变量ite_str里,首先,使用深度拷贝把ite_str赋值给变量suanshi,为什么要赋值给变量suanshi?还是用深度拷贝而不直接用等号赋值?我们后面再说。
接下来,我们把所有乘法和除法算式里的×替换为*,÷替换为/,这是为了下一步做计算用。
我们把算式存储到tem_list中,把算式的结果存储到tem_list_result中,这里注意了,算式的结果我们是用eval()函数来实现的,大家记得,刚才我们把ite_str深度拷贝给了suanshi,这下明白原因了吗?因为我们做了替换,suanshi存的是算式,ite_str通过eval()函数来计算出来的结果,他们两个是不同的,所以要分开,至于说为什么要用深度拷贝,因为如果是直接用等号赋值,即a=b实际只是把b的址赋值给了a,当b被改变了,a也跟着变,而我们把ite_str里的乘号和除号都替换成了*和/,如果不用深度拷贝的话,suanshi也容易跟着改变,所以为了保险起见,我们用了深度拷贝。
有同学又说了,我用了深拷贝,怎么报错呢?你仔细看看你的报错,你八成是没引破特吧?你看我们的样例代码最前面,是不是有import copy?
再顺便说一下,ite_str后面为什么跟个[0:-1],因为eval()函数里面是不能包含等号的,否则就报错啦。有同学问这是为什么,这个啊,可以说没有为什么,这就是语法,具体得问Python之父去,就是那个穿着“人生苦短,我用Python”上衣的老头子。
好了,再下面呢,我们判断一下tem_list的长度是否等于50,因为50个一组嘛,如果等于50,则循环tem_list,即把每一个算式都添加到r_list最终结果列表里,注意,每一次存入都要在后面加8个空格,因为算式后面得给留出写答案的地方啊,这8个空格就是写答案的,当50次循环完成后,再存入50个-,为什么呢,因为每一组之间得来个分隔符来分割一下,所以这里就用50个-作为那道华丽的分隔线,同时,我们还要把tem_list清空,以便下一组50个算式来使用。
完成后,再循环tem_list_result,刚才我们已经把计算结果都存入到tem_list_result了,我们再循环它,把结果也存储到r_list里,与上一段同理,就不赘述了。
最后一步终于到了,我们设置一个字符串变量r_str,循环r_list把它赋给r_str,最后再返回这个r_str,就算大功告成啦。
现在,我们写这样两行:
r = jiajianchengchu(1000)
print(r)
见证奇迹的时刻到了,我们来run一下,看,结果扑面而来:
我们把结果复制出来,粘贴到Word里,再调整一下字体字号,就OK了,在这里我悄悄告诉大家,只要把字体调成宋体,字号为小四,1.5倍行距,是最合适的,然后我们再每一页敲几下回车就OK了。
有同学说了,粘到Word还得手动调节字体字号啊,能不能自动调节啊,这个啊,这个可以有,但我这还真没有,因为我也没学这个,平时用Python操作Word的需求基本没有,几乎全是操作Excel的,所以就没搞这块,不过大家放心,如果有一天我学了操作Word,一定上来分享!
最后,解答一个很多同学都问的问题,我算式都做出来,熊孩子就是爱玩爱闹不做可怎么办,有没有专治熊孩子的Python包啊?这个嘛,估计是有,但我还真没学,如果我学了一定上来分享哈!
想学习测试开发的朋友请添加吴老师微信:wulaoshi1978
提取码:k5fv
无论上课或自学,
你首先需要准备:
每天 2 小时+的学习时间,
每天坚持写代码的习惯!
有投入才有产出,
10k+的涨幅需要 1 年以上的努力!
祝你成功!
光荣之路出品
自动化测试的目标
手把手教你pytest测试框架
测开必备-flask网站开发
IOS真机移动端App+H5混合自动化测试实战
产品测试规范
内推:字节跳动 | 测试开发
招聘QQ群:203715128