如何实现 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为切片后剩下的 ...
随机推荐
- (数据科学学习手札131)pandas中的常用字符串处理方法总结
本文示例代码及文件已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 在日常开展数据分析的过程中,我们经常需要对 ...
- 第十四章 kubernetes 核心技术-调度器
一.概述 一个容器平台的主要功能就是为容器分配运行时所需要的计算,存储和网络资源.容器调 度系统负责选择在最合适的主机上启动容器,并且将它们关联起来.它必须能够自动的处 理容器故障并且能够在更多的主机 ...
- Ubuntu 18.04.5 LTS Ceph集群之 cephx 认证及使用普通用户挂载RBD和CephFS
1.cephx认证和授权 1.1 CephX认证机制 Ceph使用cephx协议对客户端进行身份认证: 1.每个MON都可以对客户端进行身份验正并分发密钥, 不存在单点故障和性能瓶颈 2. MON会返 ...
- vue使用axios读取本地json文件来显示echarts折线图
编辑器:HBuilderx axios文档:http://www.axios-js.com/zh-cn/docs/ echarts实例:https://echarts.apache.org/examp ...
- 【NOI导刊200908模拟试题02 题4】【二分+Dijkstra】 收费站
Description 在某个遥远的国家里,有n个城市.编号外1,2,3,-,n. 这个国家的政府修建了m条双向的通路.每条公路连接着两个城市.沿着某条公路,开车从一个城市到另一个城市,需要花费一定的 ...
- nginx 文件目录页面
开启文件目录 server { listen 80; #设置自己静态目录的访问域名 server_name xxx.xxxx.com; #防止页面中文乱码一定要在utf-8前面加上gbk,顺序很重要 ...
- eclipse不自动弹出提示的解决办法(eclipse alt+/快捷键失效)
转载:http://yuncode.net/article/a_53bf6888b6f5065 我的问题:在jsp中使用"alt+/"不能够自动导入java包.利用3,4解决问题 ...
- ZooKeeper 04 - ZooKeeper 集群的节点为什么必须是奇数个
目录 1 - 关于节点个数的说明 2 - ZooKeeper 集群的容错数 3 - ZooKeeper 集群可用的标准 4 - 为什么不能是偶数个节点 4.1 防止由脑裂造成的集群不可用 4.2 奇数 ...
- 点击下拉选择触发事件【c#】
<asp:DropDownList ID="ddlRegionList" runat="server" AutoPostBack="true&q ...
- 在C++的map类型中按value排序
1.将map转化为vector类型 2.使用sort函数对vector进行排序,写出compare比较器函数 3.比较器中指明按照第几个元素来排序 1 #include <iostream> ...