关于 range 函数

Python内置的range函数可以接收三个参数:


class range(stop):
... class range(start, stop[, step]):
...

标准库中解释为:range 构造器的参数必须为整数(可以是内置的 int 或任何实现了 __index__ 特殊方法的对象)。如果省略 step 参数,其默认值为 1;如果省略 start 参数,其默认值为 0,如果 step 为零则会引发 ValueError

range 的使用

range 函数返回的结果会包含 start 参数,而不包含 stop 参数,当接收到的参数只有 1 位时,range 会把这位参数作为 stop,当接受到的参数有 2 位时,则第 2 位参数会被视为 stop,只有当接收 3 位参数时,默认的 step 才会被传入的参数代替,也就是说,如果我们需要 0 到 5 之间的数字,每隔 2 个整数返回,那么第一个参数 start 就算为 0,也必须显示的指定才行,否则传入的 2 个参数将被视为 startstop,示例:

>>> list(range(0, 5, 2))
[0, 2, 4]
>>> list(range(5, 2))
[]

那么,按照 Python 定义函数的方式,这是怎么实现的呢?

range 参数的实现

很明显,如果在 Python 中定义一个函数,要让第二个参数为固定参数,第一和第三个参数为默认参数是会引发语法错误的:

>>> def range(start=0, stop, step=1):
>>> pass
File "<ipython-input-23-876b8b222e30>", line 1
def range(start=0, stop, step=1):
^
SyntaxError: non-default argument follows default argument

那么怎样才能用 Python 实现这样的操作呢,有两种方法可以参考:

1. 定义可变参数

判断传入参数的个数,如果是一个则作为 stop 参数,如果是两个则将第 1 个作为 start 参数,同 range 一样,该方法不接受关键字参数的传入,示例:

def range(*params):
if 3 < len(params) < 1:
raise ValueError('range takes 1 - 3 arguments')
elif len(params) == 1
b = params[0]
else:
a, b = params[:2]
c = params[2] if len(params) > 2 else 1

2. 交换参数

设置 stopstep 的默认值,该方法可以接收关键字参数的传入。示例:

def range(start, stop=None, step=1):
if stop is None:
start, stop = 0, start

最新文章

  1. CString用法小结《转载》
  2. 我的Android第五章:通过Intent实现活动与活动之间的交互
  3. 重构Web Api程序(Api Controller和Entity) 续篇(2)
  4. 递归算法(二)&mdash;&mdash;前缀转后缀
  5. paip.微信菜单直接跳转url和获取openid流程总结
  6. Android SQLite的ORM接口实现(一)---findAll和find的实现
  7. Centos 如何安装Django环境
  8. MySQL- 锁(3)
  9. 华为OJ平台——整数的二进制中1的个数
  10. linux 操作
  11. 遵守GPL的开源软件能用于商用吗?
  12. ***php 数组添加关联元素的方法小结(关联数组添加元素)
  13. 【HDU 1828】 Picture (矩阵周长并,线段树,扫描法)
  14. Coach(并查集)
  15. Android使用Linux mount获取SdCard存储文件夹
  16. 【Java&amp;amp;Android开源库代码分析】のandroid-async-http の开盘
  17. C语言连接Oracle
  18. Python笔记&#183;第十一章—— 函数 (二) 装饰器
  19. Linux 安装及配置 Nginx + ftp 服务器
  20. 《android开发艺术探索》读书笔记(三)--分发机制和滑动冲突

热门文章

  1. 设计模式学习-使用go实现模板模式
  2. 青龙+Nvjdc短信登陆对接Xdd-plus推送+Ninja CK登陆教程(11.23更新)
  3. 千呼万唤,web人脸识别登录完整版来了,这样式我爱了
  4. k8s-Pod污点与容忍
  5. Codeforces 587D - Duff in Mafia(2-SAT+前后缀优化建图)
  6. Atcoder Grand Contest 013 E - Placing Squares(组合意义转化+矩阵快速幂/代数推导,思维题)
  7. JSOI2021 游记
  8. 远程登录Linux系统及上传下载文件
  9. 44-Count and Say
  10. JavaScript | 新手村(一)变量,运算和变量方法