如何理解Python中range/range()的多种归类及对应术语判断规则
先纠正讲师的错误说法,理清
range的真实身份 那个讲师提到的四个称呼里三个都是错的,不用记:
- 不是关键字:Python的关键字是
if、for、class这种预留的、不能拿来当变量名的词,你完全可以写range = 1不会报错(当然不推荐这么写),所以显然不是关键字 - 不是运算符:运算符是
+、-、==这种符号型的操作工具,和range完全不沾边 - 不是生成器:生成器只能迭代一次,也不支持索引取值,你可以试试
r = range(10),迭代完一次还能再迭代,也能直接写r[3]取第四个元素,生成器根本做不到,所以肯定不是生成器 - 叫它函数属于入门级的不严谨表述:你写
range(0,10,1)的时候确实是像调用函数一样用它,很多入门教程会把所有带括号调用的可调用对象都叫函数,不算原则性错误,但它本质是range序列类型的构造类,和list()、str()的定位是一样的
你说的它属于序列类型、是对象完全正确:Python里所有你能接触到的东西,不管是变量、函数、类还是别的,全都是对象,所以“是对象”是所有Python实体的通用属性,没毛病。
判断Python实体分类的通用方法
不用背什么复杂的图表或者定义体系,三个内置工具就能搞定所有分类判断:
- 查本质类型用
type():比如输入type(range)会返回<class 'type'>,说明range本身是个类;输入type(range(0,10))返回<class 'range'>,说明调用后得到的是range类的实例 - 查所属分类/实现的接口用
isinstance():比如想知道range实例是不是序列,就写isinstance(range(10), collections.abc.Sequence),返回True就说明属于序列分类;想知道是不是可迭代的,就把第二个参数换成collections.abc.Iterable就行。collections.abc模块里放了Python官方定义的所有抽象接口分类,所有你能想到的分类比如可调用、映射、集合都能在这里找到对应的判断类 - 查能不能被调用用
callable():比如callable(range)返回True,说明它可以被调用,这也是为什么很多人会把它当函数叫的原因
Python的分类逻辑本身就和你说的“人同时是加拿大人和丈夫”是一个逻辑:所有东西最顶层都是object,然后它的type返回的结果是它的核心身份,它实现了多少种接口,就有多少个对应的分类身份,完全不冲突。入门阶段不用死记硬背所有术语,需要的时候用上面三个方法查就行,用多了自然就记住常见的分类了。
内容的提问来源于stack exchange,提问作者Mark Featherstone
相关产品推荐
相关产品推荐

