文档章节

纯python代码实现一个range函数

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 427
阅读 3
收藏 0

源代码:

class MyRange:

    def __init__(self, start, stop=None, step=None):

        # 模拟range从0开始的行为
        if stop is None:
            self.start = 0
            self.stop = start - 1
        else:
            self.start = start
            self.stop = stop - 1

        self.step = step

        # 保留原始参数
        self.origin_start = self.start
        self.origin_stop = self.stop + 1
        self.origin_step = self.step

    def __repr__(self):
        """
        :return: 显示表现
        """
        if self.origin_step:
            result = '{}({}, {}, {})'.format(
                self.__class__.__name__,
                self.origin_start,
                self.origin_stop,
                self.origin_step
            )
        else:
            result = '{}({}, {})'.format(
                self.__class__.__name__,
                self.origin_start,
                self.origin_stop
            )
        return result

    def __iter__(self):
        return self

    def __next__(self):
        """
        :return: 返回当前数字,然后在当前数字上+1
        """
        result = self.start
        if self.start <= self.stop:
            self.start += 1
        else:
            raise StopIteration

        return result

    def __getitem__(self, item):
        """
        :param item: 如果是单个数字, 那么item的类型将会是int,
                      如果是分片那么item将会是一个slice.
        :return: 返回分片结果
        """

        def is_index_error(_start):
            if _start > self.stop:
                raise IndexError('分片不得大于最大值.')

        if isinstance(item, int):
            result = self.origin_start + item
            is_index_error(result)
        elif isinstance(item, slice):
            start = self.origin_start + item.start
            stop = self.origin_start + item.stop
            list(map(is_index_error, MyRange(start, stop)))
            result = MyRange(start, stop)
        else:
            raise KeyError

        return result

 
 

打印类对象信息

print(range(10), MyRange(10), sep=' ' * 10)
print(range(10, 20), MyRange(10, 20), sep=' ' * 10)

# 显示结果
range(0, 10)          MyRange(0, 10)
range(10, 20)          MyRange(10, 20)

 
 

打印单个分片信息

print(range(10)[4], MyRange(10)[4], sep=' ' * 10)
# 显示结果
4          4

 
 

打印一组分片信息

print(range(10)[5:8], MyRange(10)[5:8], sep=' ' * 10)
# 显示结果
range(5, 8)          MyRange(5, 8)

 
 

循环迭代

for i in range(10):
    print('range: ', i)

print('\n')

for i in MyRange(10):
    print('MyRange: ', i)

# 显示结果
range:  0
range:  1
range:  2
range:  3
range:  4
range:  5
range:  6
range:  7
range:  8
range:  9


MyRange:  0
MyRange:  1
MyRange:  2
MyRange:  3
MyRange:  4
MyRange:  5
MyRange:  6
MyRange:  7
MyRange:  8
MyRange:  9

 
 

异常处理

s = MyRange(10)
print(s[15])

# 显示结果
Traceback (most recent call last):
    File "XXXXXXXX.py", line 117, in <module>
    File "XXXXXXXX.py", line 69, in __getitem__
    File "XXXXXXXX.py", line 65, in is_index_error
IndexError: 分片不得大于最大值.

本文转载自:http://www.jianshu.com/p/2eb42ad6bbd9

共有 人打赏支持
AllenOR灵感
粉丝 10
博文 2634
码字总数 82983
作品 0
程序员
Python常见经典 python中if __name__ == '__main__': 的解析

http://www.cnblogs.com/zhouxiansheng/p/3929247.html python中if name == 'main': 的解析 当你打开一个.py文件时,经常会在代码的最下面看到if name == 'main':,现在就来介 绍一下它的作用....

搬砖小哥
2017/11/02
0
0
老司机都开火箭了!Cython 助力 Python NLP 实现百倍加速

雷锋网 AI 研习社按:本文的作者是来自 Hugging face 的科学家 Thomas Wolf,他的研究方向包括机器学习、自然语言处理和深度学习。在这篇博客中,他介绍了如何利用 Cython 和 spaCy 让 Pyth...

隔壁王大喵
06/26
0
0
Python编程规范及性能优化

Python编程规范及性能优化 Ptyhon编程规范 编码 所有的 Python 脚本文件都应在文件头标上 # -- coding:utf-8 -- 。设置编辑器,默认保存为 utf-8 格式。 注释 业界普遍认同 Python 的注释分为...

陶邦仁
2013/01/16
0
1
python2.x和python3.x的区别

Python的3.0版本,常被称为Python3000,或简称Py3k。相对于Python的早期版本,这是一个较大的升级。 为了不带入过多的累赘,Python3.0在设计的时候没有考虑向下相容。许多针对早期Python版本...

leejia1989
06/26
0
0
Supporting Python 3(支持python3)——语言区别和暂时解决方法

语言区别和暂时解决方法 这个附录包含一个Python 2和Python 3的不同之处列表以及能不用2to3转换同时在Python 2和Python 3下运行的示例代码。 这个列表是不完整的。在这里列出的只有不包括bug...

在湖闻樟
2015/11/20
0
0

没有更多内容

加载失败,请刷新页面

加载更多

利用碎片化时间Get Linux系统

起初,我做着一份与IT毫无关系的工作,每月领着可怜的工资,一直想改变现状,但无从下手,也就是大家熟知的迷茫。我相信,每一个人都会或多或少的经历过迷茫,迷茫每一个选择,迷茫工作或者生...

linuxprobe16
今天
5
0
OSChina 周日乱弹 —— 恨不得给你买张飞机挂票

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @开源中国首席灵魂师:分享张希/曹方的单曲《认真地老去》 来不及认真的年轻过,就认真的老去! 《认真地老去》- 张希/曹方 手机党少年们想听...

小小编辑
今天
281
6
如何实现靠谱的分布式锁?

分布式锁,是用来控制分布式系统中互斥访问共享资源的一种手段,从而避免并行导致的结果不可控。基本的实现原理和单进程锁是一致的,通过一个共享标识来确定唯一性,对共享标识进行修改时能够...

郑加威
今天
3
0
Mac OS X下Maven的安装与配置

Mac OS X 安装Maven: 下载 Maven, 并解压到某个目录。例如/Users/robbie/apache-maven-3.3.3 打开Terminal,输入以下命令,设置Maven classpath $ vi ~/.bash_profile 添加下列两行代码,之后...

TonyStarkSir
今天
5
0
关于编程,你的练习是不是有效的?

最近由于工作及Solution项目的影响,我在重新学习DDD和领域建模的一些知识。然后,我突然就想到了这个问题,以及我是怎么做的? 对于我来说,提升技能的项目会有四种: 纯兴趣驱动的项目。即...

问题终结者
今天
15
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部