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

引言

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

  • 数据的输入

  • 数据的处理

  • 数据的输出

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

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

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

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

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

关于random的使用

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

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

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

# 生成100个[1,100]的随机整数
for i in range(100):
    print(f"{i} -- {random.randint(1, 20)}")

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

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

# 生成100个[1,100]的随机整数
for i in range(100):
    print(f"{i} -- {random.uniform(1, 20)}")

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

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

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

# 我们有一个英雄列表,接下来我们随机选取英雄出战
heros = ['刘备', '关羽', '张飞', '赵云', '诸葛亮']
print(random.choice(heros))

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

import random

# 我们有一个英雄列表,接下来我们随机选取英雄出战
heros = ['刘备', '关羽', '张飞', '赵云', '诸葛亮']
print(random.choices(heros, k=2))

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

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

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

import random

# 一个箱子中有4个红球和2个白球,进行无放回抽样,取两次,分别会取到什么球
print(random.sample(['红球', '白球'], counts=[4, 2], k=2))
打乱、洗牌操作:random.shuffle()

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

import random

# 我们有一个英雄列表,接下来我们随机确定出战顺序
heros = ['刘备', '关羽', '张飞', '赵云', '诸葛亮']
random.shuffle(heros)
print(heros)

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

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

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

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

测试数据的批量生成

使用random模块
import random

# 生成1000个用户信息,包含以下字段:
#   自增的用户id
#   用户姓名
#   用户性别(0,1,2分别表示男、女、未知)
#   出生年份

for i in range(1000):
    user_id = i + 1
    name = random.choice(['张三', '李四', '王五']) + str(i)
    gender = random.choice([0, 1, 2])
    birth_year = random.randint(1980, 2024)
    print(f"用户信息: {user_id} # {name} # {['男', '女', '未知'][gender]} # {birth_year}")

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

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

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

fk = Faker('zh_CN')
# 生成1000个用户信息,包含以下字段:
#   自增的用户id
#   用户姓名
#   用户性别
#   出生日期
#   城市
#   邮箱
#   手机号

for i in range(1000):
    user_id = i + 1
    name = fk.name()
    birthday = fk.date()
    city = fk.city()
    email = fk.email()
    phone = fk.phone_number()
    gender = fk.passport_gender()
    print(f"用户信息: {user_id} # {name} # {gender} # {birthday} # {email} # {phone}")

测试数据的输出:

用户信息: 1 # 郭林 # M # 2003-07-06 # fanping@example.net # 13575738051
用户信息: 2 # 刘雪 # M # 2021-08-01 # liangyong@example.com # 13660396454
用户信息: 3 # 邱洁 # M # 1973-02-26 # chao75@example.net # 18020890547
用户信息: 4 # 丁春梅 # F # 1971-03-09 # mmo@example.org # 15773411070
用户信息: 5 # 李宇 # F # 1981-05-02 # maming@example.net # 13453016015
用户信息: 6 # 沈俊 # F # 1980-10-15 # yongfu@example.com # 14510097053
用户信息: 7 # 吴桂芝 # M # 2005-12-31 # xiapan@example.com # 15614444748
用户信息: 8 # 胡倩 # F # 1979-02-13 # zhongxia@example.net # 13523359151
用户信息: 9 # 陈洋 # F # 2014-04-08 # gang25@example.com # 18043816456

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

  • 12
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

南宫理的日知录

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值