2、Python之random数据生成:巧妇能为无米之炊

南宫理的日志录 2024-09-12 09:16:09
引言

前面的文章中,已经提到了程序的主要任务由三部分组成:

数据的输入

数据的处理

数据的输出

在学习Python编程的过程,或者实际工作中,我们很多时候都需要拿到一些数据,作为程序的输入,从而验证程序的处理逻辑。但是,很多时候一个新开发的系统没有那么多的数据,所有的测试数据,都是由测试人员录入验证的。即使线上系统运行一段时间了,由于数据安全、数据权限的问题,也没法轻易获取到足够的测试数据。

无奈之下,有些偷懒的研发,就随意自己造几条数据,看代码没有问题,就匆忙上线了,然后上线的效果可想而知……

事后只会哀叹,测试数据集太少,巧妇难为无米之炊……

巧妇真的难为无米之炊吗?我觉得只是不够巧的缘故,足够巧,无米之炊亦可为。

编程这门手艺,本身就在于将人力从繁杂重复的事务中解放出来,从事更有价值的工作。所以,没有测试数据时,我们应该想法子,通过编写Python代码实现批量数据的生成。

编辑

关于random的使用

Python中有random的内建模块,Python安装完成后,直接可以通过import导入、使用。

random最常用的功能是生成随机数,当我们需要批量生成一些随机数字时,可以使用该模块:

生成随机整数:random.randint()

需要注意的是:randint的两个参数,分别表示生成数据的下限和生成数据的上限,均包含在内。

生成随机浮点数:random.uniform()

其中,uniform()调用的random()函数,用于生成0-1之间的小数,注意,是random.random()

其实,random模块不仅仅局限于生成随机数,还有更多的应用场景:

从集合中随机选取元素:random.choice()

可以随机选取一个元素,自然可以随机选取多个元素。random中提供了choices()函数,注意,复数形式的,末尾多了个s,我们试着随机选取两个英雄进行组合双打:

多运行几次,可能会发现跟我们所想的不太一样。会发现选出来的两个英雄是重复的。其实choices()函数,本质上叫做有放回的取样,参数k是进行有放回取样的次数。如果要进行无放回的抽样,可以试试下面这个函数。

红球和白球,你猜会拿到哪一个:random.sample()

randm模块提供了更复杂的抽样函数,比如sample(),我们可以试着实现下小学数学中的抽样场景:

打乱、洗牌操作:random.shuffle()

随机操作中,还有另一类,叫做打乱或者洗牌的操作,用于随机确定一个排序。比如,还是上面的那些英雄,我们现在随机决定他们的出战顺序:

同样需要注意一下,关于shuffle()的定义说明。shuffle的洗牌操作,是在集合原地进行的(in place),所以该函数无需返回值,即返回None,操作之后,原来的集合中元素的顺序已经被打乱。

random模块中还有很多其他相对更加专业的统计学的函数,这里就不再一一介绍了,只需要了解以上几个函数,就基本够用了。

在上面的示例中,涉及到了Python中for循环的使用,以及f-string的语法,这两块比较简单,如果是一个Python新手小白,可以自行百度,或者借助ChatGPT学习一下,很简单的。很多时候,语法就是这样规定的,能理解就尽量理解,理解不了的时候,多用用,习惯了就好。

此外,关于查看内置模块相关函数的定义与用法,可以在PyCharm中,将鼠标悬停在模块的导入语句的random,或者某个函数,比如random.shuffle()上,然后,Mac中,按下Command键的同时,按下鼠标左键,即可打开模块的定义,并跳转到对应的函数定义所在行。

测试数据的批量生成使用random模块

通过random模块,我们勉强实现了批量生成1000个用户的测试数据,只包含了用户id、姓名、性别、出生年份。有些瑕疵,不过勉强能用了。

通过三方模块,可以更方便地实现。

使用Faker模块,实现测试数据生成

测试数据的输出:

这里只是举个例子大概看一下,由于篇幅的限制,下一篇文章再来详细介绍一下三方模块Faker的安装与使用。

0 阅读:9