Week 7: 类的封装习题、二分法插入

一、随机整数生成类

#思路一:普通类实现,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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值