如何实现 range 函数的参数?
关于 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 个参数将被视为 start 和 stop,示例:
>>> 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. 交换参数
设置 stop 和 step 的默认值,该方法可以接收关键字参数的传入。示例:
def range(start, stop=None, step=1):
if stop is None:
start, stop = 0, start
如何实现 range 函数的参数?的更多相关文章
- for循环&len函数和range函数的运用
函数:len() 作用:返回字符串.列表.字典.元组等长度 语法:len(str) 参数: str:要计算的字符串.列表.字典.元组等 返回值:字符串.列表.字典.元组等元素的长度 实例 1.计算字 ...
- Python3学习(一)-基础、数据类型、变量、字符串和编码、list&tuple、if、for、while、dict、set、函数与参数
##廖雪峰py3笔记 ## '//'这是获得相除后的整数部分 ##a = 10//3 ##print (a) ## '/'获得相除后的结果,为浮点数,结果能整除也也是浮点数 ##b = 10/3 ## ...
- python中xrange()和range()函数的区别使用:
1.range()函数: 函数说明:range([start,] stop[, step]),根据start与stop指定的范围以及step设定的步长,生成一个序列. >>> #ra ...
- 【转】Python函数默认参数陷阱
[转]Python函数默认参数陷阱 阅读目录 可变对象与不可变对象 函数默认参数陷阱 默认参数原理 避免 修饰器方法 扩展 参考 请看如下一段程序: def extend_list(v, li=[]) ...
- Python面试题目之Python函数默认参数陷阱
请看如下一段程序: def extend_list(v, li=[]): li.append(v) return li list1 = extend_list(10) list2 = extend_l ...
- range()函数
range()函数 函数说明: range(start, stop[, step]) -> range object,根据start与stop指定的范围以及step设定的步长,生成一个序列.参数 ...
- python之range()函数、for-in循环和while循环
range()函数和for-in循环 函数原型:range(start, end, scan): 参数含义:start:计数从start开始.默认是从0开始.例如range(5)等价于range(0, ...
- day10.函数,函数的参数
函数的思维导图: 老师的笔记 昨天内容概括 #组长:默写统一交给组长 #不建议看视频 #上课敲过的所有的例子 # 1.看一遍.看能不能看懂 # 2.给每一道题起一个名字或者一句描述 # 3.看着文字, ...
- 【python】序列切片和range函数
序列的每个元素都可以用2种索引的表达方式,一种是正数索引,另一种是负数索引. 序列切片,作用是访问序列中一定范围的元素,格式“序列名[A:B]”,其中A为所切片的第一个元素的索引号,而B为切片后剩下的 ...
随机推荐
- Json数据使用及学习方法
以前对json的了解并不是很清楚,因为使用很少,所以也没有特意的研究.只知道json是轻量级的数据交换格式,可以被多种语言方便的处理,也是大型门户站接口使用的主要数据格式. 而最近做了个项目,涉及到j ...
- 下一代的 3D Tiles 前瞻
下一代的 3D Tiles 前瞻 原文:Introducing 3D Tiles Next, Streaming Geospatial to the Metaverse 原文发布时间:2021年11月 ...
- LifseaOS 悄然来袭,一款为云原生而生的 OS
作者:黄韶宇.初扬 审核&校对:溪洋.海珠 编辑&排版:雯燕 LifseaOS 在刚刚过去的云栖大会上,一款新的 Linux Base 操作系统悄悄发布,它就是 LifseaOS(Li ...
- 洛谷 P6783 - [Ynoi2008] rrusq(KDT+势能均摊+根号平衡)
洛谷题面传送门 首先显然原问题严格强于区间数颜色,因此考虑将询问离线下来然后用某些根号级别复杂度的数据结构.按照数颜色题目的套路,我们肯定要对于每种颜色维护一个前驱 \(pre\),那么答案可写作 \ ...
- 如何使用scp在Linux服务器的后台传输文件?
目录 一.上传 常规操作 建议 后台运行 二.下载 两台服务器间文件如何传输?对于小文件,可以先从Linux服务器传到window,再传到另一台服务器.对于大的文件,如测序数据.比对文件等.这样的方法 ...
- MySQL_集群
管理节点:192.168.31.66 sql节点1+data1节点:192.168.31.42 sql节点2+data2节点:192.168.31.128 llll
- Python基础之基本运算符
目录 1. 算数运算符 2. 比较运算符 3. 赋值运算符 4. 逻辑运算符 5. 身份运算 6. 运算符优先级 1. 算数运算符 常用算术运算符使用方法如下: x = 5 y = 2 a = x + ...
- Python基础之流程控制for循环
目录 1. 语法 2. for+break 3. for+continue 4. for循环嵌套 1. 语法 while循环可以对任何内容循环,但循环次数不可控 for循环基于容器类型的长度,循环次数 ...
- 选择省份、选择省市区举例【c#】【js】
<style type="text/css"> .labelhide { -webkit-box-shadow: 0px 1px 0px 0px #f3f3f3 !im ...
- linux系统中安装JDK
安装之前的准备工作 查看系统中之前安装好的JDK java –version rpm -qa | grep java 卸载JDK (以java-1.7.0-openjdk-1.7.0.45-2.4.3 ...