一、随机整数生成类
#思路一:普通类实现,By me
import random
from matplotlib import pyplot as plt
class RandomNum:
def __init__(self,num,start=1,end=10):
self.num=num
self.start=start
self.end=end
def produce(self):
return [random.randint(self.start,self.end) for _ in range(self.num)]
l=RandomNum(20).produce()
print(l)
def coordinate(src):
for i in range(10):
x,y=src[i],src[-i-1]
plt.scatter(x,y)
plt.show()
coordinate(l)
可以认为生成一批随机数是一个工具,只是放在一个模块下一起管理,就像math模块一样;工具类简单调用就能出结果;以下为该思路的代码,也可改为@staticmethod,行参去掉cls即可,只要配好缺省值调用起来更方便,不用传参就可保证函数调用正常工作。
类方法、静态方法更像工具,不需实例即可工作。
#思路二:用工具类实现
class RandomNum:
@classmethod
def produce(cls,start=1,stop=10,patch=10):
return [random.randint(start,stop) for _ in range(self.patch)]
result=RandomNum.produce()
print(result)
生成器的取名最好以iter开头,方便使用方理解;生成器版本如下:
#思路三:生成器实现1
import random
class RandomGenerator:
def __init__(self,start=1,stop=100,patch=10):
self.start=start
self.stop=stop
self.patch=patch
self._gen=self._generate()
def _generate(self): #一次产生一个数据,不给看、不给调用
while True:
yield random.randint(self.start,self.stop)
def generate(self,count=0): #给用户使用,并自行决定一次产生多少个数字
patch=self.patch if count<=0 else count
return [next(self._gen) for _ in range(patch)]
# 注意:next(self._generate())这种写法每次都调用一次生成器、取其第一个随机数,不如先让 g=self._generate(),再写成next(g);或者在__init__中, self._gen=self._generate(),因为_generate()很早就定义好,实例化之后初始化,且在self.start=start、self.stop=stop、self.patch=patch之后再做self._gen=self._generate(),调用这个生成器对象,实例直接调用
a=RandomGenerator()
print(a.generate())
print(a.generate(5))
#思路四:生成器实现2,一次yield一批数据,而不是一次yield一个、攒一批
import random
class RandomGenerator:
def __init__(self,start=1,stop=100,patch=10):
self.start=start
self.stop=stop
self.patch=patch
self._ge