文档章节

纯python代码实现一个range函数

AllenOR灵感
 AllenOR灵感
发布于 2017/09/10 01:18
字数 427
阅读 2
收藏 0
点赞 0
评论 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
博文 2139
码字总数 82983
作品 0
程序员
python2.x和python3.x的区别

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

leejia1989 ⋅ 05/30 ⋅ 0

你想要的Python面试都在这里了【315+道题】

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

p柯西 ⋅ 06/12 ⋅ 0

Python基础面试题80问 Python自动化开发

为什么学习Python? 2. 通过什么途径学习的Python? 3. Python和Java、PHP、C、C#、C++等其他语言的对比? 4. 简述解释型和编译型编程语言? 5. Python解释器种类以及特点? 6. 位和字节的关...

zhouzhou2018 ⋅ 05/24 ⋅ 0

请教operesty如何加载python包

我目前遇到一个项目有部分算法代码是使用python实现的,而我的服务框架代码是使用openresty来实现的,现在要实现在openresty里面调用python脚本。 纯lua脚本可以实现了: py = require “pyt...

子悠 ⋅ 06/18 ⋅ 0

python有趣用法汇总(持续更新)

使用python过程中经常会不经意间遇到非常有趣的用法,于是特意搜集了一些 有趣的用法 1.for-else用法 循环正常结束则执行else语句。一般用于循环找符合条件的元素,如果找到则调出循环,不会...

p柯西 ⋅ 06/05 ⋅ 0

python3.x与python2.x的区别汇总

python3.x与python2.7.x都是比较流行的版本,虽然建议现在的初学者开始学习python3.x的版本,但是还有很多的工程使用的是python2.7.x版本。观看代码的时候难免会出现一些问题。 在google上搜...

oldpan ⋅ 2017/10/10 ⋅ 0

最新阿里巴巴面试题(附带面试标准答案)

在上一节中,我们已经介绍了关于阿里巴巴的任职要求,这节我就详细的介绍一下关于阿里巴巴的面试题(涉及到标准代码部分不予以出现,如果想要可以加群:725479218,里面可以进行技术分享、技术...

柯西带你学编程 ⋅ 06/02 ⋅ 0

16道Python经典面试题及答案

1.Python是如何进行内存管理的? 答:从三个方面来说,一对象的引用计数机制,二垃圾回收机制,三内存池机制 一、对象的引用计数机制 Python内部使用引用计数,来保持追踪内存中的对象,所有对象...

阿豪boy ⋅ 05/17 ⋅ 0

Python 2 和 Python 3 主要区别有哪些(一)?

Guido(Python之父,仁慈的独裁者)在设计 Python3 的过程中,受一篇文章 “Python warts” 的影响,决定不向后兼容,否则无法修复大多数缺陷。---摘录自《流畅的Python》 你可能从来没有听说...

liuzhijun ⋅ 2017/08/02 ⋅ 0

人人都能学会的python编程教程4:关系运算符与循环

关系运算符 if 语句 实际应用中的程序,大多不是一撮而就的,而是根据条件不同存在很多分支。 最基本的条件分支结构是if...else...语句即如果。。。否则。。。 在python当中,if condition1...

编程老司机 ⋅ 05/10 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

JPA入门,配置文件的设置

<?xml version="1.0" encoding="UTF-8"?> <persistence xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http......

码农屌丝 ⋅ 19分钟前 ⋅ 0

Java基础——面向对象和构造器

声明:本栏目所使用的素材都是凯哥学堂VIP学员所写,学员有权匿名,对文章有最终解释权;凯哥学堂旨在促进VIP学员互相学习的基础上公开笔记。 静态成员介绍 为什么要有静态成员?静态成员用来...

凯哥学堂 ⋅ 21分钟前 ⋅ 0

vmware中Centos 7 linux的LVM磁盘扩容

系统是RHEL7(centos7差不多一样) 关闭系统,在vmware、设置、硬盘、扩展、输入数字大于当前系统内存、点击扩展。 开机再查看磁盘信息 fdisk -l 注意:可以看出sda磁盘增加了,但是根目录还...

gugudu ⋅ 32分钟前 ⋅ 0

JAVA线程sleep和wait方法区别

昨天面试,突然被问到sleep 和 wait的区别,一下子有点蒙,在这里记一下,以示警戒。 首先说sleep,sleep就是正在执行的线程主动让出cpu,cpu去执行其他线程,在sleep指定的时间过去后,cpu...

徐玉强 ⋅ 33分钟前 ⋅ 0

vuex学习--模块

随着项目复杂性增加,共享状态也越来越多。需要对转态操作进行分组,分组后在进行分组编写。学习一下module:状态管理器的模块组操作。 首先是声明: const moduleA={ state,mutations,g...

大美琴 ⋅ 36分钟前 ⋅ 0

Selenium 简单入门

安装 pip install selenium 驱动下载 https://chromedriver.storage.googleapis.com/index.html 下载最新的驱动,放入path中,可以放入Python的scripts目录下,也可以放入Chrome安装目录,并...

阿豪boy ⋅ 37分钟前 ⋅ 0

292. Nim Game - LeetCode

Question 292. Nim Game Solution 思路:试着列举一下,就能发现一个n只要不是4的倍数,就能赢。 n 是否能赢1 true2 true3 true4 false 不论删除几,对方都能一把赢5 t...

yysue ⋅ 今天 ⋅ 0

6.5 zip压缩工具 6.6 tar打包 6.7 打包并压缩

zip压缩工具 zip命令可以压缩目录和文件,-r 压缩目录。 zip使用方法 zip 1.txt.zip 1.txt //压缩文件 zip -r 123.zip 123/ //压缩目录 unzip 1.txt.zip //解压 unzip 123.zip -d /root/456...

Linux_老吴 ⋅ 今天 ⋅ 0

react-loadable使用跳坑

官方给react-loadable的定义是: A higher order component for loading components with dynamic imports. 动态路由示例 withLoadable.js import React from 'react'import Loadable fro......

pengqinmm ⋅ 今天 ⋅ 0

记录工作中遇到的坑

1、ios safari浏览器向下滚动会触发window resize事件

端木遗风 ⋅ 今天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部