文档章节

纯python代码实现一个range函数

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 427
阅读 4
收藏 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

共有 人打赏支持
上一篇: redis02字符串
AllenOR灵感
粉丝 11
博文 2635
码字总数 83001
作品 0
程序员
私信 提问
老司机都开火箭了!Cython 助力 Python NLP 实现百倍加速

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

隔壁王大喵
06/26
0
0
Cython 三分钟入门

作者:perrygeo 译者:赖勇浩(http://laiyonghao.com) 原文:http://www.perrygeo.net/wordpress/?p=116 我最喜欢的是Python,它的代码优雅而实用,可惜纯粹从速度上来看它比大多数语言都要...

鉴客
2012/02/23
8.7K
4
Python, C-Python, Cython代码与GIL的交互

这篇笔记相对Python来说,有点底层,先来解释几个名词: C-Python: 或者CPython,指C实现的Python虚拟机的基础API。最通用的Python就是是基于C实现的,它的底层API称为C-Python API,所有Pyt...

鉴客
2012/02/23
4K
0
你想要的Python面试都在这里了【315+道题】

写在前面 近日恰逢学生临近毕业,课程后期大家“期待+苦逼”的时刻莫过于每天早上内容回顾和面试题问答部分【临近毕业每天课前用40-60分钟对之前内容回顾、提问和补充,专挑班里不爱说话就的...

p柯西
06/12
0
0
学习笔记(10月25日)--python的if、while、for语法

二周三次课(10月25日) 1.学习python特殊的缩进和语法 python的缩进和冒号 python之所以如此简单,归功于他的缩进机制,严格的缩进机制使得代码非常整齐规范,赏心悦目,提高了可读性,在一...

wanyang_wanyang
07/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

《告诉你真实的美国教育》的读后感3900字

《告诉你真实的美国教育》的读后感3900字: 文章的开篇分析了我们耳熟能详的关于美国教育的小故事,就是那个因为幼儿园的老师教了“0”这个字母,然后妈妈告老师剥夺了孩子的想象力,再然后幼...

原创小博客
20分钟前
0
0
Terraform配置文件(Terraform configuration)

Terraform配置文件 翻译自Terraform Configuration Terraform用文本文件来描述设备、设置变量。这些文件被称为Terraform配置文件,以.tf结尾。这一部分将讲述Terraform配置文件的加载与格式。...

buddie
36分钟前
1
0
exportfs命令, vsftp搭建ftp服务

exportfs命令 当修改/etc/exports文件后,更改的内容是不会立即生效的。如果重启nfs服务,会导致客户端重启期间的请求是挂起等待的,可以把客户端的挂载umount进行卸载后,再重启nfs服务,但...

野雪球
46分钟前
1
0
编程价值观、原则、模式

读自《实现模式》 模式,即是针对特定问题的通用解决方案。 每个模式都承载这一点点理论,但实际编程中存在着一些更加深远的影响力,远不是孤立的模式所能概括的。 价值观是编程过程的统一支...

遥借东风
今天
2
0
php分割二级域名做跳转处理方法

使用php中的全局变量 $_SERVER['HTTP_HOST'] ,可以获得用户当前访问的域名字符串,在这里面查询自己定义的各个子域名字符串,然后使用header函数重定向到不同的页面 代码如下 if( strpos($...

Mr_Azaz
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部