Discuss / Python / range虽然叫函数,但实际上是个类,我没看源码自己重新实现了一遍

range虽然叫函数,但实际上是个类,我没看源码自己重新实现了一遍

Topic source

凡响skyline

#1 Created at ... [Delete] [Delete and Lock User]
class MyRange(object):
    """基本实现内置range的所有功能"""
    def __init__(self, *args: int):  # 提示建议为整型
        """初始化进行参数检查及绑定"""
        if len(args) == 0:
            # 至少要传一个参数
            raise TypeError('MyRange expected 1 arguments, got 0')
        elif len(args) > 3:
            # 最多只允许传3个参数
            raise TypeError(f'MyRange expected at most 3 arguments, got {len(args)}')
        for arg in args:
            # 若参数不是整型,则抛出类型错误
            if not isinstance(arg, int):
                raise TypeError(type(arg).__name__ + ' object cannot be interpreted as an integer')
        self.start = 0
        self.step = 1
        self.index = 0
        if len(args) == 1:
            # 若只有一个参数,则它就是数列末项的边界,且无法取到
            self.stop = args[0]
        elif len(args) >= 2:
            # 两个参数以上,则参数0是首项,参数1是末项的边界
            self.start = args[0]
            self.stop = args[1]
        if len(args) == 3:
            # 若有三个参数,则参数2为步长
            if args[2] == 0:
                # 步长不能为0
                raise ValueError('MyRange() arg 3 must not be zero')
            self.step = args[2]

    def __iter__(self):
        """重写__iter__方法,返回自身的迭代器对象"""
        return self

    def __next__(self):
        """重写__next__方法,每次调用返回通项公式计算出的项"""
        term = self.start + self.index * self.step
        # 首项为start、公差为step的等差数列通项公式
        # 共n项,首项下标为0,第n项下标为n-1
        if self.step > 0 and term < self.stop:
            self.index += 1
            return term
        elif self.step < 0 and term > self.stop:
            # 步长也就是公差为负时,每项的值逐级递减
            # 前一项大于后一项才有意义,stop是最后最小一项,且不能取到
            self.index += 1
            return term
        else:
            # 抛出StopIteration异常可以停止产生下一项
            raise StopIteration

  • 1

Reply